diff --git a/.env b/.env index 967c8711b..aec945268 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 VERSION=1.5.0 -VERSION_FULL=1.5.0 (215) -BUILD=215 +VERSION_FULL=1.5.0 (216) +BUILD=216 diff --git a/public/104.637ee92c4436d936af0a.chunk.js.map b/public/104.637ee92c4436d936af0a.chunk.js.map deleted file mode 100644 index d7c5690f0..000000000 --- a/public/104.637ee92c4436d936af0a.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"104.637ee92c4436d936af0a.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 \"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.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 \"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 \"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\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"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\t//\"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\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 \"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 \"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 \"PaymentSuccessfullyPaid\": \"You successfully transferred %1$s to %2$s for %3$s\",\n \"PaymentSuccessfullyPaidNoItem\": \"You successfully transferred %1$s to %2$s\",\n // \"PaymentSuccessfullyPaidRecurrent\": \"You successfully transferred %1$s to %2$s for %3$s and allowed future recurring payments\",\n // \"PaymentSuccessfullyPaidNoItemRecurrent\": \"You successfully transferred %1$s to %2$s and allowed future recurring payments\",\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\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.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.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.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 \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\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 \"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 \"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.SignMessages\": \"Sign Messages\",\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 \"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 \"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 \"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 \"UsernameSettings.ChangeDescription\": \"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\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.\",\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.637ee92c4436d936af0a.chunk.js b/public/104.6cbeda302cb4e61b3268.chunk.js similarity index 53% rename from public/104.637ee92c4436d936af0a.chunk.js rename to public/104.6cbeda302cb4e61b3268.chunk.js index 1e243f77f..04ae42914 100644 --- a/public/104.637ee92c4436d936af0a.chunk.js +++ b/public/104.6cbeda302cb4e61b3268.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","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.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"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","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",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",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"},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",PaymentSuccessfullyPaid:"You successfully transferred %1$s to %2$s for %3$s",PaymentSuccessfullyPaidNoItem:"You successfully transferred %1$s to %2$s",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?","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.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.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.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.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","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","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$@"',"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.SignMessages":"Sign Messages","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","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","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","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","UsernameSettings.ChangeDescription":"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\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.","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.637ee92c4436d936af0a.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","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.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"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","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",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",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"},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.","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.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.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.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.","Context.ViewStickerSet":"View Sticker Set","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","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","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.SignMessages":"Sign Messages","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","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","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","UsernameSettings.ChangeDescription":"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\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.","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.6cbeda302cb4e61b3268.chunk.js.map \ No newline at end of file diff --git a/public/104.6cbeda302cb4e61b3268.chunk.js.map b/public/104.6cbeda302cb4e61b3268.chunk.js.map new file mode 100644 index 000000000..009c033f4 --- /dev/null +++ b/public/104.6cbeda302cb4e61b3268.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"104.6cbeda302cb4e61b3268.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 '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.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 '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 '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\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 '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 '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\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.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.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.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 'Context.ViewStickerSet': 'View Sticker Set',\n 'CreateGroup.NameHolder': 'Group Name',\n 'Date.Today': 'Today',\n 'DeleteChat.DeleteGroupForAll': 'Delete for all members',\n 'DeleteChannelForAll': 'Delete for all subscribers',\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 '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.SignMessages': 'Sign Messages',\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 '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 '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 'UsernameSettings.ChangeDescription': '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\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.',\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/106.e317337dd2e7c9940c22.chunk.js b/public/106.6eb2d4df03e16a5c7742.chunk.js similarity index 63% rename from public/106.e317337dd2e7c9940c22.chunk.js rename to public/106.6eb2d4df03e16a5c7742.chunk.js index c72742957..82984d7a1 100644 --- a/public/106.e317337dd2e7c9940c22.chunk.js +++ b/public/106.6eb2d4df03e16a5c7742.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[106,810,392,53],{4489:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(503);class i extends a.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const a=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(a);const i=this.value.length;if(i===e.length)e.onFill(this.value);else if(i===n)return;n=i}))}}},3083:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(2384);class i{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 n=e.input;n.addEventListener("blur",(()=>{this.playAnimation(0)})),n.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.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),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([a.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(),a.Z.waitForFirstFrame(e)))),a.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.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.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),a.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(4755),i=n(4874),s=n(810),o=n(3083),r=n(4489),l=n(2325),d=n(144),h=n(5565),c=n(3512);let u,p=null,m=null,g=null;const v=new i.Z("page-authCode",!0,(()=>{const e=p.type.length,t=new r.Z({label:"Code",name:(0,d.a)(),length:e,onFill:e=>{m(e)}});u=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container),v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return s.default.mount()}));const i=()=>{setTimeout((()=>{b.remove()}),300)},m=e=>{u.setAttribute("disabled","true");const a={phone_number:p.phone_number,phone_code_hash:p.phone_code_hash,phone_code:e};c.Z.managers.apiManager.invokeApi("auth.signIn",a,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":c.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),i();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(765),n.e(339)]).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:p.phone_number,phone_code_hash:p.phone_code_hash})})),i()}})).catch((e=>{return a=void 0,i=void 0,o=function*(){let a=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":a=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{u.value=""}),300);break;case"PHONE_CODE_EXPIRED":u.classList.add("error"),(0,h.Z)(t.label,(0,l.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":u.classList.add("error"),(0,h.Z)(t.label,(0,l.ag)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}a||t.select(),u.removeAttribute("disabled")},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(n,r)}l((o=o.apply(a,i||[])).next())}));var a,i,s,o}))},g=v.pageEl.querySelector(".auth-image"),y=a.Z.isMobile?100:166,b=new o.Z(t,y);return g.append(b.container),b.load()}),(e=>{if(p=e,m){u.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),u.dispatchEvent(e)}else m=v.pageEl.getElementsByClassName("phone")[0],g=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(m.innerText=p.phone_number,p.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[p.type._]}(0,h.Z)(g,(0,l.ag)(t,n)),c.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{u.focus()})),y=v},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>P});var a=n(279),i=n(4874),s=n(9807),o=n(4494),r=n(5432),l=n(4159),d=n(2325),h=n(2384),c=n(1405),u=n(9709),p=n(9638),m=n(3910),g=n(2738),v=n(5565),y=n(1656),b=n(7487),_=n(2398),E=n(6669),Z=n(7922),f=n(3512),S=n(709),L=n(3789),k=n(5431);let w,A=null;const C=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const c=new k.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(P.value=P.lastValue="+"+n.country_code,setTimeout((()=>{x.focus(),(0,_.Z)(x,!0)}),0))}}),P=new S.Z({onInput:e=>{h.Z.loadLottieWorkers();const{country:n,code:a}=e||{};let s=n?n.name||n.default_name:"";s===c.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||c.override(n,a,s),n||P.value.length-1>1?A.style.visibility="":A.style.visibility="hidden"}}),x=P.input;x.addEventListener("keypress",(e=>{if(!A.style.visibility&&"Enter"===e.key)return T()}));const F=new s.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});F.input.addEventListener("change",(()=>{const e=F.checked;f.Z.managers.appStateManager.pushToState("keepSigned",e),L.Z.toggleStorages(e,!0)})),L.Z.getState().then((e=>{Z.Z.isAvailable()?F.checked=e.keepSigned:(F.checked=!1,F.label.classList.add("checkbox-disabled"))})),A=(0,o.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),A.style.visibility="hidden";const T=e=>{e&&(0,m.Z)(e);const t=(0,y.Z)([A,w],!0);(0,v.Z)(A,(0,d.ag)("PleaseWait")),(0,a.y)(A);let i=P.value;f.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:l.Z.id,api_hash:l.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(P.setError(),(0,v.Z)(P.label,(0,d.ag)("Login.PhoneLabelInvalid")),x.classList.add("error"),(0,v.Z)(A,(0,d.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),A.innerText=e.type)}))};(0,g.fc)(A,T),w=(0,o.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),w.addEventListener("click",(()=>{u.default.mount()})),e.append(c.container,P.container,F.label,A,w);const N=document.createElement("h4");N.classList.add("text-center"),(0,d.$d)(N,"Login.Title");const M=document.createElement("div");M.classList.add("subtitle","text-center"),(0,d.$d)(M,"Login.StartText"),C.pageEl.querySelector(".container").append(N,M,e),r.Z||setTimeout((()=>{x.focus()}),0),(0,p.Z)(e),f.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=Z.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&d.ZP.getLangPack(n.lang_code).then((()=>{(0,E.Z)(x,"input")}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let s;return e.nearest_dc!==e.this_dc&&(s=f.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(s||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,s=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield b.Z.get(a))return t();setTimeout((()=>{f.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function o(e){try{l(s.next(e))}catch(e){t(e)}}function r(e){try{l(s.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(o,r)}l((s=s.apply(n,a||[])).next())}));var n,a,i,s};t()})),e})).then((e=>{c.value.length||P.value.length||c.selectCountryByIso2(e.country)}))}),(()=>{A&&((0,v.Z)(A,(0,d.ag)("Login.Next")),(0,c.Z)(A,void 0,void 0,!0),A.removeAttribute("disabled")),w&&w.removeAttribute("disabled"),f.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),P=C}}]); -//# sourceMappingURL=106.e317337dd2e7c9940c22.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[106,810,392,53],{4489:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(503);class i extends a.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const a=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(a);const i=this.value.length;if(i===e.length)e.onFill(this.value);else if(i===n)return;n=i}))}}},3083:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(2384);class i{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 n=e.input;n.addEventListener("blur",(()=>{this.playAnimation(0)})),n.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.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),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([a.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(),a.Z.waitForFirstFrame(e)))),a.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.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.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),a.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(4755),i=n(4874),s=n(810),o=n(3083),r=n(4489),l=n(2325),d=n(144),h=n(5565),c=n(3512);let u,p=null,m=null,g=null;const v=new i.Z("page-authCode",!0,(()=>{const e=p.type.length,t=new r.Z({label:"Code",name:(0,d.a)(),length:e,onFill:e=>{m(e)}});u=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container),v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return s.default.mount()}));const i=()=>{setTimeout((()=>{b.remove()}),300)},m=e=>{u.setAttribute("disabled","true");const a={phone_number:p.phone_number,phone_code_hash:p.phone_code_hash,phone_code:e};c.Z.managers.apiManager.invokeApi("auth.signIn",a,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":c.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),i();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(765),n.e(339)]).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:p.phone_number,phone_code_hash:p.phone_code_hash})})),i()}})).catch((e=>{return a=void 0,i=void 0,o=function*(){let a=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":a=!0,e.handled=!0,yield(yield n.e(836).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{u.value=""}),300);break;case"PHONE_CODE_EXPIRED":u.classList.add("error"),(0,h.Z)(t.label,(0,l.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":u.classList.add("error"),(0,h.Z)(t.label,(0,l.ag)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}a||t.select(),u.removeAttribute("disabled")},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(n,r)}l((o=o.apply(a,i||[])).next())}));var a,i,s,o}))},g=v.pageEl.querySelector(".auth-image"),y=a.Z.isMobile?100:166,b=new o.Z(t,y);return g.append(b.container),b.load()}),(e=>{if(p=e,m){u.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),u.dispatchEvent(e)}else m=v.pageEl.getElementsByClassName("phone")[0],g=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(m.innerText=p.phone_number,p.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[p.type._]}(0,h.Z)(g,(0,l.ag)(t,n)),c.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{u.focus()})),y=v},810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>P});var a=n(279),i=n(4874),s=n(9807),o=n(4494),r=n(5432),l=n(4159),d=n(2325),h=n(2384),c=n(1405),u=n(9709),p=n(9638),m=n(3910),g=n(2738),v=n(5565),y=n(1656),b=n(7487),_=n(2398),E=n(6669),Z=n(7922),f=n(3512),S=n(709),L=n(3789),k=n(5431);let w,A=null;const C=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const c=new k.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(P.value=P.lastValue="+"+n.country_code,setTimeout((()=>{x.focus(),(0,_.Z)(x,!0)}),0))}}),P=new S.Z({onInput:e=>{h.Z.loadLottieWorkers();const{country:n,code:a}=e||{},s=n?n.name||n.default_name:"";s===c.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||c.override(n,a,s),n||P.value.length-1>1?A.style.visibility="":A.style.visibility="hidden"}}),x=P.input;x.addEventListener("keypress",(e=>{if(!A.style.visibility&&"Enter"===e.key)return T()}));const F=new s.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});F.input.addEventListener("change",(()=>{const e=F.checked;f.Z.managers.appStateManager.pushToState("keepSigned",e),L.Z.toggleStorages(e,!0)})),L.Z.getState().then((e=>{Z.Z.isAvailable()?F.checked=e.keepSigned:(F.checked=!1,F.label.classList.add("checkbox-disabled"))})),A=(0,o.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),A.style.visibility="hidden";const T=e=>{e&&(0,m.Z)(e);const t=(0,y.Z)([A,w],!0);(0,v.Z)(A,(0,d.ag)("PleaseWait")),(0,a.y)(A);const i=P.value;f.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:l.Z.id,api_hash:l.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(P.setError(),(0,v.Z)(P.label,(0,d.ag)("Login.PhoneLabelInvalid")),x.classList.add("error"),(0,v.Z)(A,(0,d.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),A.innerText=e.type)}))};(0,g.fc)(A,T),w=(0,o.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),w.addEventListener("click",(()=>{u.default.mount()})),e.append(c.container,P.container,F.label,A,w);const N=document.createElement("h4");N.classList.add("text-center"),(0,d.$d)(N,"Login.Title");const M=document.createElement("div");M.classList.add("subtitle","text-center"),(0,d.$d)(M,"Login.StartText"),C.pageEl.querySelector(".container").append(N,M,e),r.Z||setTimeout((()=>{x.focus()}),0),(0,p.Z)(e),f.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=Z.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&d.ZP.getLangPack(n.lang_code).then((()=>{(0,E.Z)(x,"input")}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let s;return e.nearest_dc!==e.this_dc&&(s=f.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(s||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,s=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield b.Z.get(a))return t();setTimeout((()=>{f.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function o(e){try{l(s.next(e))}catch(e){t(e)}}function r(e){try{l(s.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(o,r)}l((s=s.apply(n,a||[])).next())}));var n,a,i,s};t()})),e})).then((e=>{c.value.length||P.value.length||c.selectCountryByIso2(e.country)}))}),(()=>{A&&((0,v.Z)(A,(0,d.ag)("Login.Next")),(0,c.Z)(A,void 0,void 0,!0),A.removeAttribute("disabled")),w&&w.removeAttribute("disabled"),f.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),P=C}}]); +//# sourceMappingURL=106.6eb2d4df03e16a5c7742.chunk.js.map \ No newline at end of file diff --git a/public/106.6eb2d4df03e16a5c7742.chunk.js.map b/public/106.6eb2d4df03e16a5c7742.chunk.js.map new file mode 100644 index 000000000..6898608ee --- /dev/null +++ b/public/106.6eb2d4df03e16a5c7742.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"106.6eb2d4df03e16a5c7742.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/pages/pageAuthCode.ts","webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, {InputFieldOptions} from './inputField';\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n\r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n\r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n\r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from '../inputField';\r\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n\r\n frame = 0;\r\n }\r\n // animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n // console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n\r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n // animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n // console.log('enterFrame', currentFrame, needFrame);\r\n // let currentFrame = Math.round(e.currentTime);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n // animation.curFrame = 0;\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n // console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AuthSentCode, AuthSentCodeType, AuthSignIn} from '../layer';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport {randomLong} from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nconst onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n // console.log('invoking auth.signIn with params:', params);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n // console.log('auth.signIn response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n // console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then((m) => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n // console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp':\r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall':\r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from './page';\r\nimport InputField from '../components/inputField';\r\nimport CheckboxField from '../components/checkboxField';\r\nimport Button from '../components/button';\r\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport App from '../config/app';\r\nimport I18n, {_i18n, i18n} from '../lib/langPack';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport ripple from '../components/ripple';\r\nimport findUpTag from '../helpers/dom/findUpTag';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport {randomLong} from '../helpers/random';\r\nimport pageSignQR from './pageSignQR';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport {DcAuthKey} from '../types';\r\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\r\nimport {HelpCountry, HelpCountryCode} from '../layer';\r\nimport {getCountryEmoji} from '../vendor/emoji';\r\nimport simulateEvent from '../helpers/dom/dispatchEvent';\r\nimport stateStorage from '../lib/stateStorage';\r\nimport rootScope from '../lib/rootScope';\r\nimport TelInputField from '../components/telInputField';\r\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport CountryInputField from '../components/countryInputField';\r\n\r\n// import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nconst onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n\r\n console.log('Added test country to list!');\r\n } */\r\n\r\n // const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n const countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected ||\r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country &&\r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n countryInputField.override(country, code, countryName);\r\n }\r\n\r\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n // console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned',\r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n\r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n // return;\r\n\r\n const phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n // lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n // console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n const qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n const tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n\r\n g();\r\n });\r\n\r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n\r\n // console.log('woohoo', nearestDcResult, country);\r\n })// .catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","Promise","all","loop","autoplay","width","height","then","_animation","currentFrame","pause","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","sentCode","focus","btnQr","btnNext","inputWrapper","lastCountrySelected","lastCountryCodeSelected","countryInputField","onCountryChange","country","telInputField","lastValue","country_code","telEl","onInput","formatted","countryName","default_name","override","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","state","toggle","api_id","api_hash","settings","Object","assign","setError","console","error","h4","subtitle","nearestDcResult","langPack","countries","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","push","resolve","forEach","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined"],"sourceRoot":""} \ No newline at end of file diff --git a/public/106.e317337dd2e7c9940c22.chunk.js.map b/public/106.e317337dd2e7c9940c22.chunk.js.map deleted file mode 100644 index b3e96442e..000000000 --- a/public/106.e317337dd2e7c9940c22.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"106.e317337dd2e7c9940c22.chunk.js","mappings":"oIAQe,MAAMA,UAAuB,IAC1CC,YAAYC,GAIVC,MAAM,OAAD,QACHC,WAAW,GACRF,IAGL,MAAMG,EAAQC,KAAKD,MACnBA,EAAME,KAAO,MACbF,EAAMG,aAAa,WAAY,IAC/BH,EAAMI,aAAe,MAErB,IAAIC,EAAa,EACjBJ,KAAKD,MAAMM,iBAAiB,SAAUC,IACpCN,KAAKD,MAAMQ,UAAUC,OAAO,SAC5BR,KAAKS,WAEL,MAAMC,EAAQV,KAAKU,MAAMC,QAAQ,MAAO,IAAIC,MAAM,EAAGhB,EAAQiB,QAC7Db,KAAKc,iBAAiBJ,GAEtB,MAAMG,EAASb,KAAKU,MAAMG,OAC1B,GAAGA,IAAWjB,EAAQiB,OACpBjB,EAAQmB,OAAOf,KAAKU,YACf,GAAGG,IAAWT,EACnB,OAGFA,EAAaS,Q,8CC5BJ,MAAMG,EAWnBrB,YAAsBsB,EAAkCC,GAAlC,KAAAD,WAAAA,EAAkC,KAAAC,KAAAA,EAR9C,KAAAC,IAAM,GACN,KAAAC,UAAY,EAQpBpB,KAAKqB,UAAYC,SAASC,cAAc,OACxCvB,KAAKqB,UAAUd,UAAUiB,IAAI,yBAE7B,MAAMzB,EAAQkB,EAAWlB,MAEzBA,EAAMM,iBAAiB,QAAQ,KAC7BL,KAAKyB,cAAc,MAGrB1B,EAAMM,iBAAiB,SAAUC,IAC/BN,KAAKyB,cAAcR,EAAWP,MAAMG,WAUjCY,cAAcZ,GACnB,IAAIb,KAAK0B,UAAW,OAGpB,IAAIC,GADJd,EAASe,KAAKC,IAAIhB,EAAQ,MAGxBc,EAAQC,KAAKE,MAAMF,KAAKC,IAAI7B,KAAKmB,IAAKN,IAAW,IAAMb,KAAKmB,KAAO,OAEhEnB,KAAK+B,gBACN/B,KAAK+B,cAAcC,MAAK,GACxBhC,KAAK+B,cAAcE,OAAOC,MAAMC,QAAU,QAG5CnC,KAAK0B,UAAUO,OAAOC,MAAMC,QAAU,IAYtCR,EAAQ,EAIV,MAAMS,EAAYpC,KAAKoB,UAAYO,GAAS,EAAI,EAGhD3B,KAAK0B,UAAUW,aAAaD,GACN,IAAnBpC,KAAKoB,WAA6B,IAAVO,GACzB3B,KAAK0B,UAAUY,SAAS,GAI1BtC,KAAKoB,UAAYO,EAEjB3B,KAAK0B,UAAUa,OAMVC,OACL,OAAGxC,KAAKyC,YAAoBzC,KAAKyC,YAC1BzC,KAAKyC,YAAcC,QAAQC,IAAI,CACpC,yBAAkC,CAChCtB,UAAWrB,KAAKqB,UAChBuB,MAAM,EACNC,UAAU,EACVC,MAAO9C,KAAKkB,KACZ6B,OAAQ/C,KAAKkB,MACZ,4BAA4B8B,MAAMtB,IACnC1B,KAAK+B,cAAgBL,EAGjB1B,KAAKiB,WAAWP,MAAMG,QACxBa,EAAUa,OAGL,sBAA+Bb,MAGxC,yBAAkC,CAChCL,UAAWrB,KAAKqB,UAChBuB,MAAM,EACNC,UAAU,EACVC,MAAO9C,KAAKkB,KACZ6B,OAAQ/C,KAAKkB,MACZ,gCAAgC8B,MAAMC,IACvCjD,KAAK0B,UAAYuB,EAEbjD,KAAKiB,WAAWP,MAAMG,SACxBb,KAAK0B,UAAUO,OAAOC,MAAMC,QAAU,QAGxCnC,KAAK0B,UAAUrB,iBAAiB,cAAc6C,KAIX,IAA7BlD,KAAK0B,UAAUU,WAAmBc,GAAgBlD,KAAKoB,YAC1B,IAA9BpB,KAAK0B,UAAUU,WAAoBc,GAAgBlD,KAAKoB,aACzDpB,KAAK0B,UAAUY,SAAS,GACxBtC,KAAK0B,UAAUyB,SAGG,IAAjBD,GAAyC,IAAnBlD,KAAKoB,WAGzBpB,KAAK+B,gBACN/B,KAAK+B,cAAcE,OAAOC,MAAMC,QAAU,GAC1CnC,KAAK+B,cAAcQ,OACnBvC,KAAK0B,UAAUO,OAAOC,MAAMC,QAAU,WAMrC,sBAA+Bc,QAKrCzC,SACFR,KAAK0B,WAAW1B,KAAK0B,UAAUlB,SAC/BR,KAAK+B,eAAe/B,KAAK+B,cAAcvB,Y,yICrI9C,IAII4C,EAJAC,EAAsC,KAEtCC,EAAiC,KACjCC,EAAwC,KAgH5C,MAAMC,EAAO,IAAI,IAAK,iBAAiB,GA7GpB,KACjB,MAAMC,EAAcJ,EAASpD,KAA8CY,OAErE6C,EAAiB,IAAI,IAAe,CACxCC,MAAO,OACPC,MAAM,SACN/C,OAAQ4C,EACR1C,OAAS8C,IACPC,EAAWD,MAIfT,EAAYM,EAAe3D,MAE3ByD,EAAKO,OAAOC,cAAc,kBAAkBC,OAAOP,EAAerC,WAE/CmC,EAAKO,OAAOC,cAAc,eAElC3D,iBAAiB,SAAS,WACnC,OAAO,qBAGT,MAAM6D,EAAU,KACdC,YAAW,KACTC,EAAO5D,WACN,MAGCsD,EAAcD,IAClBT,EAAUlD,aAAa,WAAY,QAEnC,MAAMmE,EAAqB,CACzBC,aAAcjB,EAASiB,aACvBC,gBAAiBlB,EAASkB,gBAC1BC,WAAYX,GAKd,kCAAwC,cAAeQ,EAAQ,CAACI,cAAc,IAC7EzB,MAAM0B,IAGL,OAAOA,EAASC,GACd,IAAK,qBACH,gCAAsCD,EAASE,MAE/C,8BAAmB5B,MAAM6B,IACvBA,EAAEC,QAAQC,WAEZb,IACA,MACF,IAAK,mCAGH,sDAAuBlB,MAAM6B,IAC3BA,EAAEC,QAAQC,MAAM,CACd,aAAgB1B,EAASiB,aACzB,gBAAmBjB,EAASkB,qBAIhCL,QAMHc,OAAYC,IAAQ,O,OAAD,E,OAAA,E,EAAA,YACpB,IAAIC,GAAO,EACX,OAAOD,EAAIhF,MACT,IAAK,0BAEHiF,GAAO,EACPD,EAAIE,SAAU,cACD,+BAA0BL,QAAQC,QAC/CZ,YAAW,KACTf,EAAU1C,MAAQ,KACjB,KACH,MACF,IAAK,qBACH0C,EAAU7C,UAAUiB,IAAI,UACxB,OAAekC,EAAeC,OAAO,QAAK,uBAC1C,MACF,IAAK,mBACL,IAAK,qBACHP,EAAU7C,UAAUiB,IAAI,UACxB,OAAekC,EAAeC,OAAO,QAAK,uBAC1C,MACF,QACED,EAAeC,MAAMyB,UAAYH,EAAIhF,KAIrCiF,GACFxB,EAAe2B,SAGjBjC,EAAUkC,gBAAgB,a,YA9BN,K,kRAkClBC,EAAW/B,EAAKO,OAAOC,cAAc,eACrC9C,EAAO,aAAsB,IAAM,IACnCkD,EAAS,IAAI,IAAeV,EAAgBxC,GAElD,OADAqE,EAAStB,OAAOG,EAAO/C,WAChB+C,EAAO5B,UAG4CgD,IAG1D,GAFAnC,EAAWmC,EAEPlC,EAGG,CACLF,EAAU1C,MAAQ,GAElB,MAAM+E,EAAMnE,SAASoE,YAAY,cACjCD,EAAIE,UAAU,SAAS,GAAO,GAC9BvC,EAAUwC,cAAcH,QAPxBnC,EAAgBE,EAAKO,OAAO8B,uBAAuB,SAAS,GAC5DtC,EAAkBC,EAAKO,OAAO8B,uBAAuB,aAAa,GAUpE,IAAIC,EAAkBC,EACtB,OAFAzC,EAAc8B,UAAY/B,EAASiB,aAE5BjB,EAASpD,KAAK0E,GACnB,IAAK,uBACHmB,EAAM,qBACN,MACF,IAAK,uBACHA,EAAM,uBACN,MACF,IAAK,wBACHA,EAAM,sBACN,MACF,QACEA,EAAM,yBACNC,EAAO,CAAC1C,EAASpD,KAAK0E,IAI1B,OAAepB,GAAiB,QAAKuC,EAAKC,IAE1C,yCAA+C,YAAa,CAACpB,EAAG,oBAAqBqB,SAAUR,OAC9F,KACDpC,EAAU6C,WAGZ,K,oRChIA,IAAuCC,EAAnCC,EAA6B,KA+PjC,MAAM3C,EAAO,IAAI,IAAK,aAAa,GA7PhB,KAoBjB,MAAM4C,EAAe9E,SAASC,cAAc,OAG5C,IAAI8E,EAAkCC,EAFtCF,EAAa7F,UAAUiB,IAAI,iBAG3B,MAAM+E,EAAoB,IAAI,IAAkB,CAC9CC,gBAAiB,CAACC,EAAS5C,KACzBwC,EAAsBI,EAASH,EAA0BzC,EAErDA,IAIJ6C,EAAchG,MAAQgG,EAAcC,UAAY,IAAM9C,EAAK+C,aAC3DzC,YAAW,KACT0C,EAAMZ,SACN,OAAgBY,GAAO,KACtB,OAIDH,EAAgB,IAAI,IAAc,CACtCI,QAAUC,IACR,wBAEA,MAAM,QAACN,EAAO,KAAE5C,GAAQkD,GAAa,GACrC,IAAIC,EAAcP,EAAUA,EAAQ7C,MAAQ6C,EAAQQ,aAAe,GAChED,IAAgBT,EAAkB7F,OAChC2F,GACAI,GACA5C,IACCwC,IAAwBI,GACxBH,EAAwBM,eAAiB/C,EAAK+C,eAIlDL,EAAkBW,SAAST,EAAS5C,EAAMmD,GAIzCP,GAAYC,EAAchG,MAAMG,OAAS,EAAK,EAC/CsF,EAAQjE,MAAMiF,WAAa,GAE3BhB,EAAQjE,MAAMiF,WAAa,YAK3BN,EAAQH,EAAc3G,MAE5B8G,EAAMxG,iBAAiB,YAAaC,IAElC,IAAI6F,EAAQjE,MAAMiF,YAAuD,UAAV7G,EAAEwF,IAC/D,OAAOsB,OAQX,MAAMC,EAAsB,IAAI,IAAc,CAC5CC,KAAM,mBACN1D,KAAM,cACN2D,YAAY,EACZC,SAAS,IAGXH,EAAoBtH,MAAMM,iBAAiB,UAAU,KACnD,MAAMoH,EAAaJ,EAAoBG,QACvC,yCAA+C,aAAcC,GAE7D,mBAA+BA,GAAY,MAG7C,eAA2BzE,MAAM0E,IAC3B,kBAIFL,EAAoBG,QAAUE,EAAMD,YAHpCJ,EAAoBG,SAAU,EAC9BH,EAAoB1D,MAAMpD,UAAUiB,IAAI,yBAM5C2E,GAAU,OAAO,gCAAiC,CAACmB,KAAM,eACzDnB,EAAQjE,MAAMiF,WAAa,SAE3B,MAAMC,EAAY9G,IACbA,IACD,OAAYA,GAGd,MAAMqH,GAAS,OAAiB,CAA4BxB,EAASD,IAAQ,IAE7E,OAAeC,GAAS,QAAK,gBAC7B,OAAaA,GAIb,IAAI7B,EAAeoC,EAAchG,MACjC,kCAAwC,gBAAiB,CACvD4D,aAAcA,EACdsD,OAAQ,OACRC,SAAU,SACVC,SAAU,CACRnD,EAAG,kBAGJ3B,MAAMa,IAGP,8BAAyBb,MAAM6B,GAAMA,EAAEC,QAAQC,MAAMgD,OAAOC,OAAOnE,EAAM,CAACS,aAAcA,UACvFU,OAAOC,IACR0C,IAGO,yBADA1C,EAAIhF,MAEPyG,EAAcuB,YACd,OAAevB,EAAc/C,OAAO,QAAK,4BACzCkD,EAAMtG,UAAUiB,IAAI,UACpB,OAAe2E,GAAS,QAAK,iBAG7B+B,QAAQC,MAAM,uBAAwBlD,GACtCkB,EAAQf,UAAYH,EAAIhF,WAMhC,QAAiBkG,EAASiB,GAE1BlB,GAAQ,OAAO,4DAA6D,CAACoB,KAAM,mBAGnFpB,EAAM7F,iBAAiB,SAAS,KAC9B,qBAsBF+F,EAAanC,OAAOsC,EAAkBlF,UAAWqF,EAAcrF,UAAWgG,EAAoB1D,MAAOwC,EAASD,GAE9G,MAAMkC,EAAK9G,SAASC,cAAc,MAClC6G,EAAG7H,UAAUiB,IAAI,gBACjB,QAAM4G,EAAI,eAEV,MAAMC,EAAW/G,SAASC,cAAc,OACxC8G,EAAS9H,UAAUiB,IAAI,WAAY,gBACnC,QAAM6G,EAAU,mBAEhB7E,EAAKO,OAAOC,cAAc,cAAcC,OAAOmE,EAAIC,EAAUjC,GAuDzD,KACFjC,YAAW,KACT0C,EAAMZ,UACL,IAGL,OAAwBG,GA1DtB,kCAAwC,qBAAqBpD,MAAMsF,I,MACjE,MAAMC,EAAW,iBAA0B,YACxCA,KAA+B,QAAlB,EAAAA,EAASC,iBAAS,eAAEC,OAClC,iBAAiBF,EAASG,WAAW1F,MAAK,MACxC,OAAc6D,EAAO,YAIzB,MAAM8B,EAAM,IAAIC,IAAI,CAAC,EAAG,EAAG,EAAG,EAAG,IAC3BC,EAAiB,CAACP,EAAgBQ,SAExC,IAAIC,EA+BJ,OA9BGT,EAAgBU,aAAeV,EAAgBQ,UAChDC,EAAU,yCAA+CT,EAAgBU,YAAYhG,MAAK,KACxF6F,EAAKI,KAAKX,EAAgBU,iBAI7BD,GAAWrG,QAAQwG,WAAWlG,MAAK,KAClC6F,EAAKM,SAASC,IACZT,EAAIU,OAAOD,MAGb,MAAME,EAAO,IAAIX,GACXY,EAAI,KAA0B,O,OAAD,E,OAAA,E,EAAA,YACjC,MAAMH,EAAOE,EAAKE,QAClB,IAAIJ,EAAM,OAEV,MAAMK,EAAmB,KAAKL,aAE9B,SADkB,QAAmBK,GAEnC,OAAOF,IAGTpF,YAAW,KACT,yCAA+CiF,GAAkCM,QAAQH,KACxD,M,YAZF,K,+QAenCA,OAGKjB,KACNtF,MAAMsF,IACH/B,EAAkB7F,MAAMG,QAAW6F,EAAchG,MAAMG,QACzD0F,EAAkBoD,oBAAoBrB,EAAgB7B,eAkBP,KAClDN,KACD,OAAeA,GAAS,QAAK,gBAC7B,OAAOA,OAASyD,OAAWA,GAAW,GACtCzD,EAAQb,gBAAgB,aAGvBY,GACDA,EAAMZ,gBAAgB,YAGxB,yCAA+C,YAAa,CAACX,EAAG,uBAGlE","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/pages/pageAuthCode.ts","webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then((m) => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/putPreloader\";\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport ripple from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\nimport CountryInputField from \"../components/countryInputField\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n countryInputField.override(country, code, countryName);\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","Promise","all","loop","autoplay","width","height","then","_animation","currentFrame","pause","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","sentCode","focus","btnQr","btnNext","inputWrapper","lastCountrySelected","lastCountryCodeSelected","countryInputField","onCountryChange","country","telInputField","lastValue","country_code","telEl","onInput","formatted","countryName","default_name","override","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","state","toggle","api_id","api_hash","settings","Object","assign","setError","console","error","h4","subtitle","nearestDcResult","langPack","countries","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","push","resolve","forEach","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined"],"sourceRoot":""} \ No newline at end of file diff --git a/public/126.25016da268c3c399afac.chunk.js b/public/126.25016da268c3c399afac.chunk.js deleted file mode 100644 index cf7408095..000000000 --- a/public/126.25016da268c3c399afac.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackChunktweb=this.webpackChunktweb||[]).push([[126],{4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);const a=(e,t={})=>{const i=document.createElement(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}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.Z{constructor(e){super(Object.assign({plainText:!0},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}))}}},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2384);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.onVisibilityClickAdditional=()=>{this.passwordInputField.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(2384);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.style.display="none"),this.animation.canvas.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.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.style.display="",this.idleAnimation.play(),this.animation.canvas.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,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),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()};const t=this.input;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"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},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},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);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let h,u=document.createElement("div");u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const p=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{n.Z.mutate((()=>{r.remove()})),i&&i(c)};if(er.classList.add("hiding")),Math.max(i-d/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,d/2);a.Z||window.removeEventListener("contextmenu",h),h=null,g=!1},t&&t(c),window.requestAnimationFrame((()=>{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,l=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=l+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(d===e||!(0,r.Z)(t.target,d));let g=!1;if(a.Z){let e=()=>{h&&h()};d.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;let{clientX:i,clientY:s}=t.touches[0];p(i,s),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else d.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(g)return void(g=!1);let{clientX:t,clientY:i}=e;p(t,i),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})}),{passive:!0})}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>l,gV:()=>c});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 l(e,t=!0){return c(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function c(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}},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})},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});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?t():s.then((()=>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 l=r},2126:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>Qm,DIALOG_LIST_ELEMENT_TAG:()=>jm,default:()=>Jm});var s=i(3512),n=i(2738),a=i(3910),o=i(2341),r=i(8497),l=i(4668),c=i(130),d=i(4755),h=i(3719),u=i(2312),p=i(5814),m=i(8805),g=i(5565),v=i(2325);class f{constructor(e,t,i=!0,s,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=i,this.autonomous=a,this.onFound=o,this.list=Jm.createChatList(),this.container=document.createElement("div"),s&&(this.container.className=s),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,v.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",n&&Jm.setListClickListener(this.list,o,void 0,a)}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 y{constructor(e,t,i,s){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,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 m.ZP(this.container),this.listsContainer=this.scrollable.container;for(let 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(let 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=s.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:s}=t;s.length&&s[0].mid===this.minMsgId&&s.shift();const n=this.searchGroups.messages;s.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;Jm.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:54,meAsSaved:!1,message:t,query:e})}catch(e){console.error("[appSearch] render search result",e)}})),n.toggle(),this.minMsgId=s.length&&s[s.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=s.length,-1===this.foundCount&&(this.foundCount=i,n.nameEl&&(0,g.Z)(n.nameEl,(0,v.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}))}}var b=i(503);class w{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let 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 b.Z({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)}}var S=i(426),C=i(9818),L=i(3241),I=i(3699),M=i(4494);const E=(e,t={})=>(0,M.Z)("btn-icon",Object.assign({icon:e||void 0},t));class P{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){this.slider=e,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=E("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 m.ZP(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider&&this.slider.addTab(this),this.listenerSetter=new I.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(){}onCloseAfterTimeout(){var e;this.destroyable&&(this.slider.tabs.delete(this),this.container.remove(),this.scrollable.destroy(),null===(e=this.listenerSetter)||void 0===e||e.removeAll())}setTitle(e){this.title.innerHTML="",this.title.append((0,v.ag)(e))}}class T extends P{constructor(e){super(e),this.eventListener=new L.Z}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}var k=i(1655),x=i(5953);class _{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{C.Z.findItemByType(this.navigationType)?C.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!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 P?n.container:n:this.canHideFirst?-1:0,t),!0},(0,x.Z)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,S.v)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach((e=>{(0,n.fc)(e,this.onCloseBtnClick)}))}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof P?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout((()=>{t.onOpenAfterTimeout()}),250)),C.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof P?e.container:e),!0}removeTabFromHistory(e){(0,k.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))}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){i||C.Z.removeByType(this.navigationType,!0);const s=e instanceof P?e:this.tabs.get(e);s&&(s.onClose&&s.onClose(),s.onCloseAfterTimeout&&setTimeout((()=>{s.onCloseAfterTimeout()}),280))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}createTab(e,t){const i=new e(t?void 0:this,!0);return i.managers=this.managers,i}}var A=i(1168),Z=i(6765);class D{constructor(e){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,n.fc)(this.container,(()=>{A.Z.createPopup(Z.Z).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}const F=(e={})=>(0,M.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);var R=i(410);const B=["January","February","March","April","May","June","July","August","September","October","November","December"],N=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],U=86400,O=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())/U+1)/7)};function H(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};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):B[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},W=2013,j=new RegExp("20[0-9]{1,2}"),$=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),q=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Q=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"),J=[31,29,31,30,31,30,31,31,30,31,30,31];function X(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===ae(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 l=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const c=e.getTime()-1;return void t.push({title:ae(l),minDate:l,maxDate:c})}let n;if(null===(n=Q.exec(i)))if(null===(n=Y.exec(i)))if(null===(n=j.exec(i))){if(null!==(n=$.exec(i))){const e=n[1],i=n[2],s=re(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void te(t,e-1,s);if(e>=W)return void ee(t,s,e)}}if(null!==(n=q.exec(i))){const e=n[1],i=re(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void te(t,s-1,i);s>=W&&ee(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 l=(new Date).getFullYear();if(oe(a-1,o)&&r>=W&&r<=l){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:ne(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>=W&&s<=12)return void ee(t,s-1,a);a<=12&&te(t,s-1,a-1)}else s>=W&&a<=12&&ee(t,a-1,s)}}function ee(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=W&&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:ie(a),minDate:a,maxDate:o})}}function te(e,t,i){if(oe(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=W;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 l=r.getTime();if(l>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const c=r.getTime()-1;o===n?e.push({title:se(l),minDate:l,maxDate:c}):e.push({title:ne(l),minDate:l,maxDate:c})}}var s}function ie(e){const t=new Date(e);return B[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function se(e){const t=new Date(e);return B[t.getMonth()].slice(0,3)+" "+t.getDate()}function ne(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function ae(e){const t=new Date(e);return N[t.getDay()]}function oe(e,t){return t>=0&&t<12&&e>=0&&e{this.uploadAvatar=e}));const e=new Wo({}),t=document.createElement("div");t.classList.add("input-wrapper"),this.groupNameInputField=new b.Z({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new b.Z({label:"ChatLocation",name:"location",canBeEdited:!1}),t.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=F({icon:"arrow_next"}),(0,n.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=>{Qo.removeTabFromHistory(this),Qo.selectTab(0),mm.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const i=new Wo({name:"Members",nameArgs:[this.peerIds.length]}),s=this.list=Jm.createChatList({new:!0});i.content.append(s),e.content.append(this.avatarEdit.container,t),this.content.append(this.nextBtn),this.scrollable.append(e.container,i.container)}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}open(e,t=!1){this.isGeoChat=t,this.peerIds=e;const i=super.open();return i.then((()=>(t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(v.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}=Jm.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(ce(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n})))))),i}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 he=i(5003),ue=i(6008);class pe{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach((e=>{const t=e.target;if(this.items.get(t)===e.isIntersecting)return;this.items.set(t,e.isIntersecting);const s={target:t,visible:e.isIntersecting,entry:e};i.push(s)})),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}}function me(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}var ge=i(4064),ve=i(4421);class fe extends ve.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(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){me(this.queue,(t=>t.div===e)),this.intersector.unobserve(e)}}class ye extends fe{constructor(e){super(e),this.onVisibilityChange=({target:e,visible:t})=>{t&&(me(this.queue,(t=>t.div===e)).forEach((e=>{e.wasSeen=!0,this.queue.unshift(e)})),this.setProcessQueueTimeout())},this.intersector=new pe(this.onVisibilityChange)}getItem(){return(0,ge.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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}var be=i(279),we=i(1405),Se=i(7530),Ce=i(9897);function Le(e,t=0,i=0,s=!1,n=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let a={_:"photoSizeEmpty",type:""},o=e.sizes||e.thumbs;if(n&&o&&"photo"!==e._&&(o=o.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==o?void 0:o.length){for(let e=0,s=o.length;e=t||n.height>=i)break}s&&"photoSizeEmpty"===a._&&"photoStrippedSize"===o[0]._&&(a=o[0])}return a}function Ie(e,t){return e.reduce(((e,t)=>e+t),t)}var Me=i(3228);class Ee{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=Ee.countRatios(e),this.proportions=Ee.countProportions(this.ratios),this.averageRatio=Ie(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Pe(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 Pe{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=Pe.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Me.Z)(e,1,2.75):(0,Me.Z)(e,.6667,1)))}layout(){let e=new Array(this.count),t=[];const i=(e,t)=>{const i=Ie(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{let s=[],n=0;for(let 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=Ie(t,0)+this.spacing*(s-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d2&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 l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/s*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/s*100+"%",8&i&&1&i&&(l.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(l.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(l.style.borderTopRightRadius="inherit"),2&i&&4&i&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}}))}var ke=i(9674);const xe={},_e=(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 Ae(e,t,i,s=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(i&&i());if(xe[t]&&s||e instanceof HTMLVideoElement)e&&_e(e,t),i&&i();else{const s=e instanceof HTMLImageElement,n=s?e:new Image;n.src=t,n.addEventListener("load",(()=>{!s&&e&&_e(e,t),xe[t]=!0,i&&i()}),{once:!0}),i&&n.addEventListener("error",(e=>{console.error("Render image from url failed:",e,t,n),i()}))}}function Ze(e,t,i){return new Promise((s=>{Ae(e,t,s,i)}))}function De(e,t,i,s,n=e,a){return s&&t.classList.add("fade-in"),new Promise((o=>{Ae(t,i,(()=>{ke.Z.mutateElement(e,(()=>{n.append(t),o(),s?t.addEventListener("animationend",(()=>{ke.Z.mutate((()=>{t.classList.remove("fade-in"),null==a||a.remove()}))}),{once:!0}):null==a||a.remove()}))}))}))}const Fe=(e,t,i,n,a,o)=>{const{timeout:r,raf:l}=e.dataset;if(void 0!==r&&clearTimeout(+r),void 0!==l&&(window.cancelAnimationFrame(+l),o||delete e.dataset.raf),o&&s.Z.settings.animationsEnabled&&n)return void(e.dataset.raf=""+window.requestAnimationFrame((()=>{delete e.dataset.raf,Fe(e,t,i,n,a,o-1)})));i&&t&&e.classList.add(t);const c=()=>{delete e.dataset.timeout,!i&&t&&e.classList.remove("backwards",t),e.classList.remove("animating"),a&&a()};if(!s.Z.settings.animationsEnabled||!n)return e.classList.remove("animating","backwards"),void c();e.classList.add("animating"),e.classList.toggle("backwards",!i),e.dataset.timeout=""+setTimeout(c,n)},Re=Fe;var Be=i(3035),Ne=i(8487);class Ue{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,x.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,n.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 n=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;n{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,Be.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){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i),this.detached||this.preloader.parentElement!==e){const t=(0,Ne.Z)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),Re(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&Re(this.preloader,"is-visible",!1,200,(()=>{this.preloader.remove()}),1))}setProgress(e){if(this.totalLength||(0,Ne.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=""}}var Oe=i(3725),He=i(8594);const ze=[];let Ge=!1;function Ve(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,Oe.Z)();return ze[t](e),Ke(),i}function Ke(){Ge||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,n)=>{const a=()=>{return o=this,r=void 0,c=function*(){const o=performance.now();do{yield(0,He.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void n(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-o<6);t.length>0?(0,Be.T2)(a):s(i)},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(o,r||[])).next())}));var o,r,l,c};(0,Be.T2)(a)})).then(e.promise.resolve,e.promise.reject)}(ze.shift()).finally((()=>{Ge=!1,ze.length&&Ke()}))}var We=i(6663);let je,$e;function qe(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return We.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),$e(n,0,0,s.width,s.height,t,i)),s}je=We.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{$e=e.default}));const Qe=new Map;function Ye(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;Qe.size>150&&Qe.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=Qe.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=>{je.then((()=>{const a=new Image;a.onload=()=>{Ve({items:[[a,t,i,s]],context:null,process:qe},"unshift").then((()=>{n()}))},a.src=e}))}));Qe.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}var Je=i(4762),Xe=i(3306);const et=(0,Xe.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),tt=(0,Xe.Z)("ffd9");function it(e,t=!1){let i,s;return t?i=e instanceof Uint8Array?e:new Uint8Array(e):(i=new Uint8Array(et.concat(Array.from(e.slice(3)),tt)),i[164]=e[1],i[166]=e[2]),s=t?Je.IS_SAFARI?"image/png":"image/webp":"image/jpeg",function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,s)}function st(e,t,i=!1){return it(t.bytes,i)}function nt(e,t,i){const s=st(0,t,!1);let n,a;if(i){const e=Ye(s);n=e.canvas,a=e.promise}else n=new Image,a=Ze(n,s);return n.classList.add("thumbnail"),{image:n,loadPromise:a}}function at(e,t,i,s=!1){if(!t.downloaded||["video","gif"].includes(e.type)||s){if("document"===e._&&t.downloaded&&!s)return null;const n=e.sizes||e.thumbs,a=(null==n?void 0:n.length)?n.find((e=>"photoStrippedSize"===e._)):null;if(a&&"bytes"in a)return nt(0,a,i)}return null}var ot=i(9405),rt=i(3114);function lt(e,t,i,s,n=!0,a,o,r){const l=(0,rt.Z)(e);let c;r||(r=Le(e,i,s,void 0,o));const d="document"===e._;c=d||l?(0,ot.C)(e.w||r.w||512,e.h||r.h||512):(0,ot.C)(r.w||100,r.h||100);let h=(0,ot.C)(i,s);h=c=c.aspect(h,n);let u=!0;return(!d||["video","gif"].includes(e.type)||l)&&(h.width<200&&h.height<200&&(h=c=c.aspectCovered((0,ot.C)(200,200))),a&&(a.message||a.reply_to_mid||a.media.webpage||a.replies&&a.replies.pFlags.comments&&a.replies.channel_id.toChatId()!==le.IA)&&h.width<320&&(h=(0,ot.C)(320,h.height),u=!1),u&&h.width<120&&a&&(h=(0,ot.C)(120,h.height),u=!1)),t.style.width=h.width+"px",t.style.height=h.height+"px",{photoSize:r,size:c,isFit:u}}var ct=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function dt({photo:e,message:t,container:i,boxWidth:n,boxHeight:a,withTail:o,isOut:r,lazyLoadQueue:l,middleware:c,size:h,withoutPreloader:p,loadPromises:m,autoDownloadSize:g,noBlur:v,noThumb:f,noFadeIn:y,blurAfter:b,managers:w=s.Z.managers}){return ct(this,void 0,void 0,(function*(){const S=(0,rt.Z)(e);if(!e.sizes&&!e.thumbs&&!S)return n&&a&&!h&&"document"===e._&<(e,i,n,a,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};let C=0===g;h||(void 0===n&&(n=d.Z.active.regular.width),void 0===a&&(a=d.Z.active.regular.height)),i.classList.add("media-container");let L,I,M,E=i,P=!0,T=Promise.resolve();const k="document"===e._&&"image/gif"===e.mime_type&&!h;if(I=new Image,n&&a&&!h){const s=lt(e,i,n,a,void 0,t,void 0,k?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=s.photoSize,P=s.isFit,M=yield w.thumbsStorage.getCacheContext(e,h.type),!P&&!S){E=document.createElement("div"),E.classList.add("media-container-aspecter"),E.style.width=s.size.width+"px",E.style.height=s.size.height+"px";const n=at(e,M,!v,!0);if(n){T=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield dt({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:l,isOut:r,loadPromises:m,middleware:c,withoutPreloader:p,withTail:o,autoDownloadSize:g,noBlur:v,noThumb:!0,blurAfter:!0,managers:w})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(E)}}else h||(h=Le(e,n,a,!0)),M=yield w.thumbsStorage.getCacheContext(e,null==h?void 0:h.type);if(!f&&!S){const t=at(e,M,!v);t&&(T=Promise.all([T,t.loadPromise]),L=t.image,L.classList.add("media-photo"),E.append(L))}I.classList.add("media-photo");const x=(L||!M.downloaded)&&s.Z.settings.animationsEnabled&&!y;let _;const A=null==t?void 0:t.uploadingFileName;p||(M.downloaded&&!A||(_=new Ue({attachMethod:"prepend",isUpload:!!A})),A&&(_.attachPromise(u.Z.getUpload(A)),_.attach(i),C=void 0));const Z=e=>De(i,I,e,x,E,L),D=e=>ct(this,void 0,void 0,(function*(){if(!c||c()){if(b){const t=Ye(e,12);return t.promise.then((()=>Z(t.canvas.toDataURL())))}return Z(e)}}));let F;const R=h.w>=150&&h.h>=150||C,B=()=>ct(this,void 0,void 0,(function*(){C&&!p&&_&&(_.construct(),_.setManual());const t=(()=>{const t=k&&!h;return u.Z.downloadMediaURL({media:e,thumb:h,queueId:null==l?void 0:l.queueId,onlyCache:t?void 0:C})})(),s=yield w.thumbsStorage.getCacheContext(e,null==h?void 0:h.type);_&&!s.downloaded&&!p&&R&&_.attach(i,!1,t),C=void 0;const n=t.then(D);return n.catch((()=>{})),{download:t,render:n}}));return _&&_.setDownloadFunction(B),M.downloaded?T=F=(yield B()).render:l?l.push({div:i,load:()=>B().then((({download:e})=>e))}):F=(yield B()).render,m&&T&&m.push(T),yield T,{loadPromises:{thumb:T,full:F||Promise.resolve()},images:{thumb:L,full:I},preloader:_,aspecter:E}}))}var ht=i(5296);function ut(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}var pt=i(925),mt=i(6724);function gt(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}var vt=i(3013),ft=i(319);const yt='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let bt;function wt(e,t){if(!bt){const e=document.createElement("canvas");bt=e.getContext("2d",{alpha:!1}),bt.font=t}return bt.measureText(e).width}const St=new Map,Ct=new Set;let Lt=!1;function It(){Lt||(Lt=!0,(0,Be.T2)((()=>{Lt=!1,Ct.forEach(Et),Ct.clear()})))}function Mt(e){const t=e.dataset.sizeType;return t?d.Z.active[t].width:e.getBoundingClientRect().width}function Et(e){let t=St.get(e);const i=!t;let{text:s,textLength:n,from:a,multiplier:o,font:r,textWidth:l,elementWidth:c}=t||{};i&&(s=e.textContent,n=s.length,a=50,o=a>0&&a/100,r=`${e.dataset.fontWeight||"400"} 16px ${yt}`,l=wt(s,r),c=Mt(e),t={text:s,textLength:n,from:a,multiplier:o,font:r,textWidth:l,elementWidth:c},St.set(e,t));const d=Mt(e),h=i||c!==d;if(!i&&h&&(t.elementWidth=c=d),h)if(l>c){e.setAttribute("title",s);let i=s,n=c;for(;i.length>3;){let t=i.length;const s=o&&(0,Me.Z)(o*t<<0,1,t-2)||Math.max(t+a-1,1),l=i.substr(0,s).replace(/\s*$/,""),d=i.substr(s+1).replace(/^\s*/,"");if(i=l+d,n=wt(i+"…",r),n{for(const[e]of St)Ct.add(e);It()}),{capture:!0,passive:!0});class Pt extends HTMLElement{connectedCallback(){St.set(this,null),this.dataset.sizeType?Et(this):(Ct.add(this),It())}disconnectedCallback(){St.delete(this),Ct.delete(this)}}function Tt(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(Be.T2,e)}function kt(e,t=2){if(0===e)return(0,v.ag)("FileSize.B",[0]);const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1024));return(0,v.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][s],[parseFloat((e/Math.pow(1024,s)).toFixed(i))])}function xt(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})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=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",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}customElements.define("middle-ellipsis-element",Pt);class _t{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,x.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=xt(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,Me.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,Me.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let n=this.min+s/i*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=(0,Me.Z)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}class At extends _t{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=()=>{let 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(vt.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let s=0,n=0;for(let a=0;a=t&&t>=s&&(s=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(vt.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)}}var Zt=i(8115);function Dt(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}var Ft=i(8456),Rt=i(493);const Bt=new WeakMap;s.Z.addEventListener("peer_title_edit",(e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach((e=>{const t=Bt.get(e);t&&t.update()}))}));class Nt{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),e&&this.update(e),Bt.set(this.element,this)}setOptions(e){if(e)for(const t in e){const i=e[t];"object"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0"),this[t]=i}}update(e){var t,i,n,a,o;return i=this,n=void 0,o=function*(){this.setOptions(e);let i=this.fromName;if(void 0!==i)return void 0!==this.limitSymbols&&(i=(0,Ft.Z)(i,this.limitSymbols,this.limitSymbols)),void(0,c.Z)(this.element,(0,Zt.Z)(i));if(void 0===this.peerId&&(this.peerId=le.NM),this.peerId===s.Z.myId&&this.dialog)(0,g.Z)(this.element,(0,v.ag)(this.onlyFirstName?"Saved":"SavedMessages"));else{const e=null!==(t=this.managers)&&void 0!==t?t:s.Z.managers;(0,c.Z)(this.element,yield(0,Rt.Z)(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols,e))}},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}))}}function Ut(e){return t=this,i=void 0,a=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===s.Z.myId&&e.peerId!==s.Z.myId;if(t.append(i?(0,v.ag)("FromYou"):new Nt(Object.assign(Object.assign({},Dt(e)),{dialog:e.peerId===s.Z.myId})).element),(yield s.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=new Nt({peerId:e.peerId}).element;t.append(" ➝ ",i)}return t},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(t,i||[])).next())}));var t,i,n,a}function Ot(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append(H(new Date(1e3*e.date))),t}var Ht=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function zt(e=!0){const t=new Ue({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}s.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 Gt=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,r.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 l=r.join(", "),c=Array.from(a.querySelectorAll(l)),d=c.indexOf(e),h=c.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,d),s=h.slice(d+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class Vt extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new I.Z}render(){var e,t,i;return Ht(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=s.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const o=(0,Se.Z)(this.message),r="voice"===o.type,l=!this.voiceAsMusic&&r,h=this.message.pFlags.is_outgoing,p=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,m=gt(0|o.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const g=this.firstElementChild,f=document.createElement("div");f.classList.add("audio-download"),"audio"!==o.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),p&&(this.classList.add("is-outgoing"),this.append(f));const y=yield l?function(e){return Ht(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Se.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:o,container:r,availW:l}=function(e,t){const i=d.Z.isMobile?16:23,s=d.Z.isMobile?152:190,n=d.Z.isMobile?190:256,a=(0,Me.Z)(t/60*n,s,n),o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.classList.add("audio-waveform-bars"),o.setAttributeNS(null,"width",""+a),o.setAttributeNS(null,"height",""+i),o.setAttributeNS(null,"viewBox",`0 0 ${a} ${i}`);const r=Math.max(...e),l=e.length?e.length:100,c=Math.min(a/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=Tt(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,ht.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/l*t.duration;t.currentTime=s}p.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),p.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),p.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),p.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,n.fc)(p,(e=>{(0,a.Z)(e),t.paused||s(e)}))}),ft.Z),()=>{p.remove(),p=null,t=null}}}))}(this):function(e){var t;return Ht(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Se.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,Zt.Z)(r.performer)),i?t.push(G(s.date)):t.length||t.push(kt(n.size)),e.showSender&&t.push(yield Ut(s)),o.append(...(0,v.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const l=e.querySelector(".audio-title"),d=new Pt;d.dataset.fontWeight=e.dataset.fontWeight,d.dataset.sizeType=e.dataset.sizeType,a?d.append(yield Ut(s)):(0,c.Z)(d,(0,Zt.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),l.append(d),e.showSender&&l.append(Ot(s));const h=e.querySelector(".audio-subtitle");return h.append(o),()=>{let t=!1,i=new At(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),h.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&h.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),b=this.querySelector(".audio-time");b.innerHTML=m;const w=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=vt.Z.addMedia(this.message,e),i=this.readyPromise=(0,Oe.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=y();const s=()=>gt(0|t.currentTime)+(l?" / "+m:""),o=()=>{b.innerText=s(),g.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&o();const r=(e,i=t.paused)=>{if(e&&(0,a.Z)(e),i){const e=!!this.searchContext;if(vt.Z.setSearchContext(this.searchContext||{peerId:le.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?Gt(this,this.message.mid):[];vt.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,n.fc)(g,(e=>r(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{g.classList.remove("playing"),b.innerText=m})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||vt.Z.isSafariBuffering(t)||(b.innerText=s())})),this.addAudioListener("pause",(()=>{g.classList.remove("playing")})),this.addAudioListener("play",o),r};if(null===(t=o.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield dt({photo:o,message:null,container:g,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});g.style.width=g.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(h)p&&(this.preloader=zt(!1),this.preloader.attachPromise(u.Z.getUpload(p)),this.dataset.isOutgoing="1",this.preloader.attach(f,!1));else{let e=this.preloader;const t="audio"!==o.type;w(t);const s=t=>{if(this.audio.src)return;vt.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(vt.Z.willBePlayed(this.audio),Je.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(o.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=zt(!1),s=(0,Oe.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),vt.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=ft.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(f,!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=zt(),t||(this.readyPromise=(0,Oe.Z)());const s=()=>{i();const s=u.Z.downloadMediaURL({media:o});return t||s.then((()=>{this.readyPromise.resolve()})),e.attach(f,!1,s),{download:s}};e.setDownloadFunction(s),s()}this.classList.contains("corner-download")?g.append(f):this.append(f),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),f.classList.add("downloaded"),setTimeout((()=>{f.remove()}),200),vt.Z.willBePlayedMedia===this.audio&&(this.audio.play(),vt.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?s(!1):(0,n.fc)(g,(()=>{s(!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",Vt);var Kt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};let Wt=0;function jt({doc:e,container:t,message:i,boxWidth:o,boxHeight:r,withTail:l,isOut:c,middleware:h,lazyLoadQueue:m,noInfo:g,group:v,onlyPreview:f,withoutPreloader:y,loadPromises:b,noPlayButton:w,size:S,searchContext:C,autoDownload:L,managers:I=s.Z.managers}){var M;return Kt(this,void 0,void 0,(function*(){const E=null==L?void 0:L.video;let P=0===E;const T=!(o&&r),k=("video"!==e.type||e.size<=52428800&&!T)&&("gif"===e.type?s.Z.settings.autoPlay.gifs:s.Z.settings.autoPlay.videos);let x,_;if(!g){x=document.createElement("span"),x.classList.add("video-time"),t.append(x);let i=!1;"gif"!==e.type?(x.innerText=gt(e.duration,!1),w||"round"===e.type||(k&&!P?x.classList.add("tgico","can-autoplay"):i=!0)):(x.innerText="GIF",k||w||(i=!0,P=void 0)),i&&(_=document.createElement("span"),_.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(_))}let A,Z={};if("image/gif"===e.mime_type){const s=yield dt({photo:e,message:i,container:t,boxWidth:o,boxHeight:r,withTail:l,isOut:c,lazyLoadQueue:m,middleware:h,withoutPreloader:y,loadPromises:b,autoDownloadSize:E,size:S,managers:I});return Z.thumb=s,Z.loadPromise=s.loadPromises.full,Z}const D=ut();if(D.classList.add("media-video"),D.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 o=d.Z.active.round,r=o.width/2,l=3.5,c=r-2*l;s.innerHTML=`\n \n `;const h=s.firstElementChild.firstElementChild;Wt||(Wt=2*Math.PI*c),h.style.strokeDasharray=Wt+" "+Wt,h.style.strokeDashoffset=""+Wt,x.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const u=document.createElement("canvas");u.width=u.height=e.w,s.prepend(u,x),s.append(D),t.append(s);const p=u.getContext("2d"),m=()=>{const e=s.message,t=vt.Z.addMedia(e,!P),i=()=>{(mm.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,Ne.Z)(t)||(t.removeEventListener("play",c),t.removeEventListener("timeupdate",l),t.removeEventListener("pause",d),t.removeEventListener("ended",m))}))},o=()=>{p.drawImage(t,0,0);const e=Wt-t.currentTime/t.duration*Wt;return h.style.strokeDashoffset=""+e,!t.paused},r=()=>{t.duration&&((0,Ne.Z)(t)?(t.paused&&o(),x.innerText=gt(t.duration-t.currentTime,!1)):i())},l=(0,mt.Z)((()=>{(0,Be.T2)(r)}),1e3,!1),c=()=>{D.classList.add("hide"),s.classList.remove("is-paused"),(0,ht.cK)(o,u),A&&A.preloader&&A.preloader.classList.contains("manual")&&A.onClick()},d=()=>{(0,Ne.Z)(t)?s.classList.add("is-paused"):i()},m=()=>{D.classList.remove("hide"),s.classList.add("is-paused"),D.currentTime=0,x.innerText=gt(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",c),t.addEventListener("timeupdate",l),t.addEventListener("pause",d),t.addEventListener("ended",m),(0,n.fc)(u,(i=>{if((0,a.Z)(i),A&&!A.detached&&A.onClick(),t.paused){const i=!!C;if(vt.Z.setSearchContext(C||{peerId:le.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?Gt(s,e.mid):[];vt.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?(o(),r(),D.classList.add("hide")):d():c()};i.pFlags.is_outgoing?(s.onLoad=m,s.dataset.isOutgoing="1"):m()}else D.autoplay=!0;let F,R;if(i){if(F=yield dt({photo:e,message:i,container:t,boxWidth:o,boxHeight:r,withTail:l,isOut:c,lazyLoadQueue:m,middleware:h,withoutPreloader:!0,loadPromises:b,autoDownloadSize:null==L?void 0:L.photo,size:S,managers:I}),Z.thumb=F,!k&&"gif"!==e.type||f)return Z.loadPromise=F.loadPromises.full,Z;if(l){const e=(F.images.thumb||F.images.full).parentElement;D.width=+e.getAttributeNS(null,"width"),D.height=+e.getAttributeNS(null,"height"),e.append(D)}}!D.parentElement&&t&&((null==F?void 0:F.aspecter)||t).append(D);const B=()=>Kt(this,void 0,void 0,(function*(){return R=yield I.thumbsStorage.getCacheContext(e)}));yield B();const N=null==i?void 0:i.uploadingFileName;N?(A=new Ue({attachMethod:"prepend",isUpload:!0}),A.attachPromise(u.Z.getUpload(N)),A.attach(t,!1),P=void 0):R.downloaded||e.supportsStreaming||y?e.supportsStreaming&&(A=new Ue({cancelable:!1,attachMethod:"prepend"})):A=new Ue({attachMethod:"prepend"});const U=(0,Oe.Z)();if(D.addEventListener("error",(e=>{4!==D.error.code&&console.error("Error "+D.error.code+"; details: "+D.error.message),A&&!N&&A.detach(),U.isFulfilled||U.resolve()}),{once:!0}),(0,pt.Z)(D).then((()=>{v&&p.Z.addAnimation(D,v),A&&!N&&A.detach(),U.resolve()})),"video"===e.type){const e=()=>{D.duration&&(x.innerText=gt(D.duration-D.currentTime,!1))},t=(0,mt.Z)((()=>{(0,Be.T2)(e)}),1e3,!1);D.addEventListener("timeupdate",t),_&&D.addEventListener("timeupdate",(()=>{ke.Z.mutateElement(_,(()=>{_.remove()}))}),{once:!0})}D.muted=!0,D.loop=!0,D.autoplay=!0;let O=P&&(null===(M=null==F?void 0:F.preloader)||void 0===M?void 0:M.loadFunc);const H=()=>Kt(this,void 0,void 0,(function*(){A&&P&&!y&&(A.construct(),A.setManual()),yield B();let s=Promise.resolve();if(A&&!N||y)if(R.downloaded||e.supportsStreaming)e.supportsStreaming&&(P?s=Promise.reject():!R.downloaded&&A&&(A.attach(t,!1,null),D.addEventListener(Je.IS_SAFARI?"timeupdate":"canplay",(()=>{A.detach()}),{once:!0})));else{const i=s=I.apiFileManager.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId,onlyCache:P});A&&A.attach(t,!1,i)}return!P&&O&&(O(),O=null),P=void 0,s.then((()=>Kt(this,void 0,void 0,(function*(){!h||h()?("round"===e.type&&vt.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield B(),Ae(D,R.url)):U.resolve()}))),(()=>{})),{download:s,render:U}}));return A&&!N&&A.setDownloadFunction(H),"gif"!==e.type||k?Z.loadPromise=m?(m.push({div:t,load:()=>H().then((({render:e})=>e))}),Promise.resolve()):(yield H()).render:(0,n.fc)(t,(e=>{(0,a.Z)(e),_.remove(),H()}),{capture:!0,once:!0}),Z}))}function $t({messages:e,attachmentDiv:t,middleware:i,uploading:n,lazyLoadQueue:a,isOut:o,chat:r,loadPromises:l,autoDownload:c,managers:h=s.Z.managers}){const u=[];for(const t of e){const e=(0,Se.Z)(t),i="photo"===e._?Le(e,480,480):{w:e.w,h:e.h};u.push({size:i,media:e,message:t})}Te({container:t,items:u.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:d.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0}),u.forEach(((e,s)=>{const{size:n,media:r,message:d}=e,u=t.children[s];u.dataset.mid=""+d.mid,u.dataset.peerId=""+d.peerId;const p=u.firstElementChild;let m;m="photo"===r._?dt({photo:r,message:d,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:i,size:n,loadPromises:l,autoDownloadSize:c.photo,managers:h}):jt({doc:d.media.document,container:p,message:d,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:i,loadPromises:l,autoDownload:c,managers:h}),m&&l&&l.push(m)}))}d.Z.addEventListener("changeScreen",((e,t)=>{if(t===d._.mobile||e===d._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=d.Z.active.round.width,i=t/2,s=i-7;Wt=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=Wt+" "+Wt,n.style.strokeDashoffset=""+Wt}))}}));var qt=i(467),Qt=i(1243),Yt=i(2491),Jt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Xt({message:e,withTime:t,fontWeight:i,voiceAsMusic:a,showSender:r,searchContext:l,loadPromises:c,autoDownloadSize:d,lazyLoadQueue:h,sizeType:p,managers:m=s.Z.managers,cacheContext:g}){var f;return Jt(this,void 0,void 0,(function*(){i||(i=500),p||(p="");const y=0===d,b=e.media.document||e.media.webpage.document,w=null==e?void 0:e.uploadingFileName;if("audio"===b.type||"voice"===b.type||"round"===b.type){const s=new Vt;return s.withTime=t,s.message=e,s.noAutoDownload=y,s.lazyLoadQueue=h,s.loadPromises=c,a&&(s.voiceAsMusic=a),l&&(s.searchContext=l),r&&(s.showSender=r),s.dataset.fontWeight=""+i,s.dataset.sizeType=p,yield s.render(),s}let S=b.file_name?b.file_name.split("."):"",C="";C=S.length>1&&Array.isArray(S)?(0,qt.ST)(S.pop().split(" ",1)[0].toLowerCase()):"file";let L=document.createElement("div");L.classList.add("document",`ext-${C}`),L.dataset.docId=""+b.id;const I=document.createElement("div");I.classList.add("document-ico");const M=!!g,E=()=>M?g:m.thumbsStorage.getCacheContext(b);if(g=yield E(),(null===(f=b.thumbs)||void 0===f?void 0:f.length)||e.pFlags.is_outgoing&&g.url&&"photo"===b.type){L.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(b.type))I.innerHTML=``,t.push(I.firstElementChild);else{performance.now();const e=yield dt({photo:b,message:null,container:I,boxWidth:54,boxHeight:54,loadPromises:c,withoutPreloader:!0,lazyLoadQueue:h,size:Le(b,54,54,!0),managers:m});I.style.width=I.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 I.innerText=C;let P=b.file_name?(0,Yt.Z)(b.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const T=[kt(b.size)];t&&T.push(G(e.date)),r&&T.push(yield Ut(e)),L.innerHTML=`\n ${g.downloaded&&!w||!e.mid?"":'
'}\n
\n
\n `;const k=L.querySelector(".document-name"),x=new Pt;if(x.dataset.fontWeight=""+i,x.dataset.sizeType=p,x.textContent=P,k.append(x),r&&k.append(Ot(e)),L.querySelector(".document-size").append(...(0,v.A1)(T," · ")),L.prepend(I),!w&&e.pFlags.is_outgoing&&!e.mid)return L;let _,A=null;const Z=()=>{if(_){_.classList.add("downloaded");const e=_;setTimeout((()=>{e.remove()}),200),_=null}A&&(A=null)},D=e=>Jt(this,void 0,void 0,(function*(){var t;const i=!e||e.isTrusted,n=yield m.appDocsManager.getDoc(L.dataset.docId);let a;const r=mm.chat.bubbles?mm.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!A||A.detached;a=u.Z.downloadMediaURL({media:n,queueId:r}),e&&a.then((()=>{setTimeout((()=>Jt(this,void 0,void 0,(function*(){const e=(yield E()).url;window.open(e)}))),s.Z.settings.animationsEnabled?250:0)}))}else a=o.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?u.Z.downloadMediaURL({media:n,queueId:r}):u.Z.downloadToDisc({media:n,queueId:r});else a=u.Z.downloadMediaVoid({media:n,queueId:r});_&&(a.then(Z,ft.Z),A.attach(_,!0,a))})),{fileName:F}=(0,Qt.Z)({media:b});if(yield m.apiFileManager.isDownloading(F)){_=L.querySelector(".document-download");const e=u.Z.downloadMediaVoid({media:b});A=new Ue,A.attach(_,!1,e),A.setDownloadFunction(D)}else if(!g.downloaded||w)if(_=L.querySelector(".document-download"),A=new Ue({isUpload:!!w}),w){const e=u.Z.getUpload(w);A.attachPromise(e),A.attach(_),e.then(Z,ft.Z)}else A.construct(),A.setManual(),A.attach(_),A.setDownloadFunction(D),void 0!==d&&d>=b.size&&(0,n.tH)(A.preloader);return(0,n.fc)(L,(e=>{A?A.onClick(e):D(e)})),L}))}s.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,n.tH)(e)}))}));var ei=i(3178),ti=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))},ii=i(5269),si=i(8938);const ni={};function ai(e,t,i){return n=this,a=void 0,r=function*(){const n=e.id+"-"+i,{width:a,height:o}=t;let r=ni[n];if(r&&r.width>=a&&r.height>=o)return;r=ni[n]={width:a,height:o};const l=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(ni[n]!==r)return;if(l&&l.w>=a&&l.h>=o)return;const c=new Promise((e=>{t.toBlob((t=>e(t)))})),d=yield c;ni[n]===r&&(s.Z.managers.appDocsManager.saveLottiePreview(e.id,d,a,o,i),delete ni[n])},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}));var n,a,o,r}var oi=i(2790),ri=i(2384),li=i(7730),ci=i(671),di=i(2131);function hi({size:e,doc:t,middleware:i,target:s,side:n,skipRatio:a,play:o,managers:r}){const l=document.createElement("div");l.classList.add("emoji-animation"),l.style.width=e+"px",l.style.height=e+"px";const c=pi({div:l,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!1,width:e,height:e,play:o,group:"none",skipRatio:a,managers:r}).then((({render:e})=>e)).then((e=>((0,si.Z)(e),e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(e.remove(),l.remove(),mm.chat.bubbles.scrollable.container.removeEventListener("scroll",g))})),di.Z&&e.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),e))),d=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},h=d(16),u=d(4),p=e/8*("right"===n?1:-1),m=()=>{if(!(0,Ne.Z)(s))return;const t=s.getBoundingClientRect(),i=("right"===n?t.right:t.left)+("center"===n?(t.width-e)/2:("right"===n?-e:0)+p+h),a=t.top+(t.height-e)/2+("center"===n?0:u);l.style.top=a+"px",l.style.left=i+"px"},g=Tt(m);return mm.chat.bubbles.scrollable.container.addEventListener("scroll",g),m(),mm.emojiAnimationContainer.append(l),{animationDiv:l,stickerPromise:c}}var ui=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function pi({doc:e,div:t,middleware:i,lazyLoadQueue:o,group:l,play:c,onlyThumb:d,emoji:h,width:m,height:g,withThumb:v,loop:f,loadPromises:y,needFadeIn:b,needUpscale:w,skipRatio:S,static:C,managers:L=s.Z.managers}){var I;return ui(this,void 0,void 0,(function*(){const M=e.sticker;if(1===M&&(C=!0),m||(m=h?void 0:200),g||(g=h?void 0:200),2===M&&ri.Z.loadLottieWorkers(),!M)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");let E;t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper");let P=(t=(null==E?void 0:E.type))=>ui(this,void 0,void 0,(function*(){return E=yield L.thumbsStorage.getCacheContext(e,t)}));if(C&&1!==M){const t=Le(e,m,g,!1);yield P(t.type)}else yield P();const T=h?(0,ci.tB)(h):-1,k=E.downloaded&&!b,x=!C&&(2===M||3===M),_=x,A=2===M||3===M?yield L.appDocsManager.getLottieCachedThumb(e.id,T):void 0;let Z=(0,Oe.Z)(),D=!1;if(((null===(I=e.thumbs)||void 0===I?void 0:I.length)||A)&&!t.firstElementChild&&(!k||_||d)&&!1!==v){let n,a=A||e.thumbs[0];const r=()=>{t.childElementCount||(n.classList.add("media-sticker","thumbnail"),ke.Z.mutateElement(t,(()=>{t.append(n),Z.resolve()})))};if("url"in a)n=new Image,Ae(n,a.url,r),D=!0;else if("bytes"in a)if("photoPathSize"===a._)if(a.bytes.length){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}(a.bytes),n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.classList.add("rlottie-vector","media-sticker","thumbnail"),o.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const r=document.createElementNS(n,"path");r.setAttributeNS(null,"d",i),s.Z.settings.animationsEnabled&&r.setAttributeNS(null,"fill","url(#g)"),o.append(r),t.append(o)}else a=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||a;else T<=0&&(n=new Image,ii.Z||e.pFlags.stickerThumbConverted||E.url?(Ae(n,st(0,a,!0),r),D=!0):li.Z.convert("main-"+e.id,a.bytes).then((s=>{L.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),a.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t.childElementCount||Ae(n,st(0,a,!0),r)})).catch((()=>{})));else if((2===M&&T<=0||3===M)&&(v||d)){const e=()=>ui(this,void 0,void 0,(function*(){if(t.childElementCount||i&&!i())return;const e=()=>{t.childElementCount||i&&!i()||Ae(n,E.url,r)};if(yield P(),E.url)e();else{const t=nt(0,a,!0);n=t.image,t.loadPromise.then(e)}}));if(o&&d)return void o.push({div:t,load:e});e(),a.url&&(D=!0)}}if(y&&D&&y.push(Z),d)return;const F=()=>ui(this,void 0,void 0,(function*(){if(!i||i()){if(2===M&&!C)return yield u.Z.downloadMedia({media:e,queueId:null==o?void 0:o.queueId}).then((o=>ui(this,void 0,void 0,(function*(){if(i&&!i())throw new Error("wrapSticker 2 middleware");let d=yield ri.Z.loadAnimationWorker({container:t,loop:f&&!h,autoplay:c,animationData:o,width:m,height:g,name:"doc"+e.id,needUpscale:w,skipRatio:S,toneIndex:T},l,i);if(d.addEventListener("firstFrame",(()=>{const i=t.firstElementChild;!1!==b&&(b=(b||!i||"svg"===i.tagName)&&s.Z.settings.animationsEnabled);const n=()=>{i&&i!==d.canvas&&i.remove()};b?ke.Z.mutate((()=>{d.canvas.classList.add("fade-in"),i&&i.classList.add("fade-out"),d.canvas.addEventListener("animationend",(()=>{ke.Z.mutate((()=>{d.canvas.classList.remove("fade-in"),n()}))}),{once:!0})})):i&&ke.Z.mutate(n),!1!==v&&ai(e,d.canvas,T)}),{once:!0}),h){const e={a:[],v:1};let s;L.appStickersManager.preloadAnimatedEmojiStickerAnimation(h),(0,n.fc)(t,(n=>ui(this,void 0,void 0,(function*(){(0,a.Z)(n);const o=ri.Z.getAnimation(t);if(o.paused){const e=yield L.appStickersManager.getAnimatedEmojiSoundDocument(h);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield u.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,pt.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}o.autoplay=!0,o.restart()}if(!mm.chat.peerId.isUser())return;const l=yield L.appStickersManager.getAnimatedEmojiSticker(h,!0);if(!l)return;const c=(0,r.Z)(t,"bubble"),d=c.classList.contains("is-out"),{animationDiv:p}=hi({doc:l,middleware:i,side:d?"right":"left",size:280,target:t,play:!0});c&&(d?p.classList.add("is-out"):p.classList.add("is-in")),s||(s=(0,mt.Z)((()=>{if(!e.a.length)return;const i=e.a[0].t;e.a.forEach((e=>{e.t=(e.t-i)/1e3}));const s=(0,r.Z)(t,"bubble");L.appMessagesManager.setTyping(mm.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,oi.Z)(+s.dataset.mid),emoticon:h,interaction:{_:"dataJSON",data:JSON.stringify(e)}},!0),e.a.length=0}),1e3,!1)),n.isTrusted&&(e.a.push({i:1,t:Date.now()}),s())}))))}return d}))));if(C||3===M){let n;C?n=new Image:(n=ut(),n.muted=!0,c&&(n.autoplay=!0,n.loop=!0));const a=t.firstElementChild!==n&&t.firstElementChild;return!1!==b&&(b=(b||!k||(C?a:!a||"svg"===a.tagName))&&s.Z.settings.animationsEnabled),n.classList.add("media-sticker"),b&&n.classList.add("fade-in"),new Promise(((s,r)=>ui(this,void 0,void 0,(function*(){const r=()=>ui(this,void 0,void 0,(function*(){if(i&&!i())return s();const o=()=>{ke.Z.mutateElement(t,(()=>{if(t.append(n),a&&a.classList.add("fade-out"),3===M&&!function(e,t){const i=e.id+"-"+t;return!!ni[i]}(e,T)){(0,si.Z)(n);const t=document.createElement("canvas");t.width=m*window.devicePixelRatio,t.height=g*window.devicePixelRatio,t.getContext("2d").drawImage(n,0,0,t.width,t.height),ai(e,t,T)}3===M&&l&&p.Z.addAnimation(n,l),s(),b&&n.addEventListener("animationend",(()=>{n.classList.remove("fade-in"),a&&a.remove()}),{once:!0})}))};yield P(),C?Ae(n,E.url,o):(n.src=E.url,(0,pt.Z)(n).then(o))}));if(yield P(),E.url)r();else{let t;if(2===M&&C){const i=Le(e,m,g,!1);t=u.Z.downloadMediaURL({media:e,thumb:i,queueId:null==o?void 0:o.queueId})}else t=u.Z.downloadMediaURL({media:e,queueId:null==o?void 0:o.queueId});t.then(r,s)}}))))}}})),R=!o||k&&!x?F():(o.push({div:t,load:F}),Promise.resolve());return k&&C&&(Z=R,y&&y.push(Z)),{render:R}}))}var mi=i(5432);class gi{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,x.Z)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=F({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new D((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()})),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}))}}function vi(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}class fi{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?(0,c.Z)(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append((0,v.ag)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),t=!0),e.checkboxField){this.checkboxField=e.checkboxField;const i=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(i?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(t=!0,this.container.append(this.checkboxField.label)),!e.noCheckboxSubtitle&&!i){const t=()=>{(0,g.Z)(this.subtitle,(0,v.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?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.noWrap&&this.title.classList.add("no-wrap"),e.title?"string"==typeof e.title?this.title.innerHTML=e.title:this.title.append(e.title):this.title.append((0,v.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"),"string"==typeof i?s.innerHTML=i:s.append(i),t.append(s)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&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,n.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,we.Z)(this.container,void 0,void 0,!0))}createMedia(e){this.container.classList.add("row-with-padding");const t=this.media=document.createElement("div");return t.classList.add("row-media"),e&&t.classList.add("row-media-"+e),this.container.append(t),t}}const yi=(e,t)=>vi(e.map((e=>({container:e.container,input:e.radioField.input}))),t);function bi(e){navigator.clipboard?navigator.clipboard.writeText(e):function(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)}(e)}var wi=i(144),Si=i(9750),Ci=i(3789);class Li{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&&(Ci.Z.getState().then((t=>{i.checked=(0,Si.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{s.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const n=this.main=document.createElement("div");n.classList.add("radio-field-main"),e.text?n.innerHTML=e.text:e.langKey&&(0,v.$d)(n,e.langKey),t.append(i,n)}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}}const Ii=document.createElement("div");function Mi(e){(0,g.Z)(Ii,e),document.body.append(Ii),Ii.dataset.timeout&&clearTimeout(+Ii.dataset.timeout),Ii.dataset.timeout=""+setTimeout((()=>{Ii.remove(),delete Ii.dataset.timeout}),3e3)}function Ei(e){Mi((0,v.ag)(e.langPackKey,e.langPackArguments))}Ii.classList.add("toast");var Pi=i(5701);function Ti(e){return(e.length>=5&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class ki extends b.Z{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,Pi.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(b.I.Neutral),void(this.options.onChange&&this.options.onChange());Ti(e)?this.setState(b.I.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)}))}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){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.checkUsernamePromise=this.managers.appUsersManager.checkUsername(e),this.checkUsernamePromise.then((t=>{this.getValue()===e&&(t?this.setState(b.I.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&"USERNAME_INVALID"===t.type&&this.setError(this.options.invalidText)})).then((()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&Ti(t)&&this.checkUsername(t)})))}}var xi=i(9807);class _i extends A.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,A.x)(t.buttons)})),this.className=e,t.peerId){const e=new km;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,v.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,v.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,c.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 xi.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)}}var Ai=i(1656);class Zi extends T{init(){return e=this,t=void 0,a=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 Wo({name:e?"ChannelType":"GroupType"}),i=(0,wi.a)(),a=new fi({radioField:new Li({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new fi({radioField:new Li({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=yi([a,o],(e=>{const t=[c,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),g()})),l=yield this.managers.appChatsManager.getChat(this.chatId);t.content.append(r);const c=new Wo({}),d=new fi({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{bi(this.chatFull.exported_invite.link),Mi(v.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),h=(0,M.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,n.fc)(h,(()=>{new _i("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,Ai.Z)([h],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),d.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),c.content.append(d.container,h);const u=new Wo({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),p=document.createElement("div");p.classList.add("input-wrapper");const m="t.me/",g=()=>{const e=a.radioField.checked&&y!==m||f.isValidToChange()&&f.input.classList.contains("valid");b.classList.toggle("is-visible",e)},f=new ki({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:g,peerId:this.chatId.toPeerId(!0),head:m},this.managers),y=m+(l.username||"");p.append(f.container),u.content.append(p);const b=F({icon:"check",className:"is-visible"});this.content.append(b),(0,n.fc)(b,(()=>{(0,be.p)(b);const e=o.radioField.checked?f.getValue():"";this.managers.appChatsManager.migrateChat(this.chatId).then((t=>this.managers.appChatsManager.updateUsername(t,e))).then((()=>{this.close()}))}),{listenerSetter:this.listenerSetter}),(y!==m?o:a).radioField.checked=!0,f.setOriginalValue(y),this.scrollable.append(t.container,c.container,u.container);{const t=new Wo({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new xi.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 n=()=>{i.setValueSilently(!!l.pFlags.noforwards)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()})),n(),t.content.append(i.label),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}}class Di{constructor(e){this.loading=!1,this.loaded=!1,(0,x.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}))))}}var Fi=i(8479),Ri=i(7120),Bi=i(2946),Ni=i(4789),Ui=i(8763),Oi=i(1352);const Hi=new class{constructor(){if(Oi.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()}},zi=Hi;var Gi=i(6690),Vi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Ki(e,t){return Vi(this,void 0,void 0,(function*(){const i=e.map(((e,i,s)=>Vi(this,void 0,void 0,(function*(){if(yield t(e,i,s))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}var Wi=i(2566);function ji(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}function $i(e,t=s.Z.managers){var i,n,a,o,r,l;return a=this,o=void 0,l=function*(){const s=yield t.appChatsManager.getChat(e);if("chatForbidden"===s._)return(0,v.ag)("YouWereKicked");const a=yield t.appProfileManager.getCachedFullChat(e);let o;o=a?"channelFull"===a._?a.participants_count:null===(i=a.participants.participants)||void 0===i?void 0:i.length:s.participants_count||(null===(n=s.participants)||void 0===n?void 0:n.participants.length),o=o||1;let r=s.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,v.ag)(r,[ji(o)])},new((r=void 0)||(r=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 r?n:new r((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,o||[])).next())}))}var qi=i(8493),Qi=i(8050),Yi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Ji{constructor(e){this.container=document.createElement("div"),this.list=Jm.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=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=Jm.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,x.Z)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>Yi(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 Ki(e,(e=>Yi(this,void 0,void 0,(function*(){if(e.isPeerId()&&!(yield this.managers.appPeersManager.getPeer(e)).deleted)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,v.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,v.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new Wo({});e.innerContainer.classList.add("selector-search-section");let 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 m.ZP(t),(0,n.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,r.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,n.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new Wo({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new m.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,n.fc)(this.chatsContainer,(e=>{const t=(0,Ui.Z)(e.target,"data-peer-id");if((0,a.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 s=(0,Pi.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",s),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend($o()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{let t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return Yi(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([s.Z.myId]))}))}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return Yi(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=zi.height/72*1.25|0,t=this.getTempId("dialogs"),i=this.managers.appMessagesManager.getConversations(this.query,this.offsetIndex,e,this.folderId,!0);this.promise=i;const n=yield i;if(this.tempIds.dialogs!==t)return;this.promise=null;let a=n.dialogs;if(a.length){const e=(0,Qi.Z)(a[a.length-1])||0;a=a.slice(),(0,ge.Z)(a,(e=>e.peerId===s.Z.myId)),this.chatRightsAction&&(a=yield Ki(a,(e=>this.filterByRights(e.peerId)))),yield this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),n.isEnd){if(!this.loadedWhat.dialogs)return yield this.renderSaved(),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 Yi(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,qi.Z)(t):!!(0,Ri.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return Yi(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);this.promise=i;let[n,a]=yield i;if(this.tempIds.contacts!==t)return;if(a){let t=e?a.my_results.concat(a.results):a.my_results;this.chatRightsAction&&(t=yield Ki(t,(e=>this.filterByRights(e)))),this.peerType.includes("dialogs")||(t=t.filter((e=>e.isUser()))),this.cachedContacts=(0,Gi.Z)(n.concat(t))}else this.cachedContacts=n.slice();(0,k.Z)(this.cachedContacts,s.Z.myId),this.promise=null}const t=zi.height/72*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return Yi(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),i=yield t;if(this.tempIds.channelParticipants!==e)return;const n=i.participants.map((e=>(0,Wi.Z)(e)));(0,k.Z)(n,s.Z.myId),this.renderResultsFunc(n),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){return Yi(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield Ki(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>Yi(this,void 0,void 0,(function*(){const{dom:t}=Jm.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new xi.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield $i(e.toChatId()):e===s.Z.myId?(0,v.ag)(this.selfPresence):ce(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const s=document.createElement("div");s.classList.add("selector-user","scale-in");const n=new km;return n.classList.add("selector-user-avatar","tgico","avatar-32"),n.isDialog=!0,s.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new Nt({peerId:e.toPeerId(),dialog:!0}).element),n.updateWithOptions({peerId:e})),t&&("string"==typeof t?s.innerHTML=t:((0,g.Z)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(s,this.input),this.onChange&&this.onChange(this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),s}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)};s.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:Ni.f.Static})}))}}class Xi extends A.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new Ji({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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),mi.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.title.append(this.selector.input)}}var es=i(6848);class ts extends T{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 Wo({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=Jm.createChatList({new:!0});i.append(s);const{dom:n}=Jm.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(ce(yield this.managers.appUsersManager.getUser(this.userId)));const a=new ss({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,es.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 Wo({});if("channelParticipantBanned"===this.participant._){const i=(0,M.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,n.fc)(i,(()=>{const t=(0,Ai.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,M.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,n.fc)(i,(()=>{(0,Ai.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{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var is=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ss{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return is(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,Fi.Z)(t);const i=e.default_banned_rights.pFlags;for(let e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,a=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const o of this.v){const r=o.flags[0];o.checkboxField=new xi.Z({text:o.text,checked:(0,Ri.Z)(t,r,s),restriction:!0,withRipple:!0}),(e.participant&&i.pFlags[r]||t.username&&(o.flags.includes("pin_messages")||o.flags.includes("change_info")))&&(o.checkboxField.input.disabled=!0,(0,n.fc)(o.checkboxField.label,(e=>{Mi(v.ZP.format(a,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[r]&&e.listenerSetter.add(o.checkboxField.input)("change",(()=>{o.checkboxField.checked||this.v.filter((e=>this.toggleWith[r].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(o.checkboxField.label)}}))}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 ns extends T{init(){return is(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new Wo({name:"ChannelPermissionsHeader"});e=new ss({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 Wo({name:"PrivacyExceptions"}),i=new fi({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Xi({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{a(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),a=e=>is(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void Mi("User is no longer participant")}const i=this.slider.createTab(ts);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const o=t.generateContentElement();o.classList.add("chatlist-container");const r=Jm.createChatList({new:!0});o.append(r),(0,n.fc)(r,(e=>{const t=(0,l.Z)(e.target,jm);if(!t)return;const i=t.dataset.peerId.toPeerId();a(i)}),{listenerSetter:this.listenerSetter});const c=(t,i)=>is(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.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...(0,v.v_)(a.map((e=>(0,v.ag)(e))),!1))),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=Jm.addDialogNew({peerId:(0,Bi.Z)(e.peer),container:r,rippleEnabled:!0,avatarSize:48,append:t});c(i.listEl,e)},h=()=>{(0,g.Z)(i.subtitle,(0,v.ag)(p?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[p]))};let u,p=0;const m=()=>(u=new Di({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,r.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return p=e.count,h(),e.participants.length<50||e.count===r.childElementCount}))}),u.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield m():(h(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,m())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class as{constructor(e,t,i){this.peerId=e,this.peerType=t,this.onSelect=i,this.construct()}construct(){return e=this,t=void 0,s=function*(){let{peerId:e,peerType:t,onSelect:i}=this;const s=new Nt({peerId:e}).element,n=A.Z.MANAGERS;void 0===t&&(t=yield n.appPeersManager.getDialogType(e));const a=(t,s=h&&!!t.size)=>{let a=n.appChatsManager.leave(e.toChatId());s&&(a=a.finally((()=>n.appMessagesManager.flushHistory(e)))),i&&i(a)},o=t=>{let s;if(e.isUser())s=n.appMessagesManager.flushHistory(e,!1,h?!!t.size:void 0);else{if(!t.size)return a(t);s=n.appChatsManager.delete(e.toChatId())}i&&i(s)};let r,l,c,d,h;switch(t){case"channel":(yield n.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(r="ChannelDeleteMenu",l="AreYouSureDeleteAndExitChannel",d=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:o}],h=[{text:"DeleteChannelForAll"}]):(r="LeaveChannelMenu",l="ChannelLeaveAlertWithName",c=[s],d=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":r="DeleteChatUser",l="AreYouSureDeleteThisChatWithUser",c=[s],d=[{langKey:"DeleteChatUser",isDanger:!0,callback:o}],h=[{text:"DeleteMessagesOptionAlso",textArgs:[new Nt({peerId:e}).element]}];break;case"saved":r="DeleteChatUser",l="AreYouSureDeleteThisChatSavedMessages",d=[{langKey:"DeleteChatUser",isDanger:!0,callback:o}];break;case"megagroup":case"group":(yield n.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(r="DeleteMegaMenu",l="AreYouSureDeleteAndExit",d=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:o}],h=[{text:"DeleteChat.DeleteGroupForAll"}]):(r="LeaveMegaMenu",l="AreYouSureDeleteAndExitName",c=[s],d=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new _i("popup-delete-chat",{peerId:e,titleLangKey:r,descriptionLangKey:l,descriptionLangArgs:c,buttons:d,checkboxes:h}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var os=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class rs extends T{init(){var e;return os(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId);let s=null!==(e=i.available_reactions)&&void 0!==e?e:[];const n=new Set(s),a=new Wo({caption:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"EnableReactionsChannelInfo":"EnableReactionsGroupInfo"}),o=new xi.Z({toggle:!0,checked:!!n.size}),r=new fi({checkboxField:o,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});a.content.append(r.container);const l=new Wo({name:"AvailableReactions"}),c=t.map((e=>{const t=new xi.Z({toggle:!0,checked:n.has(e.reaction)});this.listenerSetter.add(t.input)("change",(()=>{t.checked?(n.add(e.reaction),o.checked||o.setValueSilently(!0)):(n.delete(e.reaction),!n.size&&o.checked&&o.setValueSilently(!1)),h()}));const i=new fi({checkboxField:t,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return An({row:i,doc:e.static_icon,size:"small"}),l.content.append(i.container),t}));this.listenerSetter.add(r.checkboxField.input)("change",(()=>{o.checked?c.every((e=>!e.checked))&&(c.forEach((e=>e.checked=!0)),h()):(c.forEach((e=>e.checked=!1)),h())}));const d=()=>os(this,void 0,void 0,(function*(){const e=Array.from(n);if([...e].sort().join()===[...s].sort().join())return;const t=yield this.managers.appProfileManager.getCachedFullChat(this.chatId);t&&(t.available_reactions=e),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,e),s=e})),h=(0,Pi.Z)(d,3e3,!1,!0);this.eventListener.addEventListener("destroy",d,{once:!0}),this.scrollable.append(a.container,l.container)}))}}var ls=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class cs extends P{_init(){var e;return ls(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",null!==(e=this.tempId)&&void 0!==e||(this.tempId=0);const t=++this.tempId;this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let i=yield this.managers.appProfileManager.getChatFull(this.chatId,!0);const a=yield this.managers.appChatsManager.getChat(this.chatId),o=yield this.managers.appChatsManager.isBroadcast(this.chatId),r=yield this.managers.appChatsManager.isChannel(this.chatId),l=[],c=e=>{l.push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&l.forEach((e=>e()))})),this.listenerSetter.add(s.Z)("chat_full_update",(e=>ls(this,void 0,void 0,(function*(){this.chatId===e&&(i=(yield this.managers.appProfileManager.getCachedFullChat(e))||i)}))));const d=this.chatId.toPeerId(!0),h=yield this.managers.appChatsManager.hasRights(this.chatId,"change_type"),u=yield this.managers.appChatsManager.hasRights(this.chatId,"change_permissions");{const e=new Wo({noDelimiter:!0}),r=[],l=document.createElement("div");if(l.classList.add("input-wrapper"),this.chatNameInputField=new b.Z({label:o?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new b.Z({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(a.title),this.descriptionInputField.setOriginalValue(i.about),l.append(this.chatNameInputField.container,this.descriptionInputField.container),r.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new gi({peerId:d,inputFields:r,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.content.append(this.editPeer.avatarEdit.container,l),h){const t=new fi({titleLangKey:o?"ChannelType":"GroupType",clickable:()=>{const e=this.slider.createTab(Zi);e.chatId=this.chatId,e.chatFull=i,e.open(),this.listenerSetter.add(e.eventListener)("destroy",s)},icon:"lock",listenerSetter:this.listenerSetter}),s=()=>{let e;t.subtitle.textContent="",e=o?a.username?"TypePublic":"TypePrivate":a.username?"TypePublicGroup":"TypePrivateGroup",t.subtitle.append((0,v.ag)(e))};s(),e.content.append(t.container)}if(h||u){const s=new fi({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(rs);e.chatId=this.chatId,e.open().then((()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)}))},listenerSetter:this.listenerSetter}),n=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,a=()=>{var e;const t=null!==(e=i.available_reactions)&&void 0!==e?e:[];s.subtitle.innerHTML=t.length+"/"+n};a(),e.content.append(s.container)}if(u&&!o){const t=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new fi({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(ns);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>ls(this,void 0,void 0,(function*(){const e=yield this.managers.appChatsManager.getChatTyped(this.chatId);i.subtitle.innerHTML=t.reduce(((t,i)=>t+ +(0,Ri.Z)(e,i,e.default_banned_rights)),0)+"/"+t.length}));n(),e.content.append(i.container),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()}))}if(this.scrollable.append(e.container),(0,n.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const 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}),o&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const t=new xi.Z({text:"PeerInfo.SignMessages",checked:!!a.pFlags.signatures,withRipple:!0});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,t.checked).then((()=>{e()}))})),c((()=>{t.setValueSilently(!!a.pFlags.signatures)})),e.content.append(t.label)}}if(!o){const e=new Wo({});if(!o&&h){const t=new xi.Z({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!t.checked).then((()=>{e()}))}));const s=()=>{t.setValueSilently(r&&!i.pFlags.hidden_prehistory)};s(),c(s),e.content.append(t.label)}e.content.childElementCount&&this.scrollable.append(e.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new Wo({}),t=(0,M.Z)("btn-primary btn-transparent danger",{icon:"delete",text:o?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,n.fc)(t,(()=>{new as(d,void 0,(e=>{const i=(0,Ai.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}r||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{d===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var ds=i(6272);function hs(e){return"+"+(0,ds.u)(e).formatted}var us=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ps extends P{init(){return us(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));this.setTitle(e?"AddContactTitle":"Edit");{const t=new Wo({noDelimiter:!0}),i=[],a=document.createElement("div");if(a.classList.add("input-wrapper"),this.nameInputField=new b.Z({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new b.Z({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=yield this.managers.appUsersManager.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(a.append(this.nameInputField.container,this.lastNameInputField.container),i.push(this.nameInputField,this.lastNameInputField),this.editPeer=new gi({peerId:this.peerId,inputFields:i,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const i=document.createElement("div");i.classList.add("avatar-edit"),i.append(this.editPeer.avatarElem);const n=new xi.Z({text:"Notifications"});n.input.addEventListener("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute(this.peerId)})),this.listenerSetter.add(s.Z)("notify_settings",(e=>us(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,Bi.Z)(e.peer.peer);if(this.peerId===t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const o=document.createElement("div");o.classList.add("profile-name"),o.append(new Nt({peerId:this.peerId}).element);const r=document.createElement("div");if(r.classList.add("profile-subtitle"),r.append((0,v.ag)("EditContact.OriginalName")),t.content.append(i,o,r,a),e){const e=yield this.managers.appUsersManager.getUser(this.peerId),i=new fi({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?hs(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new Nt({peerId:this.peerId}).element]});t.content.append(i.container)}else{const e=new fi({checkboxField:n,listenerSetter:this.listenerSetter}),i=!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1));n.checked=i,t.content.append(e.container)}}else t.content.append(a);this.scrollable.append(t.container),(0,n.fc)(this.editPeer.nextBtn,(()=>us(this,void 0,void 0,(function*(){this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(this.peerId)).phone).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}if(!e){const e=new Wo({}),t=(0,M.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,n.fc)(t,(()=>{new _i("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,A.x)([{langKey:"Delete",callback:()=>{const e=(0,Ai.Z)([t],!0);this.managers.appUsersManager.deleteContacts([this.peerId]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}))}}class ms extends P{init(){this.container.classList.add("add-members-container"),this.nextBtn=F({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()));if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}}))}attachToPromise(e){const t=(0,be.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const i="privacy"===this.peerType;return this.selector=new Ji({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[i?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:i,filterPeerTypeBy:i?["isAnyGroup","isUser"]:void 0,managers:this.managers}),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),t}}var gs=i(2365);function vs(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,v.$d)(t,e?"ScamMessage":"FakeMessage"),t}function fs(e){var t,i,n,a,o;return i=this,n=void 0,o=function*(){const i=[],n=yield s.Z.managers.appPeersManager.getPeer(e);return(null===(t=null==n?void 0:n.pFlags)||void 0===t?void 0:t.verified)&&i.push(function(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const i=document.createElementNS("http://www.w3.org/2000/svg","use");return i.setAttributeNS(null,"href","#verified-check"),i.classList.add("verified-check"),e.append(t,i),e}()),(n.pFlags.fake||n.pFlags.scam)&&i.push(vs(n.pFlags.scam)),i},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}))}var ys=i(1708),bs=i(6074);const ws=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],Ss=["red","green","yellow","blue","violet","pink","cyan","orange"],Cs=[0,7,4,1,6,3,5];function Ls(e,t=!0){if(!e)return"";const i=Cs[Math.abs(+e)%7];return(t?Ss:ws)[i]}function Is(e,t=!1){if(!e)return"";const i=e.trim().split(" ");if(!i[0])return"";const s=[...i[0]][0];if(t||1===i.length)return(0,Zt.Z)(s);const n=[...i[i.length-1]][0];return(0,Zt.Z)(s+n)}var Ms=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Es(e,t,i,n,a=new Image,o=!1){return Ms(this,void 0,void 0,(function*(){const o=yield s.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,n),r=o.result,l=o.cached;let c,d,h;if(a.classList.add("avatar-photo"),l)d=()=>{(0,g.Z)(e,a),e.dataset.color=""};else{const o=s.Z.settings.animationsEnabled;o&&a.classList.add("fade-in");let r=!1;if("photo_big"===n){const s=yield Es(e,t,i,"photo_small");c=s.loadPromise,h=s.thumbImage}else if(i.stripped_thumb){h=new Image,e.classList.add("avatar-relative"),h.classList.add("avatar-photo","avatar-photo-thumbnail");const t=it(i.stripped_thumb);c=Ze(h,t).then((()=>{r||(0,g.Z)(e,h)}))}d=()=>{r=!0,h?e.append(a):(0,g.Z)(e,a),setTimeout((()=>{e.childElementCount&&ke.Z.mutateElement(a,(()=>{e.dataset.color="",o&&a.classList.remove("fade-in"),h&&h.remove()}))}),o?200:0)}}const u=r.then((e=>Ze(a,e))).then(d);return yield c||u,{cached:l,loadPromise:c||u,thumbImage:h}}))}function Ps(e,t,i,s){(0,c.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),s&&e.classList.add(s)}function Ts(e,t,i=!1,n="",a=!1,o){return Ms(this,void 0,void 0,(function*(){const r=s.Z.myId;if(t===r&&i)return void Ps(e,"","","tgico-saved");const l=s.Z.managers;if(t!==le.NM&&t.isUser()){const i=yield l.appUsersManager.getUser(t);if(i&&i.pFlags&&i.pFlags.deleted)return void Ps(e,"",Ls(t),"tgico-deletedaccount")}const c=o?"photo_big":"photo_small",d=yield l.appPeersManager.getPeerPhoto(t),h=!!d,u=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!h||!u||!(yield l.appAvatarsManager.isAvatarCached(t,c))){let a="";if(!t||t===r&&i||(a=Ls(t)),t===le.hj)return void Ps(e,"",a,"tgico-reply_filled");const o=yield n?Is(n):function(e,t=s.Z.managers){var i,n,a,o,r;return n=this,a=void 0,r=function*(){const s=yield t.appPeersManager.getPeer(e);return Is(null!==(i=s.title)&&void 0!==i?i:[s.first_name,s.last_name].filter(Boolean).join(" "))},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}))}(t,l);Ps(e,o,a,"")}return h?Es(e,t,d,c,void 0,a):void 0}))}class ks extends L.Z{constructor(){super(),this.onMouseMove=e=>{let t=this.openedMenu.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.closeBtnMenu()},this.onClick=e=>{this.closeBtnMenu()},this.closeBtnMenu=()=>{this.openedMenu&&(this.openedMenu.classList.remove("active"),this.openedMenu.parentElement.classList.remove("menu-open"),this.menuOverlay&&this.menuOverlay.remove(),this.openedMenu=void 0,this.dispatchEvent("toggle",!1)),this.openedMenuOnClose&&(this.openedMenuOnClose(),this.openedMenuOnClose=void 0),mi.Z||(window.removeEventListener("mousemove",this.onMouseMove),window.removeEventListener("contextmenu",this.onClick)),document.removeEventListener(n.pf,this.onClick),Je.IS_MOBILE_SAFARI||C.Z.removeByType("menu")},d.Z.addEventListener("resize",(()=>{this.openedMenu&&this.closeBtnMenu()}))}isOpened(){return!!this.openedMenu}openBtnMenu(e,t){this.closeBtnMenu(),Je.IS_MOBILE_SAFARI||C.Z.pushItem({type:"menu",onPop:e=>{this.closeBtnMenu()}}),this.openedMenu=e,this.openedMenu.classList.add("active"),this.openedMenu.parentElement.classList.add("menu-open"),this.menuOverlay||(this.menuOverlay=document.createElement("div"),this.menuOverlay.classList.add("btn-menu-overlay"),this.menuOverlay.addEventListener(n.pf,(e=>{(0,a.Z)(e),this.onClick(e)}))),this.openedMenu.parentElement.insertBefore(this.menuOverlay,this.openedMenu),this.openedMenuOnClose=t,mi.Z||(window.addEventListener("mousemove",this.onMouseMove),window.addEventListener("contextmenu",this.onClick,{once:!0})),document.addEventListener(n.pf,this.onClick),this.dispatchEvent("toggle",!0)}}const xs=new ks;const _s=e=>e.touches?e.touches[0]:e,As=window;let Zs=!1;xs.addEventListener("toggle",(e=>{Zs=e}));class Ds{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{mi.Z?As.removeEventListener("touchmove",this.handleMove,{capture:!0}):(As.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{return t=this,i=void 0,n=function*(){const t=_s(e);if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,mi.Z?As.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):As.addEventListener("mousemove",this.handleMove,!1)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||Zs)return void this.reset();this.cancelEvent&&(0,a.Z)(e);const t=_s(e),i=t.clientX,s=t.clientY,n=this.xDown-i,o=this.yDown-s;if(!this.hadMove){if(!n&&!o)return;this.hadMove=!0,mi.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const r=this.onSwipe(n,o,e);void 0!==r&&r&&this.reset()},(0,x.Z)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){mi.Z?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),As.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),As.addEventListener("mouseup",this.reset))}removeListeners(){mi.Z?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),As.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),As.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!mi.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var Fs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Rs{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>Fs(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(Rs.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=()=>Fs(this,void 0,void 0,(function*(){if(i){const e=yield dt({container:t,photo:i,size:Le(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 Es(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(Rs.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Rs.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Rs.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Rs.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Rs.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Rs.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Rs.BASE_CLASS+"-arrow",Rs.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 I.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let o=!1,r=!1;(0,n.fc)(this.container,(e=>Fs(this,void 0,void 0,(function*(){if(r)return void(0,a.Z)(e);if(o)return void(o=!1);if(!i())return;const t=this.container.getBoundingClientRect(),n=e.pageX,l=n-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||l>t.width*s&&l{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];r=!0,Em(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),r=!1}else{const e=n>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,Be.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const l=()=>{o=!0,document.body.addEventListener(mi.Z?"touchend":"click",(e=>{o=!1}),{once:!0})};let c=0,d=0,h=0,u=0;this.swipeHandler=new Ds({element:this.avatars,onSwipe:(e,t)=>{h=e;let i=d+e*-Rs.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!r:(l(),(0,a.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();c=e.width,u=-c*(this.tabs.childElementCount-1),d=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=Rs.TRANSLATE_TEMPLATE.replace("{x}",d+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(c/Rs.SCALE))*(h>=0?1:-1);l(),this.avatars.classList.remove("no-transition"),(0,Be.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 Fs(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 bs.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=>Fs(this,void 0,void 0,(function*(){const t=e.pop();if((0,ys.Z)(t),!i.current){const s=e[0],n=(0,ge.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*Rs.SCALE*i;this.avatars.style.transform=Rs.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(Rs.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()}}Rs.BASE_CLASS="profile-avatars",Rs.SCALE=gs.Z?2:1,Rs.TRANSLATE_TEMPLATE=gs.Z?`translate3d({x}, 0, -1px) scale(${Rs.SCALE})`:"translate({x}, 0)";function Bs(e){return t=this,i=void 0,n=function*(){const t=new Nt;return yield t.update(e),t.element},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}var Ns=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};let Us=(e,t)=>{(0,c.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class Os{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,this.setPeerStatus=(e=!1)=>{const t=this.peerId;if(this.element.classList.toggle("is-me",t===s.Z.myId),t&&(s.Z.myId!==t||!this.isDialog))return mm.setPeerStatus(t,this.subtitle,e,!0,(()=>t===this.peerId),!this.isDialog).then((e=>{e&&e()}))},gs.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new I.Z)}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new Wo({noDelimiter:!0}),this.avatar=new km,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.isDialog=this.isDialog,this.avatar.attachClickEvent(),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 fi({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>Ns(this,void 0,void 0,(function*(){"A"!==e.target.tagName&&(bi((yield this.managers.appProfileManager.getProfileByPeerId(this.peerId)).about),Mi(v.ZP.format("BioCopied",!0)))})),listenerSetter:this.listenerSetter}),this.bio.title.classList.add("pre-wrap"),this.username=new fi({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>Ns(this,void 0,void 0,(function*(){bi("@"+(yield this.managers.appPeersManager.getPeer(this.peerId)).username),Mi(v.ZP.format("UsernameCopied",!0))})),listenerSetter:this.listenerSetter}),this.phone=new fi({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>Ns(this,void 0,void 0,(function*(){bi("+"+(yield this.managers.appUsersManager.getUser(this.peerId)).phone),Mi(v.ZP.format("PhoneCopied",!0))})),listenerSetter:this.listenerSetter}),this.link=new fi({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{bi(this.link.title.textContent),Mi(v.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),this.location=new fi({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 fi({checkboxField:new xi.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute(this.peerId)})),e.add(s.Z)("dialog_notify_settings",(e=>Ns(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),gs.Z&&this.element.append($o()),e.add(s.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(s.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)})),e.add(s.Z)("peer_title_edit",(e=>{e===this.peerId&&this.fillUsername()})),e.add(s.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(s.Z)("contacts_update",(e=>Ns(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(s.Z)("avatar_update",(e=>{this.peerId===e&&this.setAvatar()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}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!==s.Z.myId||!this.isDialog}setAvatar(){return Ns(this,void 0,void 0,(function*(){if(this.canBeDetailed()&&(yield this.managers.appPeersManager.getPeerPhoto(this.peerId))){const e=this.avatars;return this.avatars=new Rs(this.scrollable,this.managers),yield this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(gs.Z&&this.scrollable.container.classList.add("parallax"))}gs.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),yield this.avatar.updateWithOptions({peerId:this.peerId}),this.section.content.prepend(this.avatar,this.name,this.subtitle)}))}fillUsername(){return Ns(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerUsername(e);return Us(t,this.username)}}))}fillUserPhone(){return Ns(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appUsersManager.getUser(e);return Us(t.phone?hs(t.phone):void 0,this.phone)}}))}fillNotifications(){return Ns(this,void 0,void 0,(function*(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else(0,Be.T2)((()=>{e.container.style.display="none"}))}))}fillRows(){return Ns(this,void 0,void 0,(function*(){const e=this.peerId;yield Promise.all([this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(),(()=>Ns(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([Bs({peerId:e,dialog:this.isDialog}),fs(e)]);(0,g.Z)(this.name,t),this.name.append(...i)})))(),this.setPeerStatus(!0)])}))}fillProfileElements(){return Ns(this,void 0,void 0,(function*(){this.cleaned&&(this.cleaned=!1,this.cleanupHTML(),yield Promise.all([this.setAvatar(),this.fillRows()]))}))}_setMoreDetails(e,t){return Ns(this,void 0,void 0,(function*(){if(Us(t.about?(0,ei.Z)(t.about):void 0,this.bio),!e.isUser()){const i=yield this.managers.appChatsManager.getChat(e.toChatId());if(i.username)Us("https://t.me/"+i.username,this.link);else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&Us(e.link,this.link)}}const i=t.location;"channelLocation"==(null==i?void 0:i._)&&Us(i.address,this.location),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4)}))}setMoreDetails(e){return Ns(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const t=this.peerId,i=this.threadId;if(!t||(yield this.managers.appPeersManager.isRestricted(t))||!this.canBeDetailed())return;const s=yield this.managers.acknowledged.appProfileManager.getProfileByPeerId(t,e),n=s.result.then((e=>Ns(this,void 0,void 0,(function*(){this.peerId!==t||this.threadId!==i||(yield this.managers.appPeersManager.isRestricted(t))||(yield this._setMoreDetails(t,e))}))));s.cached&&(yield n)}))}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup()}}var Hs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const zs={};class Gs extends P{constructor(e){super(e,!1),this.threadId=0}init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,M.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);const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.title.append((0,v.ag)("Profile")),this.editBtn=E("edit"),a.append(this.title,this.editBtn);const o=document.createElement("div");o.classList.add("transition-item");const r=this.title.cloneNode();r.append((0,v.ag)("PeerInfo.SharedMedia")),o.append(r),i.append(a,o),this.header.append(i),this.profile=new Os(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",e),this.searchSuper.container.classList.toggle("is-full-viewport",e),c(+e),e||this.searchSuper.cleanScrollPositions()},c=(0,S.v)(i,"slide-fade",400,null,!1);c(0),(0,n.fc)(this.closeBtn,(e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),c(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,n.fc)(this.editBtn,(e=>{let t;t=this.peerId.isAnyChat()?this.slider.createTab(cs):this.slider.createTab(ps),t&&(t instanceof cs?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.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.renderNewMessages(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.renderNewMessages(e)})),this.searchSuper=new ga({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=>{let t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{d.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const d=F({icon:"addmember_filled"});this.content.append(d),(0,n.fc)(d,(()=>Hs(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,l;if(t.length>1)n="AddMembersAlertTitle",a=[(0,v.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new Nt({peerId:e}).element),t})),i||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new Nt({peerId:t[0]}).element),r=[e],i||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new Nt({peerId:t[0]}).element],checked:!0}])}r.push(new Nt({peerId:e}).element),new _i("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&Ei({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(ms);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 Xi({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})}renderNewMessages(e){return Hs(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e;if(zs[t])for(const i of this.searchSuper.mediaTabs){const s=i.inputFilter,n=zs[t][s];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],s).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===t&&-1!==this.searchSuper.usedFromHistory[s]&&(this.searchSuper.usedFromHistory[s]+=a.length,this.searchSuper.performSearchResult(a,i,!1)))}}))}deleteDeletedMessages(e,t){if(!this.init&&zs[e]){for(const i of t)for(const t of this.searchSuper.mediaTabs){const s=t.inputFilter,n=zs[e][s];if(!n)continue;const a=n.findIndex((e=>e.mid===i));if(-1!==a&&(n.splice(a,1),this.peerId===e)){const t=this.searchSuper.tabs[s].querySelector(`[data-mid="${i}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[s]>=a+1&&--this.searchSuper.usedFromHistory[s]}}this.scrollable.onScroll()}}cleanupHTML(){return Hs(this,void 0,void 0,(function*(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",(yield this.searchSuper.canViewMembers())&&(yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")))}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var i;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,historyStorage:null!==(i=zs[e])&&void 0!==i?i:zs[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){return Hs(this,void 0,void 0,(function*(){this.peerChanged&&(this.peerChanged=!1,yield this.cleanupHTML(),yield this.toggleEditBtn(),yield this.profile.fillProfileElements())}))}toggleEditBtn(){return Hs(this,void 0,void 0,(function*(){let e;e=this.peerId.isUser()?this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId())):yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}destroy(){this.destroyable=!0,this.onCloseAfterTimeout(),this.profile.destroy(),this.searchSuper.destroy()}}const Vs="is-right-column-shown",Ks=new class extends _{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,d.Z.addEventListener("changeScreen",((e,t)=>{t===d._.medium&&e!==d._.mobile&&this.toggleSidebar(!1)})),d.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(Gs,!0);return e.slider=this,e}replaceSharedMediaTab(e){let t=this.sharedMediaTab;t?e?(t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):t.container.remove():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(Vs);let s;if(void 0!==e?e?i||(s=!0):i&&(s=!0):s=!0,!s)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=mm.selectTab(i?1:2,t);return document.body.classList.toggle(Vs,e),n}};R.GO.appSidebarRight=Ks;const Ws=Ks;class js extends P{init(){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)}open(e){const t=Object.create(null,{open:{get:()=>super.open}});return i=this,s=void 0,a=function*(){const i=t.open.call(this),s=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const n=document.createElement("h3");(0,c.Z)(n,(0,Zt.Z)(s.poll.question));const a=s.results.results.map((e=>e.voters/s.results.total_voters*100));Ys(a);const o=document.createDocumentFragment();return s.results.results.forEach(((t,i)=>{if(!t.voters)return;const n=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const d=document.createElement("div");(0,c.Z)(d,(0,Zt.Z)(r.text));const h=document.createElement("div");h.innerText=Math.round(a[i])+"%",l.append(d,h);const u=Jm.createChatList();u.classList.add("poll-results-voters"),Jm.setListClickListener(u,(()=>{Ws.onCloseBtnClick()}),void 0,!0),u.style.minHeight=50*Math.min(t.voters,4)+"px",o.append(n,l,u);let p,m=4,g=!1,f=t.voters-4;const y=()=>{g||(g=!0,this.managers.appPollsManager.getVotes(e,r.option,p,m).then((e=>{e.votes.forEach((e=>{const{dom:t}=Jm.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()})),p&&(f-=e.votes.length,b.lastElementChild.replaceWith((0,v.ag)("PollResults.LoadMore",[Math.min(20,f)]))),p=e.next_offset,m=20,f&&e.votes.length||b.remove()})).finally((()=>{g=!1})))};if(y(),f<=0)return;const b=document.createElement("div");b.classList.add("poll-results-more","show-more","rp-overflow"),b.addEventListener("click",y),(0,we.Z)(b);const w=document.createElement("div");w.classList.add("tgico-down"),b.append(w,(0,v.ag)("PollResults.LoadMore",[Math.min(20,f)])),o.append(b)})),this.resultsDiv.append(n,o),Ws.toggleSidebar(!0).then((()=>{})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}const $s="stacked-avatars";class qs{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add($s),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("stacked-avatars-avatar-container"));let a=n.firstElementChild;a||(a=new km,a.classList.add("avatar-"+this.avatarSize,"stacked-avatars-avatar"),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()))}}let Qs=0;const Ys=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}}};s.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)}))})),d.Z.addEventListener("resize",(()=>{nn.setMaxLength(),nn.resizePolls()})),d.Z.addEventListener("changeScreen",(()=>{nn.setMaxLength()}));const Js=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),Xs===e&&en===t&&tn===i&&(Xs=en=null,tn=0)}),200)};let Xs,en,tn,sn=!1;class nn 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=zi.width<=360?zi.width-120:d.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,o=function*(){Qs||(Qs=document.getElementById("poll-line").getTotalLength(),nn.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 o=this.isMultiple?'':"",r=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${o}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${r}`,(0,c.Z)(this.firstElementChild,(0,Zt.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,c.Z)(t,(0,Zt.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,v.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 n=2,a=7,o=2*Math.PI*a,r=document.createElementNS("http://www.w3.org/2000/svg","circle");r.classList.add("poll-quiz-timer-circle"),r.setAttributeNS(null,"cx","16"),r.setAttributeNS(null,"cy","16"),r.setAttributeNS(null,"r",""+a),r.setAttributeNS(null,"stroke-width",""+n),i.append(r),this.descDiv.append(i);const l=1e3*e.close_period,c=1e3*(e.close_date-(yield s.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(c-e)/l,s=(c-e)/1e3+1|0;t.innerHTML=gt(s),s<=5&&(t.style.color="#ee545c",r.style.stroke="#ee545c"),r.style.strokeDashoffset=o+i*o,r.style.strokeDasharray=`${o} ${o}`,e>=c&&(clearInterval(this.quizInterval),t.innerHTML="",r.style.strokeDashoffset=o,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 l=document.createElement("div");l.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append((0,v.ag)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",l.append(this.viewResults,this.votersCountDiv),this.append(l),this.viewResults.addEventListener("click",(e=>{(0,a.Z)(e),Ws.isTabExists(js)||Ws.createTab(js).open(this.message)})),(0,we.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,v.ag)("Chat.Poll.SubmitVote")),(0,we.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,n.fc)(this.sendVoteBtn,(e=>{(0,a.Z)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then((()=>{this.chosingIndexes.length=0,this.answerDivs.forEach((e=>{e.classList.remove("is-chosing")}))}))})),l.append(this.sendVoteBtn));const d=!(e.chosenIndexes.length||this.isClosed);d&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),d&&(this.setVotersCount(t),(0,n.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{l(o.next(e))}catch(e){n(e)}}function r(e){try{l(o.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}l((o=o.apply(e,t||[])).next())}));var e,t,i,o}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,n.fc)(t,(i=>{(0,a.Z)(i),t.classList.add("active"),((e,t,i)=>{Xs&&Js(Xs,en,tn);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,c.Z)(a,(0,ei.Z)(e,{entities:t})),mm.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),Xs=s,en=i,tn=window.setTimeout((()=>{Js(s,i,tn)}),mi.Z?5e3:7e3),sn||(sn=!0,mm.addEventListener("peer_changed",(()=>{Xs&&Js(Xs,en,tn)})))})(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,n.tH)(t)}}}clickHandler(e){const t=(0,r.Z)(e.target,"poll-answer");if(!t)return;(0,a.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 a,o;if(s.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(a=e.results)||void 0===a?void 0:a.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===(o=this.quizTimer)||void 0===o?void 0:o.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),(0,g.Z)(this.typeDiv,(0,v.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,n.fc)(this,this.clickHandler):(0,n.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&&Re(this,"",!this.isRetracted,340),(0,Be.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 qs({avatarSize:16});i.render(t),(0,g.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,Be.T2)(e):e()}let n;e=e.slice(),Ys(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,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,g.Z)(this.votersCountDiv,(0,v.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]*nn.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*nn.MAX_OFFSET)}}nn.MAX_OFFSET=-46.5,nn.MAX_LENGTH=0,customElements.define("poll-element",nn);var an=i(2064);class on{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function rn(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}const ln=new Set(["all","web","webk"]),cn=new Set;function dn(e){return e.find((e=>ln.has(e.platform)&&!cn.has(e.reason)))}function hn(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function un(e){return!(!e.restriction_reason||(t=e.restriction_reason,!dn(t)));var t}var pn=i(1346),mn=i(2614);const gn={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function vn(e,t){const i=function(e,t=2){e||(e=1);let i=[];const 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*=t.m,e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>v.ZP.format(gn[e.type],!0,[e.duration])));return(0,v.v_)(e,!1,t)}const s=i.map((e=>(0,v.ag)(gn[e.type],[e.duration]))),n=document.createElement("span");return n.append(...(0,v.v_)(s,!1)),n}const fn={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:"3672990"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"؋",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8893",max_amount:"88930176"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11408",max_amount:"114088432"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"դր.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"41129",max_amount:"411293180"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"12503",max_amount:"125036607"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"145",max_amount:"1451625"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ман.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"171",max_amount:"1711164"},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:"187",max_amount:"1873042"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"৳",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"9415",max_amount:"94154281"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"лв.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"186",max_amount:"1869710"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"139",max_amount:"1399458"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"692",max_amount:"6926834"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"518",max_amount:"5182986"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"129",max_amount:"1290450"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"95",max_amount:"954630"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"926",max_amount:"9268013"},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:"669",max_amount:"6692902"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"410927",max_amount:"4109270000"},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:"69166",max_amount:"691668622"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kč",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2367",max_amount:"23674601"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"712",max_amount:"7120540"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5497",max_amount:"54971796"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"د.ج.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14655",max_amount:"146557782"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ج.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1879",max_amount:"18794601"},EUR:{code:"EUR",title:"Euro",symbol:"€",native:"€",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"95",max_amount:"957150"},GBP:{code:"GBP",title:"British Pound",symbol:"£",native:"£",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"82",max_amount:"822531"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"293",max_amount:"2939866"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"781",max_amount:"7811180"},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:"7845675"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2476",max_amount:"24763692"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"721",max_amount:"7210988"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"37819",max_amount:"378197939"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1490695",max_amount:"14906950000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"₪",native:"₪",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"348",max_amount:"3480155"},INR:{code:"INR",title:"Indian Rupee",symbol:"₹",native:"₹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"7894",max_amount:"78945050"},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:"133",max_amount:"1336303"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15175",max_amount:"151753529"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"¥",native:"¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"136",max_amount:"1362010"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"11787",max_amount:"117879251"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"7950",max_amount:"79509472"},KRW:{code:"KRW",title:"South Korean Won",symbol:"₩",native:"₩",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1297",max_amount:"12971249"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"₸",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47177",max_amount:"471777437"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ل.ل.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"152338",max_amount:"1523381760"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"රු.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"36271",max_amount:"362713465"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"د.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1018",max_amount:"10188182"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1928",max_amount:"19284237"},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:"312408",max_amount:"3124087599"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4614",max_amount:"46144273"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1534",max_amount:"15349670"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2015",max_amount:"20158770"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"440",max_amount:"4406499"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6383",max_amount:"63830365"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"₦",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"41513",max_amount:"415132815"},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:"3612",max_amount:"36125609"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"990",max_amount:"9902585"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"नेरू",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12731",max_amount:"127318435"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"160",max_amount:"1603695"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"100",max_amount:"1007566"},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:"381",max_amount:"3818809"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"₱",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5499",max_amount:"54994501"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"₨",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"20651",max_amount:"206515440"},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:"446",max_amount:"4466920"},PYG:{code:"PYG",title:"Paraguayan Guaraní",symbol:"PYG",native:"₲",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6909",max_amount:"69095662"},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:"3640988"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"473",max_amount:"4736501"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"дин.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11252",max_amount:"112520089"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"руб.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"5282",max_amount:"52825030"},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:"3752099"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1022",max_amount:"10224070"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"139",max_amount:"1390698"},THB:{code:"THB",title:"Thai Baht",symbol:"฿",native:"฿",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3529",max_amount:"35290499"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"977",max_amount:"9773409"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1667",max_amount:"16673549"},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:"684",max_amount:"6847347"},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:"2973",max_amount:"29735499"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233200",max_amount:"2332000087"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"₴",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"2974",max_amount:"29741945"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3788",max_amount:"37883728"},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:"3979",max_amount:"39794286"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1094209",max_amount:"10942099215"},VND:{code:"VND",title:"Vietnamese Đồng",symbol:"₫",native:"₫",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23270",max_amount:"232700000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ر.ي.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25024",max_amount:"250249914"},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:"1624",max_amount:"16246189"}};function yn(e,t,i){const s=(e=+e)<0,n=fn[t];if(!n)throw new Error("CURRENCY_WRAP_INVALID");const a=e/Math.pow(10,n.exp);let o=n.exp;"IRR"==t&&Math.floor(a)==a&&(o=0);let r=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,l="";return l=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."),l[0].length>3&&(l[0]=l[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(l[1]||"").lengthSn(this,void 0,void 0,(function*(){return t?(0,Rt.Z)(e,t):new Nt({peerId:e}).element}));switch(a._){case"messageActionPhoneCall":l+="."+a.type,r=[vn(a.duration,t)];break;case"messageActionGroupCall":l+="."+a.type,r=[],l.endsWith("You")||e.pFlags.post||r.push(d(e.fromId,t)),void 0!==a.duration?r.push(vn(a.duration,t)):r.push(wn(e));break;case"messageActionInviteToGroupCall":{const i=[e.fromId,a.users[0].toPeerId()];let n="Chat.Service.VoiceChatInvitation";const l=s.Z.myId;i[0]===l?n+="ByYou":i[1]===l&&(n+="ForYou"),(0,k.Z)(i,l),o=n,r=i.map((e=>d(e,t))),r.push(wn(e));break}case"messageActionGroupCallScheduled":{const i=new Date,n=new Date(1e3*a.schedule_date),l=(n.getTime()-i.getTime())/864e5,h=new Date(i);h.setDate(h.getDate()+1);const u=yield c.appPeersManager.isBroadcast(e.peerId);o=u?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",r=[];const p=s.Z.myId;e.fromId===p?o+="You":u||r.push(d(e.fromId,t));let m,g=[];l<1&&n.getDate()===i.getDate()?m="TodayAtFormattedWithToday":l<2&&n.getDate()===h.getDate()?m="Time.TomorrowAt":(m="formatDateAtTime",g.push(new v.ZP.IntlDateElement({date:n,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),g.push(V(n));const f=(0,v.ag)(m,g);r.push(f);break}case"messageActionChatCreate":{const i=s.Z.myId;e.fromId===i?l+="You":r=[d(e.fromId,t)];break}case"messageActionPinMessage":{const i=e.peerId,s=yield c.appMessagesManager.getMessageByPeer(i,e.reply_to_mid);r=[d(e.fromId,t)],s?r.push(Cn(s,t)):(o="ActionPinnedNoText",e.reply_to_mid&&c.appMessagesManager.fetchMessageReplyTo(e));break}case"messageActionChatJoinedByRequest":{const i=yield c.appPeersManager.isBroadcast(e.peerId);e.pFlags.out?o=i?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=i?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",r=[d(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":r=[d(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":r=[],"messageActionChatEditTitle"===a._&&r.push(d(e.fromId,t)),r.push(t?a.title:(0,mn.Z)((0,Zt.Z)(a.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const i=a.users||[a.user_id];if(r=[d(e.fromId,t)],i.length>1){const e=(0,v.v_)(yield Promise.all(i.map((e=>d(e.toPeerId(),t)))),!1,t);if(t)r.push(...e);else{const t=document.createElement("span");t.append(...e),r.push(t)}}else r.push(d(i[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=(0,ei.Z)(a.domain,{entities:[{_:"messageEntityUrl",length:a.domain.length,offset:0}]});r=[(0,mn.Z)(e)];break}case"messageActionPaymentSent":if(o="PaymentSuccessfullyPaidNoItem",r=[yn(a.total_amount,a.currency),d(e.peerId,t)],e.reply_to_mid){const s=yield c.appMessagesManager.getMessageByPeer((null===(i=e.reply_to)||void 0===i?void 0:i.reply_to_peer_id)?(0,Bi.Z)(e.reply_to.reply_to_peer_id):e.peerId,e.reply_to_mid);s?(o="PaymentSuccessfullyPaid",r.push(Cn(s,t).then((e=>(e.classList.add("is-receipt-link"),e))))):c.appMessagesManager.fetchMessageReplyTo(e)}break;default:o=v.Hz[l]||`[${a._}]`}o||(o=v.Hz[l],void 0===o&&(o="["+l+"]"));const h=r&&(yield Promise.all(r));return t?v.ZP.format(o,!0,h):(0,v.$d)(n,o,h)}}))}(e,t)}catch(e){return console.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}));var i,n,a,o}function In(e,t=e.message,i,n,a,o){return r=this,l=void 0,d=function*(){const r=[];let l=!1;const c=(e,t)=>{if(e){if(void 0===t&&l)return;t=n?v.ZP.format(e,!0):(0,v.ag)(e)}if(n)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}},d=s.Z.managers.appMessagesManager,h=un(e);let u=e.totalEntities;if(e.media&&!h){(0,si.Z)(e);let s=!0;if(e.grouped_id){if(i){const t=yield d.getMidsByMessage(e);if(i.length===t.length){for(const e of t)if(!i.includes(e)){s=!1;break}}else s=!1}if(s){const i=yield d.getAlbumText(e.grouped_id);t=i.message,u=i.totalEntities,o||(c("AttachAlbum"),l=!0)}}else s=!1;if(!s&&!o||!t){const i=e.media;switch(i._){case"messageMediaPhoto":c("AttachPhoto");break;case"messageMediaDice":c(void 0,n?i.emoticon:(0,Zt.Z)(i.emoticon));break;case"messageMediaVenue":t=i.title,c("AttachLocation");break;case"messageMediaGeo":c("AttachLocation");break;case"messageMediaGeoLive":c("AttachLiveLocation");break;case"messageMediaPoll":const e="📊 "+(i.poll.question||"poll");c(void 0,n?e:(0,Zt.Z)(e));break;case"messageMediaContact":c("AttachContact");break;case"messageMediaGame":{const e="🎮 "+i.game.title;c(void 0,n?e:(0,Zt.Z)(e));break}case"messageMediaDocument":{const e=i.document;if("video"===e.type)c("AttachVideo");else if("voice"===e.type)c("AttachAudio");else if("gif"===e.type)c("AttachGif");else if("round"===e.type)c("AttachRound");else if("sticker"===e.type){const i=r.length;if(e.stickerEmojiRaw){const t=e.stickerEmojiRaw+" ";c(void 0,n?t:(0,Zt.Z)(t))}c("AttachSticker");const s=r.splice(i,2);if(n)r.push(s[0]+s[1]);else{const e=window.document.createElement("span");e.append(...s),r.push(e)}t=""}else if("audio"===e.type){const t=e.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);c(void 0,n?i:(0,Zt.Z)(i))}else c(void 0,n?e.file_name:(0,Zt.Z)(e.file_name));break}case"messageMediaInvoice":c(void 0,n?i.title:(0,Zt.Z)(i.title));break;case"messageMediaUnsupported":c(v.nK)}}const a=r.length;for(let e=1;e{m&&!m()||(p.forEach((e=>e.remove())),r&&r.classList.toggle("is-round",u))})),h}))}class Tn extends on{constructor(e){super(e,((e,t="",i)=>Mn(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const s=yield Pn({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:i});this.container.classList.toggle("is-media",s),s?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e}}function kn(e,t,i,s){const n=new Tn("reply"),a=n.fill(e,t,i);if(s){const e=Ls(s,!1),[t,i,a]=(0,an.oo)(e);n.container.style.setProperty("--override-color",`${t}, ${i}, ${a}`),n.container.classList.add("is-overriding-color")}return{container:n.container,fillPromise:a}}var xn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function _n({set:e,lazyLoadQueue:t,container:i,group:n,autoplay:a,width:o,height:r,managers:l=s.Z.managers}){var c;return xn(this,void 0,void 0,(function*(){if(null===(c=e.thumbs)||void 0===c?void 0:c.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>xn(this,void 0,void 0,(function*(){const t=yield l.appStickersManager.getStickerSetThumbDownloadOptions(e),s=u.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return s.then((t=>{ri.Z.loadAnimationWorker({container:i,loop:!0,autoplay:a,animationData:t,width:o,height:r,needUpscale:!0,name:"setThumb"+e.id},n)}));{let t;return e.pFlags.videos?(t=ut(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),s.then((s=>{Ae(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&p.Z.addAnimation(t,n)}))}))}}))});const s=l.appStickersManager.getStickerSet(e),d=yield s;"documentEmpty"!==d.documents[0]._&&pi({doc:d.documents[0],div:i,group:n,lazyLoadQueue:t,managers:l,width:o,height:r})}))}function An({doc:e,row:t,size:i,managers:s}){const n=t.media,a=t.createMedia("small");n&&a.classList.add("hide");const o=n?[]:void 0,r="small"===i?32:48,l=pi({div:a,doc:e,width:r,height:r,loadPromises:o,managers:s}).then((({render:e})=>e));return o&&Promise.all(o).then((()=>{a.classList.remove("hide"),n.remove()})),l}var Zn=i(3624),Dn=i(2648);function Fn(e,t,i,s){return void 0===s&&(s=e.parentElement===t?(0,Dn.Z)(e):-1),s!==i&&(-1!==s&&si?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}var Rn=i(6519);class Bn{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=(0,Zn.k)(),(0,x.Z)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id,!0)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{if(!t()||void 0!==i&&!i)return e(!1);this._updateList(),e(!0)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,i,s=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,s,n,i),n}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=!1,i=this.get(e),s){return n=this,a=void 0,r=function*(){if(!i)return;i.index=yield this.getIndex(i),this.onUpdate&&this.onUpdate(i);const e=(0,Rn.Z)(this.sorted,i,"index");if(!t&&this.onSort){const t=this.middleware.get();(s||this.updateElementWith)((()=>{t()&&this.onSort(i,e)}))}},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}));var n,a,o,r}}var Nn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Un extends Bn{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=>Nn(this,void 0,void 0,(function*(){const t=ce(yield this.managers.appUsersManager.getUser(e.id));(0,g.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;Fn(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=Jm.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:Be.T2,updateListWith:e=>Nn(this,void 0,void 0,(function*(){return(0,Ne.Z)(this.list)?(yield(0,He.e9)(),(0,Ne.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,(0,x.Z)(this,e),this.list=Jm.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),Un.SORT_INTERVAL)};i()}}Un.SORT_INTERVAL=3e4;let On=!1,Hn=0;function zn(){Hn&&clearTimeout(Hn),Hn=window.setTimeout((()=>{Hn=0,On=!1}),400),On=!0}function Gn(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e),n=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(Je.IS_APPLE&&mi.Z){let i;const o={capture:!0},r=()=>{clearTimeout(i),n("touchmove",r,o),n("touchend",r,o),n("touchcancel",r,o)};s("touchstart",(n=>{n.touches.length>1?r():(s("touchmove",r,o),s("touchend",r,o),s("touchcancel",r,o),i=window.setTimeout((()=>{On?r():(t(n.touches[0]),r(),xs.isOpened()&&e.addEventListener("touchend",a.Z,{once:!0}))}),400))}))}else s("contextmenu",mi.Z?i=>{t(i),xs.isOpened()&&e.addEventListener("touchend",a.Z,{once:!0})}:t)}var Vn=i(3444);function Kn(e){let t=!1;return new Ds(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,r.Z)(t.target,"progress-line")&&!(0,Vn.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,n)=>{if(!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,a.Z)(n),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Wn(e){return Kn(Object.assign(Object.assign({},e),{onSwipe:(t,i,s)=>{if(Math.abs(t)>50)return e.onSwipe(t,i,s),zn(),!0}}))}const jn=e=>{if(e.element)return e.element;const{icon:t,text:i,onClick:s,checkboxField:o,noCheckboxClickListener:l}=e,c=document.createElement("div");c.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:"");let d=e.textElement;d||(d=e.textElement=i?(0,v.ag)(i,e.textArgs):document.createElement("span"),e.regularText&&(d.innerHTML=e.regularText)),d.classList.add("btn-menu-item-text"),c.append(d);const h=!!o||!!e.keepOpen;return s&&(0,n.fc)(c,(e=>{(0,a.Z)(e);const t=(0,r.Z)(e.target,"btn-menu");t&&!t.classList.contains("active")||!1!==s(e)&&(h||xs.closeBtnMenu(),o&&!l&&(o.checked="radio"===o.input.type||!o.checked))}),e.options),o&&c.append(o.label),e.element=c},$n=(e,t)=>{const i=document.createElement("div");i.classList.add("btn-menu"),t&&e.forEach((e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}}));const s=e.map(jn);return i.append(...s),i};class qn extends Xi{constructor(e,t,i=!1){super({peerTypes:["dialogs","contacts"],onSelect:i?t:i=>{return s=this,n=void 0,o=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}mm.setInnerPeer({peerId:i}),mm.chat.input.initMessagesForward(e)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}var Qn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Yn{constructor(e,t,i,s){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.construct()}construct(){return Qn(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:n}=this;const a=new Nt({peerId:e}).element,o=A.Z.MANAGERS;t=t.slice();const r=(s,a)=>{n&&n(),"scheduled"===i?o.appMessagesManager.deleteScheduledMessages(e,t):o.appMessagesManager.deleteMessages(e,t,!!s.size||a)};let l,c,d,h,u,p=[];if(1===t.length?l="DeleteSingleMessagesTitle":(l="DeleteMessagesTitle",c=[(0,v.ag)("messages",[t.length])]),d=(yield o.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",u=[{langKey:"Delete",isDanger:!0,callback:r}],e===s.Z.myId||"scheduled"===i);else if(e.isUser())p.push({text:"DeleteMessagesOptionAlso",textArgs:[a]});else{const i=yield o.appChatsManager.getChat(e.toChatId()),n=(0,Ri.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield Ki(t,(t=>Qn(this,void 0,void 0,(function*(){return(yield o.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?p.push({text:"DeleteForAll"}):(p.push({text:"DeleteMessagesOption"}),d="DeleteMessagesTextGroup",h=[(0,v.ag)("messages",[i.length])]))}else u[0].callback=e=>r(e,!0)}(0,A.x)(u),new _i("popup-delete-chat",{peerId:e,titleLangKey:l,titleLangArgs:c,descriptionLangKey:d,descriptionLangArgs:h,buttons:u,checkboxes:p}).show()}))}}class Jn extends _i{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()}}var Xn=i(8799);function ea(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var ta=i(5975),ia=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const sa=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class na extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,r.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,o=t;const l=(e,t=!0)=>{const n=+e.dataset.mid;if(!n||!e.dataset.peerId)return;const a=e.dataset.peerId.toPeerId();(0,Ne.Z)(o)||(o=e);let r=i.get(a);if(r||i.set(a,r=new Set),r.has(n))return;const c=this.isMidSelected(a,n);if(void 0===s&&(s=!c),r.add(n),s&&!c||!s&&c){const s=sa(i);if(this.toggleByElement&&t){s<2&&(0,ta.Z)(e,o)&&(o=e);const t=this.getElementsBetween(o,e);t.length&&t.forEach((e=>{l(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 c=!1;const d=e=>{c||(ea(),c=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",d),void this.listenerSetter.removeManual(document,"mouseup",h,u)):void l(t)},h=e=>{i.size&&(0,n.fc)(window,a.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",d),ea()},u={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",d),this.listenerSetter.add(document)("mouseup",h,u)},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,r.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let l=o.indexOf(e),c=o.indexOf(t);return n||([c,l]=[l,c]),o.slice(l+1,c)},this.cancelSelection=e=>ia(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),ea(),e&&(this.doNotAnimate=void 0)})),(0,x.Z)(this,e),this.navigationType="multiselect-"+(0,wi.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return mi.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void Gn(e,(t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,a.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),ea();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)}),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 xi.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(),Re(e,"is-selected",!1,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){return ia(this,void 0,void 0,(function*(){const t=this.selectedMids.size;if(!t&&!e)return;let i=!t,s=!t,n=!t;for(const[e,t]of this.selectedMids){const n=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(n,Array.from(t));if(i=a.cantForward,s=a.cantDelete,i&&s)break}this.onUpdateContainer&&this.onUpdateContainer(i,s,n)}))}toggleSelection(e=!0,t=!1){const i=this.isSelecting,s=this.selectedMids.size;if(this.isSelecting=!!s||t,i===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),mi.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),i&&ea()),(0,Xn.Z)();const n=!!s||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),Je.IS_MOBILE_SAFARI||(n?C.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):C.Z.removeByType(this.navigationType)),t&&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(),Re(e,"is-selected",t,200)}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return sa(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 aa extends na{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,r.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,g.Z)(this.selectionCountEl,(0,v.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(Re(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,(()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)})),Re(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=E(`close ${e}-cancel`,{noRipple:!0});(0,n.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=E(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,n.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),mm.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=E(`forward ${e}-forward`),(0,n.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new qn(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=E(`delete danger ${e}-delete`),(0,n.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new Yn(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 oa extends na{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,r.Z)(e,"grouped-item")||(0,r.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,r.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)=>ia(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>ia(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:a}=yield this.chat.input.center(t);Re(this.listenElement,"is-selecting",e,t?200:0,(()=>{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 o=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,M.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,v.ag)("MessageScheduleSend")),(0,n.fc)(this.selectionSendNowBtn,(()=>{new Jn(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,M.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,v.ag)("Forward")),(0,n.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new qn(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,M.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,v.ag)("Delete")),(0,n.fc)(this.selectionDeleteBtn,(()=>{new Yn(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!==o&&(i.style.transform=`translateX(${-o}px)`,s.style.transform=`translateX(${o}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!==o&&(this.selectionLeft.style.transform=`translateX(-${o}px)`,this.selectionRight.style.transform=`translateX(${o}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,g.Z)(this.selectionCountEl,(0,v.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>ia(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("bubble-first")||e.classList.contains("avoid-selection"))}}var ra=i(7401);function la(e){const t=(0,Ft.Z)(e.description||"",150,180);return(0,ei.Z)(t)}function ca(e){let t=e.title||e.author||e.site_name||"";return t=(0,Ft.Z)(t,80,100),(0,ei.Z)(t,{noLinks:!0,noLinebreaks:!0})}var da=i(2342),ha=i(6566);function ua({pageX:e,pageY:t},i,s,n){const a=Array.from(i.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||i;let{scrollWidth:o}=a,{scrollHeight:r}=i;const l=document.body.getBoundingClientRect(),c=l.width,h=l.height;let u=8,p=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(p+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),s=d.Z.isMobile?"right":"left";let v="top";const f=h-r-m,y=c-o-p,b=g,w={x:{left:e,right:Math.min(y,e-o)},intermediateX:"right"===s?b:y,y:{top:t,bottom:t-r},intermediateY:f},S={left:w.x.left+o+p<=c,right:w.x.right>=g},C={top:w.y.top+r+m<=h,bottom:w.y.bottom-m>=m};{let e;e=S[s]?w.x[s]:(s="center",w.intermediateX),i.style.left=e+"px"}{let e;e=C[v]?w.y[v]:(v="center",w.intermediateY),i.style.top=e+"px"}return i.className=i.className.replace(/(top|center|bottom)-(left|center|right)/g,""),i.classList.add(("center"===v?v:"bottom")+"-"+("center"===s?s:"left"===s?"right":"left")),{width:o,height:r}}var pa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ma{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{mm.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,n.tH)(this.searchSuper.selection.selectionForwardBtn):new qn({[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,n.tH)(this.searchSuper.selection.selectionDeleteBtn):new Yn(this.peerId,[this.mid],"chat")},this.managers=t.managers;mi.Z||Gn(e,(e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,r.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),(()=>{pa(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=>pa(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"),ua(e,this.element),xs.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}}),i)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>pa(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:()=>pa(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=$n(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class ga{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new ye,this.middleware=(0,Zn.k)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,he.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,x.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new I.Z,this.searchContextMenu=new ma(this.container,this,this.listenerSetter),this.selection=new aa(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 m.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,v.ag)(e.name)),i.append(s),t.append(i),(0,we.Z)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let o;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),mi.Z&&(this.swipeHandler=Wn({element:this.tabsContainer,onSwipe:(e,t,i)=>{const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let r;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){r=e;break}void 0!==r&&(o=function(e){const t=e=>{(0,a.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(r))}}));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 f(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,ue.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),o&&(o(),o=void 0),this.onTransitionEnd()}),void 0,i,this.listenerSetter),(0,n.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,a.Z)(e),this.selection.toggleByElement((0,r.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>pa(this,void 0,void 0,(function*(){const n=(0,r.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.dataset.peerId.toPeerId(),l=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,r.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),c=l.findIndex((e=>e.mid===a&&e.peerId===o)),d=yield this.managers.appMessagesManager.getMessageByPeer(o,a);(new bm).setSearchContext(this.copySearchContext(i)).openMedia(d,l[c].element,0,!1,l.slice(0,c),l.slice(c+1))}));(0,n.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,n.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,He.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,ha.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],{dom:s}=Jm.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:54,loadPromises:i}),n=Jm.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dom:s,highlightWord:this.searchContext.query});return i.push(n),Promise.all(i)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return pa(this,void 0,void 0,(function*(){const s=(0,Se.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=Le(s,200,200);return a="photo"!==s._?yield(yield jt({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:o})).thumb:yield dt({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),[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 pa(this,void 0,void 0,(function*(){const i=(0,Se.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield Xt({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 pa(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,da.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)}let a=document.createElement("div");a.classList.add("preview","row-media"),n.photo?dt({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:Le(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,c.Z)(a,Is(n.title||n.display_url||n.description||n.url,!0)));let o=ca(n);const r=la(n),l=rn((0,ei.Z)(n.url||"")).firstElementChild;if(l instanceof HTMLAnchorElement)try{l.innerText=decodeURIComponent(l.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(l),this.showSender&&r.append("\n",yield Ut(e)),o.textContent||o.append((0,Yt.Z)(n.display_url.split("/",1)[0]));const d=new fi({title:o,titleRight:Ot(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});if(d.container.append(a),d.container.innerText.trim().length)return{message:e,element:d.container}}))}performSearchResult(e,t,i=!0){return pa(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield(0,He.e9)(),"inputMessagesFilterPhotoVideo"===l&&this.searchContext.query.trim()?(l="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===l&&(r=this.searchGroups.messages);const c={elemsToAppend:s,inputFilter:l,message:void 0,middleware:o,promises:a,searchGroup:r};let d;switch(l){case"inputMessagesFilterEmpty":d=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":d=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":d=this.processDocumentFilter;break;case"inputMessagesFilterUrl":d=this.processUrlFilter}if(d){d=d.bind(this);const t=e.map((e=>pa(this,void 0,void 0,(function*(){try{return c.message=e,yield d(c)}catch(t){this.log.error("error rendering filter",l,c,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i.filter(Boolean))}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,l);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"===l?1:e.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(let 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 a=(t,n,a=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=Jm.addDialogNew({peerId:t,container:n.list,avatarSize:48,autonomous:n.autonomous});return{dom:i,peerId:t}})).forEach((({dom:e,peerId:t})=>pa(this,void 0,void 0,(function*(){const n=yield this.managers.appPeersManager.getPeer(t);if(a&&(n.participants_count||n.participants)){const s=new RegExp(`(${hn(i)}|${hn((0,qt.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield $i(t.toChatId()))}else if(t===s.Z.myId)e.lastMessageSpan.append((0,v.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,ds.u)(e.phone).formatted)}e.lastMessageSpan.innerHTML=""+i+""}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0).then(o).then((e=>{e&&a(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(a(e.my_results,this.searchGroups.contacts,!0),a(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 v.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,n.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.appMessagesManager.getConversations(i,0,20,0).then(o).then((e=>{e&&a(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>Ci.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.innerHTML="",i.recentSearch.slice(0,20).forEach((e=>pa(this,void 0,void 0,(function*(){let{dom:t}=Jm.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:48,autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?ce(yield this.managers.appUsersManager.getUser(e.toUserId())):$i(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===s.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.length&&e.forEach((e=>{Jm.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:54,autonomous:!1})})),this.searchGroups.people.setActive()})),e()])}}loadMembers(e){return pa(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let s;const a=t=>pa(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new Un({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,n.fc)(this.membersList.list,(e=>{const t=(0,l.Z)(e.target,jm);if(!t)return;const i=t.dataset.peerId.toPeerId();let s=Promise.resolve();d.Z.isMobile&&(s=Ws.toggleSidebar(!1)),s.then((()=>{mm.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,Wi.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const n=this.membersList?200:50;s=this.managers.appProfileManager.getChannelParticipants(t,void 0,n,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;let s=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(s?s.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]=s.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n;const a=e.inputFilter;if(this.loadPromises[a])return this.loadPromises[a];if("members"===e.type)return this.loadMembers(e);const o=null!==(n=this.historyStorage[a])&&void 0!==n?n:this.historyStorage[a]=[];if(!("inputMessagesFilterEmpty"!==a||o.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[a]=!0,Promise.resolve();const r=this.loadPromises[a]=Promise.resolve().then((()=>pa(this,void 0,void 0,(function*(){var n,l;if(o.length&&this.usedFromHistory[a]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(r,a))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}let c=o.length?o[o.length-1].mid:0;const d=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:a},maxId:c,limit:i,nextRate:null!==(n=(l=this.nextRates)[a])&&void 0!==n?n:l[a]=0}));if(o.push(...d.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((d.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(d.history,a),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[a]=null}));return r}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),s=i.map((e=>({_:e.inputFilter}))),[n,a]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,s),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let o,r=0;i.forEach((e=>{const t=n.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&(void 0===o&&(o=e),++r)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!a),a&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),this.navScrollableContainer.classList.toggle("hide",r<=1))}))}load(e=!1,t=!1){var i;return pa(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,ge.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(zi.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 v.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(i,l);const c=(0,ra.Z)(a,"desc");let d=0;for(;dc[d]);++d);a[n]={container:e,items:l},Fn(e,this.tabs[t],d)}return a[n]}canViewMembers(){return Promise.all([this.searchContext.peerId.isAnyChat(),this.managers.appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()),this.managers.appChatsManager.hasRights(this.searchContext.peerId.toChatId(),"view_participants")]).then((([e,t,i])=>e&&!t&&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.urlsToRevoke.length&&(this.urlsToRevoke.forEach((e=>{URL.revokeObjectURL(e)})),this.urlsToRevoke.length=0),this.mediaTabs.forEach((e=>{if(e.contentTab.innerHTML="",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,be.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,Fi.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.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}}const va=(e,t,i,s)=>{((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(n.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const n=e.querySelector(".btn-menu");if((0,a.Z)(i),e.classList.contains("menu-open"))xs.closeBtnMenu();else{const e=t&&t(i),a=()=>{xs.openBtnMenu(n,s)};e instanceof Promise?e.then(a):a()}}))},fa=(e={},t,i,s,n)=>{var a;e.asDiv=!0;const o=null!==(a=e.container)&&void 0!==a?a:E("more",e);o.classList.add("btn-menu-toggle");const r=$n(i,e.listenerSetter);return r.classList.add(t),va(o,s,e,n),o.append(r),o};function ya(e){const t=[];let 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}}var ba;!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(ba||(ba={}));const wa=ba;class Sa{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,g.Z)(i,t):(0,v.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===wa.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===wa.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new Wo({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:wa.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:wa.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:wa.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,wi.a)();i.forEach((({type:e,langKey:t})=>{const i=new fi({radioField:new Li({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=yi([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=jo(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 fi(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(ms).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=ya(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 wa.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case wa.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case wa.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"))return;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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((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,v.v_)([e.users.length?(0,v.ag)("Users",[e.users.length]):null,e.chats.length?(0,v.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,v.ag)("PrivacySettingsController.AddUsers")]}}class Ca extends T{init(){return e=this,t=void 0,s=function*(){this.header.classList.add("with-border"),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,v.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,v.ag)("PrivacyPhoneInfo4"),document.createElement("br"),function(e={}){const t=document.createElement("a");if(t.classList.add("anchor-copy"),e.mePath){const i="https://t.me/"+e.mePath;t.href=t.innerText=i}return(0,n.fc)(t,(e=>{(0,a.Z)(e),bi(t.href),Ei({langPackKey:"LinkCopied"})})),t}({mePath:e}));const i=new Sa({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{o.setRadio(wa.Everybody),o.radioSection.container.classList.toggle("hide",e!==wa.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",o=new Sa({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[wa.Nobody],managers:this.managers});this.scrollable.container.insertBefore(o.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}function La({emoji:e,div:t,width:i,height:n,managers:a=s.Z.managers}){return o=this,r=void 0,c=function*(){const s=yield a.appStickersManager.getAnimatedEmojiSticker(e);if(!s)throw t.classList.add("media-sticker-wrapper"),new Error("no sticker");return pi({doc:s,div:t,emoji:e,width:i,height:n,loop:!1,play:!0})},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(o,r||[])).next())}));var o,r,l,c}class Ia extends P{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new Wo({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");La({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 a=(0,M.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,n.fc)(a,(e=>{this.close()})),this.slider.sliceTabsUntilTab(Zo,this),s.append(a),i.append(s),this.scrollable.container.append(e.container)}}var Ma=i(4489);function Ea(e){return!Je.IS_MOBILE_SAFARI||!e}class Pa extends P{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 Wo({captionOld:!0,noDelimiter:!0});(0,v.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");La({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 a=this.codeInputField=new Ma.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{c(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{l()})).catch((e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),(0,g.Z)(a.label,(0,v.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),(0,g.Z)(a.label,(0,v.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}c(!1)}))}}),o=(0,M.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=(0,M.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),l=()=>{this.slider.createTab(Ia).open()},c=e=>{(0,Ai.Z)([a.input,o,r],e)};(0,n.fc)(o,(e=>{c(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab(xa,this),this.close()}),(()=>{c(!1)}))})),(0,n.fc)(r,(e=>{c(!0);const t=(0,be.y)(r);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),c(!1)}))})),s.append(a.container,o,r),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Ea(this.isFirst)&&this.codeInputField.input.focus()}}var Ta=i(2423);function ka(e){return e?e.match(Ta.E):null}class xa extends P{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new Wo({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");La({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 o=this.inputField=new b.Z({name:"recovery-email",label:"RecoveryEmail",plainText:!0});o.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,a.Z)(e),d()})),o.input.addEventListener("input",(e=>{o.input.classList.remove("error")}));const r=(0,M.Z)("btn-primary btn-color-primary",{text:"Continue"}),l=(0,M.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),c=()=>{this.slider.createTab(Ia).open()},d=()=>{const e=o.value.trim(),t=ka(e);if(!t||t[0].length!==e.length)return void o.input.classList.add("error");h(!0);const i=(0,be.y)(r);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{c()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(Pa);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);h(!1),i.remove()}))};(0,n.fc)(r,d);const h=e=>{e?(r.setAttribute("disabled","true"),l.setAttribute("disabled","true")):(r.removeAttribute("disabled"),l.removeAttribute("disabled"))};(0,n.fc)(l,(e=>{new _i("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{h(!0),(0,be.y)(l),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{c()}),(e=>{h(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(o.container,r,l),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Ea(this.isFirst)&&this.inputField.input.focus()}}var _a=i(4425),Aa=i(6830),Za=i(3083);class Da extends P{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new Wo({noDelimiter:!0}),t=document.createElement("div");La({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 b.Z({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,a.Z)(e),s.value?c():d()}));const o=(e,t)=>{e&&(0,a.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void Mi(v.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab(xa);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},r=(0,M.Z)("btn-primary btn-color-primary",{text:"Continue"}),l=(0,M.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),c=e=>o(e,!0),d=e=>o(e,!1);(0,n.fc)(r,c),(0,n.fc)(l,d),i.append(s.container,r,l),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class Fa extends P{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 Wo({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new Aa.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new Za.Z(i,157),o=(0,M.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,o),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(b.I.Neutral),"Enter"===e.key)return l()}));const r=()=>this.newPassword===i.value||(i.setError(),!1),l=e=>{if(e&&(0,a.Z)(e),!r())return;const t=this.slider.createTab(Da);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,n.fc)(o,l),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class Ra extends P{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 Wo({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new Aa.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Zt.Z)(this.state.hint):void 0}),o=new _a.Z(s,157),r=(0,M.Z)("btn-primary btn-color-primary"),l=new v.ZP.IntlElement({key:"Continue"});r.append(l.element),i.append(s.container,r),t.content.append(o.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),l.key="Continue",l.update()),"Enter"===e.key)return h()}));const d=()=>!!s.value.length||(s.input.classList.add("error"),!1);let h;if(e)h=e=>{if(e&&(0,a.Z)(e),!d())return;const t=this.slider.createTab(Fa);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,c.Z)(s.label,(0,Zt.Z)(this.state.hint)):(0,g.Z)(s.label,(0,v.ag)("LoginPassword"))})));h=i=>{if(!d())return void(0,a.Z)(i);r.setAttribute("disabled","true"),l.key="PleaseWait",l.update();const n=(0,be.y)(r),c=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),o&&o.remove();const t=this.slider.createTab(Ba);t.state=this.state,t.plainPassword=c,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{r.removeAttribute("disabled"),s.input.classList.add("error"),e.type,l.key="PASSWORD_HASH_INVALID",l.update(),n.remove(),s.select(),t()}))},t()}return(0,n.fc)(r,h),o.load()}onOpenAfterTimeout(){Ea(this.isFirst)&&this.passwordInputField.input.focus()}}class Ba extends P{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new Wo({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");La({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,v.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,M.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,M.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),a=(0,M.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,n.fc)(t,(()=>{const e=this.slider.createTab(Ra);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,n.fc)(s,(()=>{new _i("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(Zo,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,n.fc)(a,(()=>{const e=this.slider.createTab(xa);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,a)}else{(0,v.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,M.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,n.fc)(s,(e=>{const t=this.slider.createTab(Ra);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class Na extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new Sa({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class Ua extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new Sa({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[wa.Nobody],managers:this.managers})}}class Oa extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new Sa({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class Ha extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new Sa({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[wa.Nobody],managers:this.managers})}}class za extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new Sa({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 Sa({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}class Ga extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new fi({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:H(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const i=document.createElement("div");return i.classList.add("row-midtitle"),i.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(i,t.subtitle),t},t=this.authorizations.slice();{const a=new Wo({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),o=(0,ge.Z)(t,(e=>e.pFlags.current)),r=e(o);if(a.content.append(r.container),t.length){const e=(0,M.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,n.fc)(e,(t=>{new _i("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,Ai.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()})),a.content.append(e)}this.scrollable.append(a.container)}if(!t.length)return;const i=new Wo({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&&Mi(v.ZP.format("RecentSessions.Error.FreshReset",!0))};let a;const o=()=>{const e=a.dataset.hash;new _i("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&a.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},l=this.menuElement=$n([{icon:"stop",text:"Terminate",onClick:o}]);l.id="active-sessions-contextmenu",l.classList.add("contextmenu"),document.getElementById("page-chats").append(l),Gn(this.scrollable.container,(e=>{a=(0,r.Z)(e.target,"row"),a&&"0"!==a.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),ua(e,l),xs.openBtnMenu(l))})),(0,n.fc)(this.scrollable.container,(e=>{a=(0,r.Z)(e.target,"row"),a&&"0"!==a.dataset.hash&&o()}))}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Va extends P{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new Wo({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=F({icon:"add",className:"is-visible"});this.content.append(t),(0,n.fc)(t,(e=>{new Xi({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=Jm.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const a=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=Jm.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:48,append:t}),n=yield this.managers.appUsersManager.getUser(e);n.pFlags.bot?s.lastMessageSpan.append("@"+n.username):n.phone?s.lastMessageSpan.innerHTML=hs(n.phone):s.lastMessageSpan.append(n.username?"@"+n.username:ce(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)a(e,!0);let o;const r=this.menuElement=$n([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=o.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);r.id="blocked-users-contextmenu",r.classList.add("contextmenu"),document.getElementById("page-chats").append(r),Gn(this.scrollable.container,(e=>{o=(0,l.Z)(e.target,jm),o&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),ua(e,r),xs.openBtnMenu(r))}),this.listenerSetter),this.listenerSetter.add(s.Z)("peer_block",(e=>{const{peerId:t,blocked:s}=e,n=i.querySelector(`[data-peer-id="${t}"]`);s?n||a(t,!1):n&&n.remove()}));let c=!1;this.scrollable.onScrolledBottom=()=>{c||(c=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)a(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{c=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}function Ka(e){return"input"+(e[0].toUpperCase()+e.slice(1))}function Wa(e){return new Promise(((t,i)=>{var s;const{button:n,checkbox:a}=e;n.callback=e=>{t(e?!!e.size:void 0)};const o=(0,A.x)(e.buttons||[n]),r=o.find((e=>e.isCancel));r.callback=()=>{i()},e.buttons=o,null!==(s=e.checkboxes)&&void 0!==s||(e.checkboxes=a&&[a]),new _i("popup-confirmation",e).show()}))}class ja extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const e="Loading";{const t=new Wo({noDelimiter:!0,caption:"SessionsInfo"});let i;const n=new fi({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:e,clickable:()=>{const e=this.slider.createTab(Va);e.peerIds=i,e.open()},listenerSetter:this.listenerSetter});let a;n.freezed=!0;const o={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:e,clickable:e=>{let t;a.pFlags.has_password?t=this.slider.createTab(Ra):a.email_unconfirmed_pattern?(t=this.slider.createTab(Pa),t.email=a.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(Ba),t.state=a,t.open()},listenerSetter:this.listenerSetter},r=new fi(o);r.freezed=!0;const l=this.activeSessionsRow=new fi({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:e,clickable:()=>{const e=this.slider.createTab(Ga);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});l.freezed=!0,t.content.append(n.container,r.container,l.container),this.scrollable.append(t.container);const c=e=>{e?(0,g.Z)(n.subtitle,(0,v.ag)("PrivacySettingsController.UserCount",[e])):(0,g.Z)(n.subtitle,(0,v.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(s.Z)("peer_block",(()=>{d()}));const d=()=>{this.managers.appUsersManager.getBlocked().then((e=>{n.freezed=!1,c(e.count),i=e.peerIds}))};d(),this.managers.passwordManager.getState().then((e=>{a=e,(0,g.Z)(r.subtitle,(0,v.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),r.freezed=!1})),this.updateActiveSessions()}{const t=new Wo({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});t.content.classList.add("privacy-navigation-container");const i={},n=i.inputPrivacyKeyPhoneNumber=new fi({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Ca).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new fi({titleLangKey:"LastSeenTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Na).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new fi({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Ua).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new fi({titleLangKey:"WhoCanCallMe",subtitleLangKey:e,clickable:()=>{this.slider.createTab(za).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyForwards=new fi({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Oa).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyChatInvite=new fi({titleLangKey:"WhoCanAddMe",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Ha).open()},listenerSetter:this.listenerSetter}),d=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=ya(e),s=i.type===wa.Everybody?"PrivacySettingsController.Everbody":i.type===wa.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,v.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};t.content.append(n.container,a.container,o.container,r.container,l.container,c.container),this.scrollable.append(t.container);for(const e in i)d(e);s.Z.addEventListener("privacy_update",(e=>{d(Ka(e.key._))}))}const t=[];{const e=new Wo({name:"Privacy.SensitiveContent"});e.container.classList.add("hide"),t.push(this.managers.apiManager.invokeApi("account.getContentSettings").then((t=>{if(!t.pFlags.sensitive_can_change)return;const i=t.pFlags.sensitive_enabled,s=new fi({checkboxField:new xi.Z({text:"PrivacyAndSecurity.SensitiveText",checked:i}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});e.content.append(s.container),e.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",(()=>{const e=s.checkboxField.checked;e!==i&&this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e})}),{once:!0})}))),this.scrollable.append(e.container)}{const e=new Wo({name:"FilterChats"}),t=()=>{new _i("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,Ai.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,M.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new Wo({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};Wa(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,Ai.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),Ei({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),ft.Z)},i=(0,M.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(t)}updateActiveSessions(){this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,v.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}}function $a(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data;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)`}class Qa{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=()=>{let e=this._scrollDelta/this._scrollTails;if(this._scrollDelta%=this._scrollTails,e=e>0?Math.floor(e):Math.ceil(e),e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}this._onWheelRAF=void 0},this.drawNextPositionAnimated=()=>{const e=this._frames,t=e.shift();t&&this.drawImageData(t);const i=e.length;return i||(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,an.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();for(;e>0;)t.push(t.shift()),--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)}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(){var e;if(this._colors.length<2)return;const t=this._tail,i=this._tails;let s;const n=[];for(let a=0,o=this._incrementalCurve.length;ai&&void 0===s&&(s=a,r%=i),n.push(r)}[n.slice(0,s),void 0!==s?n.slice(s):[]].forEach(((e,t,s)=>{const n=e[e.length-1];if(void 0!==n&&n>i&&(e[e.length-1]=+n.toFixed(2)),this._tail=null!=n?n:0,!e.length)return;const a=this.getNextPositions(this._phase,i,e);t!==s.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=a.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,ht.jt)(this.drawNextPositionAnimated)}scrollAnimate(e){this._colors.length<2&&e||(e&&!this._addedScrollListener?(document.addEventListener("wheel",this.onWheel),this._addedScrollListener=!0):!e&&this._addedScrollListener&&(document.removeEventListener("wheel",this.onWheel),this._addedScrollListener=!1))}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 Qa;return i.init(t),{gradientRenderer:i,canvas:t}}}var Ya=i(6714);class Ja{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(Ja.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 b.Z({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new b.Z({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=Ja.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?b.I.Neutral:b.I.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?b.I.Neutral:b.I.Error),e&&this.setColor((0,an.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){xt(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){xt(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,an.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,an.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,an.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,an.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(b.I.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(b.I.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,Me.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,Me.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,Me.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=(0,Me.Z)(a,0,100),c=100-l/2,d=100-(0,Me.Z)(o,0,100),h=(0,Me.Z)(d/100*c,0,100);this.saturation=l,this.lightness=h,i&&this.updatePicker()}}Ja.BASE_CLASS="color-picker";class Xa extends P{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,an.Pi)(e),i=this.theme.background,n=qa(t);i.id="2",i.intensity=0,i.slug="",i.color=e.toLowerCase(),i.highlightningColor=n,this.managers.appStateManager.pushToState("settings",s.Z.settings),mm.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=Ya.Z.getTheme();const e=new Wo({});this.colorPicker=new Ja,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new Wo({}),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,n.fc)(i,(e=>{const t=(0,r.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,mt.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,i=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],i=!!t&&!e.slug;i&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),i||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var eo=i(236);function to(e){return new Promise((t=>{var i,s,n;const a=document.createElement("canvas"),o=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize);a.width=o.width*window.devicePixelRatio,a.height=o.height*window.devicePixelRatio,a.getContext("2d").drawImage(e.media,0,0,a.width,a.height),a.toBlob((e=>{t({blob:e,size:o})}),null!==(s=e.mimeType)&&void 0!==s?s:"image/jpeg",null!==(n=e.quality)&&void 0!==n?n:1)}))}var io=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class so extends P{constructor(){super(...arguments),this.tempId=0,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",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=>io(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield Ze(t,i,!1);const s="image/jpeg",{blob:n}=yield to({media:t,size:new ot.c(t.naturalWidth,t.naturalHeight),mimeType:s});e=new File([n],e.name.replace(/\.png$/,".jpg"),{type:s})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),s=u.Z.getNewDeferredForUpload(e.name,i),n=(0,Oe.Z)();n.addNotifyListener=s.addNotifyListener,n.cancel=s.cancel,s.then((e=>{this.clicked.delete(a),this.elementsByKey.delete(a),this.wallPapersByElement.set(r,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,r),this.setBackgroundDocument(e).then(n.resolve,n.reject)}),n.reject);const a=this.getWallPaperKey(t);n.catch((()=>{r.remove()}));const o=new Ue({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),r=this.addWallPaper(t,!1);this.clicked.add(a),o.attach(r,!1,n)}))))},this.onResetClick=()=>{const e=eo.h.settings.themes.find((e=>e.name===this.theme.name));e&&(++this.tempId,this.theme.background=(0,Fi.Z)(e.background),this.managers.appStateManager.pushToState("settings",s.Z.settings),mm.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=(0,r.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void this.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const a=i.document,o=new Ue({cancelable:!0,tryAgainOnFail:!1}),l=()=>io(this,void 0,void 0,(function*(){const e=this.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(a)).url&&!this.theme.background.blur||o.attach(t,!0,e)}));o.construct(),(0,n.fc)(t,(e=>{o.preloader.parentElement?(o.onClick(e),o.detach()):l()}),{listenerSetter:this.listenerSetter}),l()},this.saveToCache=(e,t)=>{fetch(t).then((t=>{mm.cacheStorage.save("backgrounds/"+e,t)}))},this.setBackgroundDocument=e=>{let t=++this.tempId;const i=()=>t===this.tempId,n=e.document,a=(0,Oe.Z)();let o;return n?(o=u.Z.downloadMediaURL({media:n,queueId:mm.chat.bubbles?mm.chat.bubbles.lazyLoadQueue.queueId:0}),a.addNotifyListener=o.addNotifyListener,a.cancel=o.cancel):o=Promise.resolve(),o.then((()=>io(this,void 0,void 0,(function*(){if(!i())return void a.resolve();const t=this.theme.background,o=n=>{let o;if(n&&!this.theme.background.color)o=function(e){const t=document.createElement("img");return new Promise((i=>{Ae(t,e,(()=>{const e=document.createElement("canvas"),s=t.naturalWidth/t.naturalHeight;1===s?(e.width=50,e.height=e.width/s):s>1?(e.height=50,e.width=e.height/s):e.width=e.height=50,e.getContext("2d").drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height),i($a(e))}))}))}(n);else{const{canvas:t}=Qa.create(this.getColorsFromWallPaper(e));o=Promise.resolve($a(t))}o.then((o=>{var r,l,c;if(!i())return void a.resolve();const d=qa(Array.from(o)),h=null!==(r=e.slug)&&void 0!==r?r:"";t.id=e.id,t.intensity=null!==(c=null===(l=e.settings)||void 0===l?void 0:l.intensity)&&void 0!==c?c:0,t.color=this.getColorsFromWallPaper(e),t.slug=h,t.highlightningColor=d,this.managers.appStateManager.pushToState("settings",s.Z.settings),h&&this.saveToCache(h,n),mm.applyCurrentTheme(h,n,!0).then(a.resolve)}))};if(!n)return void o();const r=yield this.managers.thumbsStorage.getCacheContext(n);t.blur?setTimeout((()=>{const{canvas:e,promise:t}=Ye(r.url,12,4);t.then((()=>{i()?o(e.toDataURL()):a.resolve()}))}),200):o(r.url)})))),a},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"))}}get theme(){return Ya.Z.getTheme()}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=jo(this.scrollable),i=(0,M.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),a=(0,M.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),o=(0,M.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,n.fc)(i,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,n.fc)(a,(()=>{this.slider.createTab(Xa).open()}),{listenerSetter:this.listenerSetter}),(0,n.fc)(o,this.onResetClick,{listenerSetter:this.listenerSetter});const r=this.blurCheckboxField=new xi.Z({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(r.input)("change",(()=>io(this,void 0,void 0,(function*(){this.theme.background.blur=r.input.checked,yield this.managers.appStateManager.pushToState("settings",s.Z.settings),setTimeout((()=>{const e=t.querySelector(".active");if(!e)return;const i=this.wallPapersByElement.get(e);i.pFlags.pattern||"wallPaperNoFile"===i._||this.setBackgroundDocument(i)}),100)})))),e.append(i,a,o,r.label)}s.Z.addEventListener("background_change",this.setActive),this.managers.appDocsManager.getWallPapers().then((e=>{e.forEach((e=>{this.addWallPaper(e)}))}));const e=jo(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),(0,n.fc)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallPaper(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((e=>"#"+e.toString(16))).join(","):""}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){const i=this.getColorsFromWallPaper(e),s="wallPaper"===e._;if(s&&e.pFlags.pattern&&!i)return;const n=!!e.pFlags.dark,a=s?e.document:void 0,o=document.createElement("div");o.classList.add("grid-item"),o.dataset.id=""+e.id;const r=this.getWallPaperKey(e);this.wallPapersByElement.set(o,e),this.elementsByKey.set(r,o);const l=document.createElement("div");let c,d;if(l.classList.add("grid-item-media"),s?(d=Le(a,200,200),c=dt({photo:a,message:null,container:l,withoutPreloader:!0,size:d,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&l.classList.add("is-pattern"),c.then((({loadPromises:e,images:t})=>io(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((t=>{var i;e.pFlags.pattern&&(n?(t.full.style.display="none",t.thumb&&(t.thumb.style.display="none")):(null===(i=e.settings)||void 0===i?void 0:i.intensity)&&(t.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),ke.Z.mutate((()=>{o.append(l)}))}))):o.append(l),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Qa.create(i);t.classList.add("background-colors-canvas"),n&&s?c.then((({loadPromises:i})=>{i.full.then((()=>io(this,void 0,void 0,(function*(){const i=yield this.managers.thumbsStorage.getCacheContext(a,d.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+Math.abs(e.settings.intensity)/100,l.append(t)}))))})):l.append(t)}return this.getWallPaperKeyFromTheme(this.theme)===r&&o.classList.add("active"),this.grid[t?"append":"prepend"](o),o}}var no=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const ao="STICKERS-POPUP";class oo extends A.Z{constructor(e){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=(0,r.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;mm.chat.input.sendMessageWithDocument(i)?this.hide():console.warn("got no doc by id:",i)},this.title.append((0,v.ag)("Loading")),this.addEventListener("close",(()=>{p.Z.setOnlyOnePlayableGroup("")}));const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),(0,n.fc)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),(0,be.y)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const i=(0,M.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.scrollable.append(t),this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return this.managers.appStickersManager.getStickerSet(this.stickerSetInput).then((e=>no(this,void 0,void 0,(function*(){if(!e)return Ei({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;p.Z.setOnlyOnePlayableGroup(ao);const i=(0,v.ag)("Stickers",[e.set.count]);e.set.installed_date?(t=(0,M.Z)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append((0,v.ag)("RemoveStickersCount",[i]))):(t=(0,M.Z)("btn-primary btn-color-primary",{noRipple:!0}),t.append((0,v.ag)("AddStickersCount",[i]))),(0,n.fc)(t,(()=>{const i=(0,Ai.Z)([t],!0);this.managers.appStickersManager.toggleStickerSet(e.set).then((()=>{this.hide()})).catch((()=>{i()}))}));const s=new ye,a=yield Promise.all(e.documents.map((e=>no(this,void 0,void 0,(function*(){if("documentEmpty"===e._)return;const t=document.createElement("div");t.classList.add("sticker-set-sticker");const i=d.Z.active.esgSticker.width;return yield pi({doc:e,div:t,lazyLoadQueue:s,group:ao,play:!0,loop:!0,width:i,height:i}),t})))));(0,c.Z)(this.title,(0,Zt.Z)(e.set.title)),this.stickersFooter.classList.toggle("add",!e.set.installed_date),this.stickersFooter.textContent="",this.stickersFooter.append(t),this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="",this.stickersDiv.append(...a.filter(Boolean)),this.scrollable.onAdditionalScroll()}))))}}var ro=i(6761);var lo=i(3731);class co extends P{init(){return this.header.classList.add("with-border"),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 Wo,s=t.map((t=>{const i=new Li({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new fi({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),An({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=yi(s,(e=>{this.managers.appReactionsManager.setDefaultReaction(e)}));i.content.append(n),this.scrollable.append(i.container)}))}}class ho{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 l=document.createElement("div");l.classList.add(o+"-name"),(0,v.$d)(l,e);const c=this.valueContainer=document.createElement("div");c.classList.add(o+"-value"),a&&(c.innerHTML=""+i),r.append(l,c),this.range=new _t({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(c.innerText=""+e)}}),this.container.append(r,this.range.container)}}class uo extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=jo.bind(null,this.scrollable);{const t=e("Settings"),i=new ho("TextSize",1,s.Z.settings.messagesTextSize,12,20);i.onChange=e=>{s.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const a=(0,M.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});(0,n.fc)(a,(()=>{this.slider.createTab(so).open()}));const o=new xi.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0,listenerSetter:this.listenerSetter});t.append(i.container,a,o.label)}{const t=e("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new fi({radioField:new Li({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new fi({radioField:new Li({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,v.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[Je.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),t.append(i)}if(lo.Z){const t=e("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new fi({radioField:new Li({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new fi({radioField:new Li({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),t.append(i)}{const t=e("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 fi({radioField:new Li({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=ft.Z),function i(){e(),n=ro.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))),t.append(i)}{const t=e("Emoji"),i=new xi.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0,listenerSetter:this.listenerSetter}),s=new xi.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0,listenerSetter:this.listenerSetter});t.append(i.label,s.label)}{const e=new Wo({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new fi({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(co).open()},listenerSetter:this.listenerSetter}),i=()=>{Promise.resolve(this.managers.appReactionsManager.getQuickReaction()).then((e=>{An({row:t,doc:e.static_icon,size:"small"})}))};i(),this.listenerSetter.add(s.Z)("quick_reaction",i);const n=new xi.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0,listenerSetter:this.listenerSetter}),a=new xi.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0,listenerSetter:this.listenerSetter}),o={},r=e.generateContentElement(),l=new ye,c=(e,t="append")=>{const i=new fi({title:(0,Zt.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new oo({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});o[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),_n({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:l,width:48,height:48,autoplay:!0}),i.container.append(s),r[t](i.container)};this.managers.appStickersManager.getAllStickers().then((e=>{(0,si.Z)(e);for(const t of e.sets)c(t)})),this.listenerSetter.add(s.Z)("stickers_installed",(e=>{const t=e;o[t.id]||c(t,"prepend")})),this.listenerSetter.add(s.Z)("stickers_deleted",(e=>{const t=e;o[t.id]&&(o[t.id].container.remove(),delete o[t.id])})),e.content.append(t.container,n.label,a.label),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}class po extends P{init(){return e=this,t=void 0,a=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=jo(this.scrollable,void 0,"Bio.Description"),i=document.createElement("div");i.classList.add("input-wrapper");const n=yield this.managers.apiManager.getAppConfig();this.firstNameInputField=new b.Z({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new b.Z({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new b.Z({label:"EditProfile.BioLabel",name:"bio",maxLength:s.Z.premium?n.about_length_limit_premium:n.about_length_limit_default}),i.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const a=document.createElement("div");a.classList.add("caption"),(0,v.XZ)({element:a,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new gi({peerId:s.Z.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),t.append(this.editPeer.avatarEdit.container,i)}{const t=new Wo({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new ki({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=t.caption;s.append((0,v.ag)("UsernameSettings.ChangeDescription")),s.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append((0,v.ag)("UsernameHelpLink",[a])),s.append(n),e.push(this.usernameInputField),t.content.append(i),this.scrollable.append(t.container)}(0,n.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).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});const t=yield this.managers.appUsersManager.getSelf(),i=yield this.managers.appProfileManager.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(i.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var mo=i(7625),go=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class vo extends P{constructor(){super(...arguments),this.renderResults=e=>go(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=Jm.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:46}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const s=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,c.Z)(e,(0,Zt.Z)(i.title)),s.push(e)}})),(0,v.v_)(s,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=E("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,n.fc)(this.confirmBtn,(()=>go(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,mo.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,mo.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}),this.dialogsByFilters=new Map,this.managers.filtersStorage.getDialogFilters().then((e=>go(this,void 0,void 0,(function*(){yield Promise.all(e.map((e=>go(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))})))))}))))}checkbox(e){const t=new xi.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new Wo({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,M.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 a=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new Ji({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(a);let o=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=100&&o&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);return t&&setTimeout((()=>{t.checked=!1}),0),void Mi(v.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=r(e,i[e]?(0,v.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(a),o=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,n.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,i){return this.originalFilter=e,this.filter=(0,Fi.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,super.open()}}var fo=i(1544),yo=i(3066),bo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class wo extends P{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,v.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=E("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new _i("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{e&&this.close()})).finally((()=>{e.element.removeAttribute("disabled")}))},isDanger:!0}]}).show()}};this.menuBtn=fa({listenerSetter:this.listenerSetter},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new Wo({}),i=document.createElement("div");i.classList.add("input-wrapper"),this.nameInputField=new b.Z({label:"FilterNameHint",maxLength:12}),i.append(this.nameInputField.container),t.content.append(i);const s=(e,t,i,s)=>{const n=new Wo({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,M.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=s("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=s("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,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),o=this.excludePeerIds.container.querySelector(".folder-categories");(0,n.fc)(a.querySelector(".btn"),(()=>{this.slider.createTab(vo).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,n.fc)(o.querySelector(".btn"),(()=>{this.slider.createTab(vo).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,n.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(a.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=>{e&&this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?Mi("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):Mi("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 r="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=ri.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then((e=>(this.animation=e,ri.Z.waitForFirstFrame(e)))),...r])}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"),this.nameInputField.value="";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,fo.Z)((0,yo.Z)(e.title));for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>bo(this,void 0,void 0,(function*(){const i=this[t],s=Jm.createChatList({ignoreClick:!0});let a=e[t];const o=e=>bo(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 Ki(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const l=e=>bo(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);tl(20)),{listenerSetter:this.listenerSetter}),c.append((0,v.ag)("FilterShowMoreChats",[a.length])),e.append(c)}l(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,es.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,Fi.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return 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"),super.open().then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):this.onCreateOpen()}))}}var So=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Co extends P{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,i){return So(this,void 0,void 0,(function*(){let s,a,o="",r=[];if("dialogFilterSuggested"===e._)s=e.filter,o=e.description;else{if(s=e,1===Object.keys(s.pFlags).length){const e=s.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&&r.push((0,v.ag)(t))}if(!r.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(s.id);let t=0,i=0,n=0;yield Promise.all(e.map((e=>So(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?n++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&r.push((0,v.ag)("Chats",[t])),i&&r.push((0,v.ag)("Channels",[i])),n&&r.push((0,v.ag)("Groups",[n]))}}if(i)i.subtitle.textContent="",(0,v.v_)(r).forEach((e=>{i.subtitle.append(e)}));else if(i=new fi({title:(0,Zt.Z)(s.title),subtitle:o,clickable:!0}),r.length&&(0,v.v_)(r).forEach((e=>{i.subtitle.append(e)})),"dialogFilter"===e._){const e=s.id;this.filtersRendered.hasOwnProperty(s.id)||(0,n.fc)(i.container,(()=>So(this,void 0,void 0,(function*(){this.slider.createTab(wo).open(yield this.managers.filtersStorage.getFilter(e))}))),{listenerSetter:this.listenerSetter}),this.filtersRendered[s.id]=i}return a=i.container,s.hasOwnProperty("orderIndex")?Fn(a,a.parentElement||t,s.orderIndex):t&&t.append(a),a}))}init(){return So(this,void 0,void 0,(function*(){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 e=document.createElement("div");e.classList.add("caption"),(0,v.XZ)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,M.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new Wo({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new Wo({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,n.fc)(this.createFolderBtn,(()=>So(this,void 0,void 0,(function*(){const e=yield this.managers.apiManager.getAppConfig();Object.keys(this.filtersRendered).length>=(s.Z.premium?e.dialog_filters_limit_premium:e.dialog_filters_limit_default)?Mi("Sorry, you can't create more folders."):this.slider.createTab(wo).open()}))),{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return this.managers.filtersStorage.getDialogFilters().then((e=>So(this,void 0,void 0,(function*(){for(const t of e)yield this.renderFolder(t,this.foldersSection.content);t()})))),this.listenerSetter.add(s.Z)("filter_update",(e=>So(this,void 0,void 0,(function*(){this.filtersRendered.hasOwnProperty(e.id)?yield this.renderFolder(e,null,this.filtersRendered[e.id]):yield this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()})))),this.listenerSetter.add(s.Z)("filter_delete",(e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()})),this.listenerSetter.add(s.Z)("filter_order",(e=>{e.forEach(((e,t)=>{const i=this.filtersRendered[e].container;Fn(i,i.parentElement,t+1)}))})),this.loadAnimationPromise=ri.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then((e=>(this.animation=e,ri.Z.waitForFirstFrame(e)))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}getSuggestedFilters(){return this.managers.filtersStorage.getSuggestedDialogsFilters().then((e=>So(this,void 0,void 0,(function*(){this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t),i=(0,M.Z)("btn-primary btn-color-primary",{text:"Add"});e.append(i),this.suggestedSection.content.append(e),(0,n.fc)(i,(s=>{if((0,a.Z)(s),Object.keys(this.filtersRendered).length>=10)return void Mi("Sorry, you can't create more folders.");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((t=>{t&&e.remove()})).finally((()=>{i.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter})}}))))}}var Lo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Io extends T{init(){this.header.classList.add("with-border"),this.container.classList.add("notifications-container","with-border"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new Wo({name:e.name}),i=new fi({checkboxField:new xi.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter}),n=new fi({checkboxField:new xi.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter});t.content.append(i.container,n.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=()=>Lo(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,n.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>Lo(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,s=n.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&s===t.show_previews)return;const o=(0,Fi.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?le.rU:0,o.show_previews=s,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(s.Z)("notify_settings",(i=>{const s=Ka(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 Wo({name:"NotificationsOther"}),t=new fi({checkboxField:new xi.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter}),i=new fi({checkboxField:new xi.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter});Ci.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 Mo extends P{init(){return e=this,t=void 0,s=function*(){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new Wo({}),t=new Map,i=Promise.all([this.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),this.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"})]).then((([i,s])=>{const n=new Set,a=i.map((e=>e.lang_code)),o=(0,wi.a)();i.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const i=new fi({radioField:new Li({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,i)}));const r=yi([...t.values()],(e=>{v.ZP.getLangPack(e,a.includes(e))}));v.ZP.getCacheLangPack().then((e=>{const i=t.get(e.lang_code);i?i.radioField.setValueSilently(!0):console.error("no row",i,e)})),e.content.append(r)}));return this.scrollable.append(e.container),i},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}function Eo(e,t,i){const s=new Wo({name:t}),n="settings.autoDownload."+e+".",a=new xi.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",withRipple:!0,listenerSetter:i}),o=new xi.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",withRipple:!0,listenerSetter:i}),r=new xi.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",withRipple:!0,listenerSetter:i}),l=new xi.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",withRipple:!0,listenerSetter:i});return s.content.append(a.label,o.label,r.label,l.label),s}class Po extends T{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=Eo("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class To extends T{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=(0,Pi.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=Eo("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,n=20447232,a=s.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/n)),r=new v.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[kt(a)]}),l=new ho("AutoDownloadMaxFileSize",.01,o,0,1,!1);l.onChange=t=>{const s=Math.pow(t,4)*n+i|0;r.compareAndUpdate({args:[kt(s)]}),e(s)},l.valueContainer.append(r.element),t.content.append(l.container),this.scrollable.append(t.container)}}class ko extends T{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=Eo("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const xo={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class _o extends T{init(){return e=this,t=void 0,a=function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new Wo({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield Ci.Z.getState(),i=new xi.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,withRipple:!0}),a=()=>{(0,Ai.Z)([h],(0,es.Z)(t.settings.autoDownload,eo.h.settings.autoDownload)&&(0,es.Z)(t.settings.autoDownloadNew,eo.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(l,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(d,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=new e(this.slider,!0);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},l=new fi({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(Po)},listenerSetter:this.listenerSetter}),c=new fi({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(ko)},listenerSetter:this.listenerSetter}),d=new fi({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(To)},listenerSetter:this.listenerSetter}),h=(0,M.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,n.fc)(h,(()=>{Wa({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=s.Z.settings;e.autoDownloadNew=(0,Fi.Z)(eo.h.settings.autoDownloadNew),e.autoDownload=(0,Fi.Z)(eo.h.settings.autoDownload),this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=s.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[l,c,d].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(i.label,l.container,c.container,d.container,h),this.scrollable.append(e.container)}{const e=new Wo({name:"AutoplayMedia"}),t=new xi.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0,listenerSetter:this.listenerSetter}),i=new xi.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0,listenerSetter:this.listenerSetter});e.content.append(t.label,i.label),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}setAutoDownloadSubtitle(e,t,i){let s,n=[];const a=Object.keys(t),o=a.map((e=>t[e]?xo[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(kt(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,v.v_)(o.map((e=>(0,v.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,g.Z)(e.subtitle,(0,v.ag)(s,n))}}var Ao=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Zo extends P{constructor(){super(...arguments),this.buttons={}}init(){return Ao(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=fa({listenerSetter:this.listenerSetter},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new _i("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=E("edit"),this.header.append(this.buttons.edit,e),this.profile=new Os(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(s.Z.myId);const t=this.profile.fillProfileElements(),i=(0,M.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,n.fc)(i,(()=>{const e=document.createElement("canvas");A.Z.createPopup(Z.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const a=()=>Ao(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._))}));a(),this.listenerSetter.add(s.Z)("avatar_update",(e=>{s.Z.myId===e&&a()}));const o=document.createElement("div");o.classList.add("profile-buttons");const r=[["unmute","AccountSettings.Notifications",Io],["data","DataSettings",_o],["lock","AccountSettings.PrivacyAndSecurity",ja],["settings","Telegram.GeneralSettingsViewController",uo],["folder","AccountSettings.Filters",Co]].map((([e,t,i])=>new fi({titleLangKey:t,icon:e,clickable:()=>{this.slider.createTab(i).open()},listenerSetter:this.listenerSetter})));r.push(this.devicesRow=new fi({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>Ao(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(Ga);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 fi({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,v.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(Mo).open()},listenerSetter:this.listenerSetter})),o.append(...r.map((e=>e.container)));const l=new Wo;l.content.append(o),this.scrollable.append(this.profile.element,l.container),(0,n.fc)(this.buttons.edit,(()=>{this.slider.createTab(po).open()}),{listenerSetter:this.listenerSetter}),ri.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 Do extends P{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new D((e=>{this.uploadAvatar=e}));const e=new Wo({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new b.Z({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new b.Z({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=F({icon:"arrow_next"}),(0,n.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)})),mm.setInnerPeer({peerId:e.toPeerId(!0)}),Qo.removeTabFromHistory(this),this.slider.createTab(ms).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 Fo=i(709);class Ro extends A.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,n.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,a.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&(Ei({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)})),c.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new b.Z({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new b.Z({label:"LastName",name:"create-contact-lastname",maxLength:70}),a=new Fo.Z({required:!0});e.push(i,s,a);const o=()=>{const e=i.value+" "+s.value;c.avatarElem.peerTitle=e,c.avatarElem.update()};this.listenerSetter.add(i.input)("input",o),this.listenerSetter.add(s.input)("input",o),a.validate=()=>!!a.value.match(/\d/);const r=yield this.managers.appUsersManager.getSelf(),l=(0,ds.u)(r.phone);l.code&&(a.value="+"+l.code.country_code);const c=new gi({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,c.avatarElem),this.container.append(t,a.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}class Bo extends P{init(){this.container.id="contacts-container";const e=F({icon:"add",className:"is-visible"});this.content.append(e),(0,n.fc)(e,(()=>{A.Z.createPopup(Ro)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new w("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(s.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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,Zn.k)()}createList(){const e=new Un({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),Jm.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!Je.IS_MOBILE&&Ea(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),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=zi.height/72*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,g.Z)(this.scrollable.container,i.list)}))}open(){return this.openContacts(),super.open()}}class No extends P{init(){if(this.wasFilterId=Jm.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!Jm.sortedLists[No.filterId]){const e=Jm.createChatList();Jm.generateScrollable(e,{id:No.filterId,orderIndex:1}).container.append(e),Jm.setListClickListener(e,null,!0)}const e=Jm.scrollables[No.filterId];return this.scrollable.container.replaceWith(e.container),this.scrollable=e,Jm.setFilterIdAndChangeTab(No.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){Jm.sortedLists[this.wasFilterId].clear()}onClose(){Jm.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return Jm.sortedLists[No.filterId].clear(),super.onCloseAfterTimeout()}}No.filterId=1;class Uo extends P{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===s.Z.settings.distanceUnit?e>1609.34?(0,v.ag)("MilesAway",[Math.round(e/1609)]):(0,v.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,v.ag)("KMetersAway2",[e/1e3]):(0,v.ag)("MetersAway2",[e])}open(){const e=super.open();return e.then((()=>{this.retryBtn.classList.remove("is-visible"),navigator.geolocation.getCurrentPosition((e=>{this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy},console.log(this.latestLocationSaved),this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy).then((e=>{const t=e.updates[0].peers,i=t.sort(((e,t)=>e.distance-t.distance)),s=t.filter((e=>"peerChannel"==e.peer._)).length,n=t.filter((e=>"peerChannel"!=e.peer._)).length;null==i||i.forEach((e=>{const t=(0,Bi.Z)(e.peer),i=t.isUser()?this.peopleSection:this.chatsSection;this.locatedPeers.set(t,e),i.sortedList.add(t)})),this.errorCategory.classList.toggle("hide",!(!n&&!s)),this.errorCategory.innerHTML="No groups or channels found around you."}))}),(e=>{this.errorCategory.classList.remove("hide"),this.retryBtn.classList.add("is-visible"),this.retryBtn.addEventListener("click",this.open),e instanceof GeolocationPositionError?this.errorCategory.innerHTML="Location permission denied. Click below to retry.":this.errorCategory.innerHTML="An error has occurred. Please retry later clicking the button below."}))})),e}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,Mi("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,Mi("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 Oo=i(4159),Ho=i(7487);function zo(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]}var Go=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Vo="is-left-column-shown",Ko="sidebar-left-section";class Wo{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(Ko+"-container");const s=this.innerContainer=document.createElement("div");if(s.classList.add(Ko),e.noShadow&&s.classList.add("no-shadow"),e.fakeGradientDelimiter)s.append($o()),s.classList.add("with-fake-delimiter");else if(e.noDelimiter)s.classList.add("no-delimiter");else{const e=document.createElement("hr");s.append(e)}const n=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",Ko+"-name"),(0,v.XZ)({element:t,key:e.name,args:e.nameArgs}),n.append(t)}i.append(s);const a=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(a){const t=this.caption=this.generateContentElement();t.classList.add(Ko+"-caption"),e.captionOld||i.append(t),!0!==a&&(0,v.XZ)({element:t,key:a,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(Ko+"-content"),this.innerContainer.append(e),e}}const jo=(e,t,i)=>{const s=new Wo({name:t,caption:i});return e.append(s.container),s.content},$o=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e},qo=new class extends _{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new w("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(Bo).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(No).open()},verify:()=>Go(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(1,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(1))}))},o=new xi.Z({toggle:!0,checked:"night"===Ya.Z.getTheme().name});o.input.addEventListener("change",(()=>Go(this,void 0,void 0,(function*(){yield this.managers.appStateManager.setByKey("settings.theme",o.input.checked?"night":"day"),s.Z.dispatchEvent("theme_change")})))),s.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===Ya.Z.getTheme().name)}));const r=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout((()=>{mm.setPeer({peerId:mm.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},lo.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(Uo).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(Zo).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new xi.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=v.ZP.format("TelegramFeaturesUrl",!0);mm.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([Ho.Z.set({kz_version:"Z"}),Ho.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>Oo.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Ho.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>Oo.Z.isMainDomain}].filter(Boolean);this.toolsBtn=fa({},"bottom-right",r,(e=>Go(this,void 0,void 0,(function*(){yield Promise.all(r.map((e=>Go(this,void 0,void 0,(function*(){e.verify&&e.element.classList.toggle("hide",!(yield e.verify()))})))))})))),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const l=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(n.pf,(e=>{e.stopPropagation(),xs.closeBtnMenu()}));const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+Oo.Z.suffix+" "+Oo.Z.versionFull,c.append(d),l.classList.add("has-footer"),l.append(c),this.newBtnMenu=fa({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(Do).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(ms).open({type:"chat",skippable:!1,takeOut:e=>{this.createTab(de).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,we.Z)(this.updateBtn),this.updateBtn.append((0,v.ag)("Update")),(0,n.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",a.element.append(this.archivedCount),s.Z.addEventListener("folder_unread",(e=>{if(1===e.id){const t=e.unreadPeerIds.size;this.archivedCount.innerText=""+zo(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const h={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};C.Z.pushItem(h),Ci.Z.getState().then((e=>{const t=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((e=>{e!==Oo.Z.versionFull&&(this.hasUpdate=!0,clearInterval(t),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(ft.Z)}),18e5)}))}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new m.ZP(e),i=()=>{(0,n.tH)(this.backBtn)};this.searchGroups={contacts:new f("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new f("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new f("SearchMessages","messages"),people:new f(!1,"contacts",!0,"search-group-people",!0,!1,i),recent:new f("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new ga({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);let a=[],o="".toPeerId(),c=0,d=0;const h=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},u=document.createElement("div");u.classList.add("search-helper"),u.addEventListener("click",(e=>{const t=(0,r.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");c=+t,d=+s}else o=i.toPeerId();t.addEventListener("click",(()=>{v(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),h()})),s.nav.parentElement.append(u);const p=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new km;return s.classList.add("selector-user-avatar","tgico","avatar-30"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Nt({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,g.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},v=e=>{0===e.dataset.key.indexOf("date_")?c=d=0:o="".toPeerId(),e.remove(),(0,k.Z)(a,e),setTimeout((()=>{h(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{a.forEach((e=>{v(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:c,maxDate:d}),s.load(!0),u.innerHTML="",s.nav.classList.remove("hide"),!o&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.appMessagesManager.getConversations(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=>{u.append(p(e))})),s.nav.classList.toggle("hide",!!u.innerHTML))}))}if(!c&&e.trim()){const t=[];X(e,t),t.forEach((e=>{u.append(p("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!u.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,l.Z)(e.target,jm);if(!t)return;const i=(0,r.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});let y=document.createElement("div");y.classList.add("search-group-scrollable"),y.append(this.searchGroups.people.list),this.searchGroups.people.container.append(y),new m.v7(y);let b,w=!0;const L=(0,S.v)(e.parentElement,"zoom-fade",150,(e=>{b&&clearTimeout(b),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),b=window.setTimeout((()=>{b=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}));L(0);const I="is-visible",M=()=>{this.toolsBtn.classList.remove(I),this.backBtn.classList.add(I),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";Je.IS_MOBILE_SAFARI||C.Z.findItemByType(e)||C.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",M),M(),(0,n.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(I),this.backBtn.classList.remove(I),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),C.Z.removeByType("global-search"),L(0)}));const P=E("close");this.searchGroups.recent.nameEl.append(P),P.addEventListener("click",(()=>{Wa({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}};R.GO.appSidebarLeft=qo;const Qo=qo;class Yo{constructor(e,t,i){this.container=document.createElement("div"),this.container.classList.add("bubbles-group"),this.chat=e,this.groups=t,this.items=[],this.dateTimestamp=i,this.offset=0}createAvatar(e){if(this.avatarLoadPromise)return this.avatarLoadPromise;if("messageService"===e._)return;this.avatarContainer=document.createElement("div"),this.avatarContainer.classList.add("bubbles-group-avatar-container"),++this.offset;const t=e.fwd_from,i=e.fwdFromId,n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===i,a=this.chat.peerId;return this.avatar=new km,this.avatar.classList.add("bubbles-group-avatar","user-avatar","avatar-40"),this.avatarLoadPromise=this.avatar.updateWithOptions({lazyLoadQueue:this.chat.bubbles.lazyLoadQueue,peerId:(t&&(a===s.Z.myId||a===le.hj)||n?i:e.fromId)||le.NM,peerTitle:!i&&t&&t.from_name?t.from_name:void 0}),this.avatarContainer.append(this.avatar),this.container.append(this.avatarContainer),this.avatarLoadPromise}get firstTimestamp(){return this.firstItem.timestamp}get firstMid(){return this.firstItem.mid}get firstItem(){return this.items[this.items.length-1]}get lastTimestamp(){return this.lastItem.timestamp}get lastMid(){return this.lastItem.mid}get lastItem(){return this.items[0]}updateClassNames(){const e=this.items,t=e.length;if(!t)return;const i=e[t-1].bubble;if(1===e.length)return void i.classList.add("is-group-first","is-group-last");i.classList.remove("is-group-last"),i.classList.add("is-group-first");for(let i=1,s=t-1;i{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||(Fn(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);Fn(this.container,e.container,Xl+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 Jo{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){e.group.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t),a.unmountItem(t);const o=new Set;o.add(a);const[r,l]=n;if(r&&l&&this.canItemsBeGrouped(r,l)&&r.group!==l.group){const e=l.group;this.f(l.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}this.mountUnmountGroups(Array.from(o))}mountUnmountGroups(e){const[t,i]=function(e,t){const i=[],s=[];for(let t=0,a=e.length;t{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()}}class Xo extends A.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 b.Z({plainText:!0}),this.minutesInputField=new b.Z({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,n.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,t=[];const 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 v.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new v.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,v.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new v.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&&d.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new v.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 v.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{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)}}var tr=i(6654);class ir extends HTMLElement{constructor(){super(),this.classList.add("reaction"),this.managers=s.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e){this.type=e,this.classList.add("reaction-"+e)}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("reaction-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=this.managers.appReactionsManager.getReaction(i.reaction);(0,tr.Z)(e,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive");const i="inline"===this.type?14:22,s=this.wrapStickerPromise=pi({div:this.stickerContainer,doc:null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon,width:i,height:i,static:!0,managers:this.managers}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===s&&(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("reaction-counter"));const e=zo(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 qs({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,Bi.Z)(e.peer_id))))))}setIsChosen(e=!!this.reactionCount.pFlags.chosen){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&Re(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){(0,tr.Z)(this.managers.appReactionsManager.getReaction(this.reactionCount.reaction),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add("reaction-sticker-activate"),Promise.all([pi({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}).then((({render:e})=>e)),hi({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers}).stickerPromise]).then((([e,t])=>{const s=()=>{(0,Be.T2)((()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")}))};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(s,1e3)})):s())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define("reaction-element",ir);const sr=new Map;class nr extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[],this.managers=s.Z.managers}connectedCallback(){let e=sr.get(this.key);e||sr.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=sr.get(this.key);e.delete(this),e.size||sr.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i){void 0!==this.key&&this.disconnectedCallback(),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.isPlaceholder=i,this.type!==t&&(this.type=t,this.classList.add("reactions-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.isPlaceholder)}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;const s=this.managers.appReactionsManager.getAvailableReactions(),n=i?s instanceof Promise?t.results:t.results.filter((e=>this.managers.appReactionsManager.isReactionActive(e.reaction))):[];(0,mo.Z)(this.sorted,((e,t,i)=>{const s=e.reactionCount.reaction;n.some((e=>e.reaction===s))||(i.splice(t,1),e.remove())}));const a=n.reduce(((e,t)=>e+t.count),0),o=t&&!!t.pFlags.can_see_list&&a<4;if(this.sorted=n.map(((e,i)=>{const s=this.sorted.findIndex((t=>t.reactionCount.reaction===e.reaction));let n=-1!==s&&this.sorted[s];n||(n=new ir,n.init(this.type)),Fn(n,this,i);const a=t.recent_reactions?t.recent_reactions.filter((t=>t.reaction===e.reaction)):[];return n.reactionCount=Object.assign({},e),n.setCanRenderAvatars(o),n.render(this.isPlaceholder),n.renderCounter(),n.renderAvatars(a),n.setIsChosen(),n})),!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===mm.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>t.reactionCount.reaction===e.reaction));t&&t.fireAroundAnimation()}))}}customElements.define("reactions-element",nr);s.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(`replies-element[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class ar extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=s.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 qs({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,Bi.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 v.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)?zo(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("replies-element",ar);const or=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,v.$d)(e,"EditedMessage"),e},rr=()=>(0,v.ag)("SponsoredMessage");var lr;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r,l,d;const h=!!s.pFlags.sponsored,u=!("action"in s)&&!h;let p,m=h?void 0:V(n);if(u){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=zo(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,c.Z)(t,(0,Zt.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=or()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}"peerUser"===s.peer_id._&&(p=!0,d=e.reactionsMessage,l=new nr,l.init(d,"inline",!0),l.render(),a.unshift(l))}else h&&a.push(r=rr());m&&a.push(m);let g=h?void 0:K(n);u&&(g+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${K(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${K(new Date(1e3*s.fwd_from.date))}`:""));const v=document.createElement("span");v.classList.add("time","tgico"),v.append(...a);const f=document.createElement("div");f.classList.add("inner","tgico"),g&&(f.title=g);let y=a;if(o&&(y[y.indexOf(o)]=or()),r&&(y[y.indexOf(r)]=rr()),l){const e=y[y.indexOf(l)]=new nr;e.init(d,"inline"),e.render()}return y=y.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),m&&(y[y.length-1]=V(n)),f.append(...y),v.append(f),v},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 ar;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:n})=>{return a=this,o=void 0,l=function*(){const a=!i;a&&(i=t.querySelector(".bubble-content"));const o=a?i.querySelector(".reply"):null;if(!n.reply_to_mid)return o&&o.remove(),void t.classList.remove("is-reply");const r=n.reply_to.reply_to_peer_id?(0,Bi.Z)(n.reply_to.reply_to_peer_id):e.peerId;let l,c,d=yield s.Z.managers.appMessagesManager.getMessageByPeer(r,n.reply_to_mid);if(d){const e=d.fwdFromId;c=n.fwdFromId&&n.fwdFromId===e?n.fwdFromId:d.fromId||e,l=new Nt({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else s.Z.managers.appMessagesManager.fetchMessageReplyTo(n),e.bubbles.needUpdate.push({replyToPeerId:r,replyMid:n.reply_to_mid,mid:n.mid}),l=(0,v.ag)("Loading");const{container:h,fillPromise:u}=kn(l,void 0,d,e.isAnyGroup?c:void 0);yield u,o?o.replaceWith(h):i.append(h),t.classList.add("is-reply")},new((r=void 0)||(r=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 r?n:new r((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,o||[])).next())}));var a,o,r,l}}(lr||(lr={}));var cr=i(252);function dr(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)}function hr(e){e.style.display="none",e.offsetLeft,e.style.display=""}R.GO.getElementByPoint=dr;const ur=2147483646;var pr=i(993);function mr(e,t,i,s=e.getBoundingClientRect(),n=t.getBoundingClientRect()){let{top:a,right:o,bottom:r,left:l}=n;if(i){const e=t.querySelector(".sticky");e&&(a=e.getBoundingClientRect().bottom)}if(s.top>=r||s.bottom<=a||s.right<=l||s.left>=o)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},d="visualViewport"in window?window.visualViewport:window,h=d.width||d.innerWidth,u=d.height||d.innerHeight;return{rect:{top:s.topo&&o!==h?(c.right=!0,++c.horizontal,o):s.right,bottom:s.bottom>r&&r!==u?(c.bottom=!0,++c.vertical,r):s.bottom,left:s.left{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);mm.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&Ei({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 km;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),dt({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):Ts(s,le.NM,!1,e.title);const n=document.createElement("div");n.classList.add("chat-title"),(0,c.Z)(n,(0,Zt.Z)(e.title));const a=e.pFlags.broadcast,o=(0,v.ag)(a?"Subscribers":"Members",[ji(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,v.$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{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((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"}(gr||(gr={}));var fr=i(5418);class yr{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(mr(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){Je.IS_SAFARI&&e&&hr(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;let n;if(this.scrollHeight=s,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)}}R.GO&&(R.GO.ScrollSaver=yr);class br{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;i{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}var Mr=i(9976),Er=i(3447),Pr=i(7746);function Tr(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,ci.w1)(e).join("-").replace(/-?fe0f/g,"")}}const kr=new Set;function xr(e,t,i=!1,n=!1){var a;const o=document.createElement("span");let r;if(o.classList.add("super-emoji"),n&&!Mr.Z?r=function(e){return(0,ei.Z)(e,{entities:[Tr(e)]})}(e):(e=(0,Pr.Z)(e),r=(0,Zt.Z)(e)),o.append(r),o.children.length>1){const e=o.firstElementChild;o.innerHTML="",o.append(e)}if("IMG"===(null===(a=o.firstElementChild)||void 0===a?void 0:a.tagName)){const e=o.firstElementChild,t=e.src;if(!kr.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),s.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,Be.T2)((()=>{s.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),o.classList.remove("empty"),kr.add(t)}))}),{once:!0}),o.append(i)}}i?t.prepend(o):t.appendChild(o)}function _r(e){return(0,r.Z)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class Ar{constructor(e){this.managers=e,this.closeScrollTop=0,this.onContentClick=e=>{(0,a.Z)(e);const t=_r(e.target);t&&(mm.chat.input.onEmojiSelected(t,!1),mi.Z&&(0,Xn.Z)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},i=new Map([["Emoji.Recent",[]]]);for(const t in Er.Z){const s=""+Er.Z[t],n=e[+s[0]-1];if(!n)continue;let a=i.get(n);a||(a=[],i.set(n,a)),a[+s.slice(1)||0]=t}i.delete(e.pop()),i.forEach(((e,i)=>{const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append((0,v.ag)(i));const a=document.createElement("div");a.classList.add("super-emojis"),s.append(n,a),e.forEach((e=>{xr((0,ci.zu)(e),a,!1)})),t[i]=s}));const a=this.menu=this.content.previousElementSibling,o=this.scroll=new m.ZP(this.content,"EMOJI"),r=(0,be.y)(this.content,!0);Promise.all([(0,fr.Z)(200),this.managers.appEmojiManager.getRecentEmojis().then((e=>{const t=!!e.length,i=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[i].classList.add("active");const s=jr.menuOnClick(a,o,void 0,i);return this.stickyIntersector=s.stickyIntersector,this.setMenuActive=s.setActive,e}))]).then((([i,s])=>{r.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of s)xr(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map((e=>{const i=t[e];return i||console.error("no div by category:",e),o.container.append(i),this.stickyIntersector.observeStickyHeaderChanges(i),i}))})),(0,n.fc)(this.content,this.onContentClick),this.init=null,s.Z.addEventListener("emoji_recent",(e=>{const t=Array.from(this.recentItemsDiv.children);for(let i=0,s=t.length;i{this.closeScrollTop=this.scroll.scrollTop}))}onClose(){}}class Zr extends fe{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new pe((e=>{const{target:t,visible:i}=e,s=me(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){this.intersector.observe(e)}}var Dr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Fr=100;class Rr{constructor(e,t,i,n=!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,Oe.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>Dr(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img");i&&(i&&i.classList.remove("hide"),yield(0,Be.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),p.Z.getAnimations(t).forEach((e=>{p.Z.checkAnimation(e,!0,!0)})))})))),this.managers=s.Z.managers,this.lazyLoadQueue=new Zr(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),n&&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])=>Dr(this,void 0,void 0,(function*(){const i=(yield jt({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video");e.style.opacity="";const i=e.querySelector("img");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),p.Z.getAnimations(t).forEach((e=>{p.Z.checkAnimation(e,!0,!0)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){let i=e.w,s=e.h;s{e.forEach((e=>{i.add(e)})),s.remove()})),qr.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}class Nr extends fe{constructor(e,t,i){super(e),this.onVisibilityChange=t,this._queue=new Map,this.intersector=new pe((e=>{const{target:t,visible:i}=e,s=me(this.queue,(e=>e.div===t));i&&(s.length?s:[this._queue.get(t)]).forEach((e=>{this.queue.unshift(e||this._queue.get(t))})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}var Ur=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Or{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)=>{p.Z.getAnimations(e).forEach((e=>{t?p.Z.checkAnimation(e,!1):p.Z.checkAnimation(e,!0,!0)}))},this.processVisible=e=>Ur(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=d.Z.active.esgSticker.width,n=pi({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>Ur(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 Nr(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)),pi({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.unobserve(e)}}class Hr{constructor(e){this.managers=e,this.mounted=!1,this.categories={},this.categoriesMap=new Map}createCategory(e,t){const i=document.createElement("div");i.classList.add("emoji-category","hide");const s=document.createElement("div");s.classList.add("category-items","super-stickers");const n=document.createElement("div");n.classList.add("category-title"),n.append(t);const a=E(void 0,{noRipple:!0});a.classList.add("menu-horizontal-div-item");const o=document.createElement("div");o.classList.add("menu-horizontal-div-item-padding"),a.append(o);const r={elements:{container:i,title:n,items:s,menuTab:a,menuTabPadding:o},set:e,items:[]};return i.append(n,s),this.categories[e.id]=r,this.categoriesMap.set(i,r),this.categoriesIntersector.observe(i),this.stickyIntersector.observeStickyHeaderChanges(i),r}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)})),this.setCategoryItemsHeight(e),i.classList.remove("hide")}))}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}setCategoryItemsHeight(e){const t=this.content.getBoundingClientRect().width-10,i=d.Z.active.esgSticker.width,s=Math.floor(t/i),n=Math.ceil(e.items.length/s)*i;e.elements.items.style.minHeight=n+"px"}renderStickerSet(e,t=!1){return Ur(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,Zt.Z)(e.title)),{menuTab:s,menuTabPadding:n,container:a}=i.elements;Fn(s,this.menu,t?1:65535);const o=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,o.then((e=>e.documents))),Fn(a,this.scroll.container,t?1:65535,-1),_n({set:e,container:n,group:Wr,lazyLoadQueue:jr.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers");const e=this.content.previousElementSibling;this.menu=e.firstElementChild;const t=new m.v7(e);this.scroll=new m.ZP(this.content,"STICKERS"),this.scroll.onAdditionalScroll=()=>{o()};const i={root:qr.getElement()};this.categoriesIntersector=new pe((({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);t?s.elements.items.append(...s.items.map((({element:e})=>e))):s.elements.items.textContent=""}),i);const a=e=>{e.elements.items.textContent="",e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scroll.container.addEventListener("click",(e=>{const t=e.target;if((0,r.Z)(t,"category-title")){const e=(0,r.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if("recent"===i.set.id)return;new oo({id:i.set.id,access_hash:i.set.access_hash}).show()}else jr.onMediaClick(e)}));const o=(e=!1)=>{s.Z.dispatchEvent("choosing_sticker",!e)};qr.addEventListener("closed",(()=>{o(!0)})),qr.addEventListener("opened",(()=>{o()}));const{stickyIntersector:l,setActive:c}=jr.menuOnClick(this.menu,this.scroll,t);this.stickyIntersector=l;const h=(0,be.y)(this.content,!0),u=this.createCategory({id:"recent"},(0,v.ag)("Stickers.Recent"));u.elements.title.classList.add("disable-hover"),u.elements.menuTab.classList.add("tgico-recent","active"),u.elements.menuTabPadding.remove(),this.toggleRecentCategory(u,!1);const p=E("close",{noRipple:!0});u.elements.title.append(p),(0,n.fc)(p,(()=>{Wa({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),ft.Z)}));const g=e=>{const t=e.slice(0,20);a(u),this.toggleRecentCategory(u,!!t.length),this.categoryAppendStickers(u,Promise.resolve(t))};Promise.all([this.managers.appStickersManager.getRecentStickers().then((e=>{h.remove(),g(e.stickers)})),this.managers.appStickersManager.getAllStickers().then((e=>{h.remove();for(let t of e.sets)this.renderStickerSet(t)}))]).finally((()=>{this.mounted=!0,o(),c(0)})),this.superStickerRenderer=new Or(jr.lazyLoadQueue,Wr,this.managers,i);const f=this.superStickerRenderer.lazyLoadQueue;qr.addLazyLoadQueueRepeat(f,this.superStickerRenderer.processInvisible),s.Z.addEventListener("stickers_installed",(e=>{!this.categories[e.id]&&this.mounted&&this.renderStickerSet(e,!0)})),s.Z.addEventListener("stickers_deleted",(({id:e})=>{const t=this.categories[e];t&&this.mounted&&(t.elements.container.remove(),t.elements.menuTab.remove(),this.categoriesIntersector.unobserve(t.elements.container),a(t),delete this.categories[e],this.categoriesMap.delete(t.elements.container))})),s.Z.addEventListener("stickers_recent",(e=>{this.mounted&&g(e)}));const y=()=>{for(const[e,t]of this.categoriesMap)this.setCategoryItemsHeight(t)};d.Z.addEventListener("resize",y),qr.addEventListener("opened",y),this.init=null}toggleRecentCategory(e,t){t?(Fn(e.elements.menuTab,this.menu,0),Fn(e.elements.container,this.scroll.container,0)):(e.elements.menuTab.remove(),e.elements.container.remove())}pushRecentSticker(e){this.managers.appStickersManager.pushRecentSticker(e.id);const t=this.categories.recent;if(!t)return;const i=t.elements.items;let s=(0,ge.Z)(t.items,(t=>t.document.id===e.id));s||(s={element:this.superStickerRenderer.renderSticker(e),document:e}),t.items.unshift(s),i.childElementCount&&i.prepend(s.element),i.childElementCount>20&&Array.from(i.children).slice(20).forEach((e=>e.remove())),this.setCategoryItemsHeight(t),this.toggleRecentCategory(t,!0)}onClose(){}}const zr="GIFS-SEARCH";class Gr extends P{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=(0,r.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;mm.chat.input.sendMessageWithDocument(i)?d.Z.isMobile&&Ws.onCloseBtnClick():console.warn("got no doc by id:",i)}}init(){this.container.id="search-gifs-container",this.inputSearch=new w("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,n.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new Rr(this.gifsDiv,zr,this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",p.Z.checkAnimations(void 0,zr),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return Ws.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}})),e}search(e,t=!0){return i=this,s=void 0,a=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(le.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}}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class Vr extends P{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new ye,this.inputSearch=new w("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,n.fc)(this.setsDiv,(e=>{const t=(0,r.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void mm.chat.input.sendMessageWithDocument(e)}const i=(0,r.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,n=i.dataset.access_hash,a=(0,r.Z)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:n}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(a.textContent="",a.append((0,v.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{a.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:n}).then((e=>{new oo(e.set).show()}))}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",p.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,c.Z)(s.firstElementChild,(0,Zt.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,v.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,v.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.renderFeatured()})),e}renderFeatured(){return this.managers.appStickersManager.getFeaturedStickers().then((e=>{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,mo.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()})),p.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()}}class Kr extends L.Z{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(!this.isActive())return;clearTimeout(this.displayTimeout);const t=e.toElement;t&&(0,ta.Z)(t,this.element)||(this.displayTimeout=window.setTimeout((()=>{this.toggle(!1)}),200))},this.toggle=e=>{return t=this,i=void 0,n=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())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"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.forceClose=!1,this.dispatchEvent("opened")}),mi.Z?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),mi.Z?0:200)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},(0,x.Z)(this,e)}attachButtonListener(e,t){let i=!0;mi.Z?(0,n.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{clearTimeout(this.displayTimeout),this.onMouseOut(e)})),i=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.toggle(!0)}),200)}))}init(){mi.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}const Wr="emoticons-dropdown";class jr extends Kr{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(p.Z.checkAnimations(!0,Wr),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=mm.chat,i=this.tabsEl.children,s=Array.from(i),n=this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers");s[2].toggleAttribute("disabled",!n);const a=this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs");s[3].toggleAttribute("disabled",!a);const o=this.tabsEl.querySelector(".active");!o||1===(0,Dn.Z)(o)||n&&a||this.selectTab(0,!1)},this.addEventListener("open",(()=>{return e=this,t=void 0,s=function*(){mi.Z&&(0,Xn.Z)()&&(yield(0,fr.Z)(100)),this.element.parentElement!==mm.chat.input.chatInput&&mm.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),jr.lazyLoadQueue.lock(),p.Z.lockIntersectionGroup(Wr)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s})),this.addEventListener("opened",(()=>{p.Z.unlockIntersectionGroup(Wr),jr.lazyLoadQueue.unlock(),jr.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")})),this.addEventListener("close",(()=>{jr.lazyLoadQueue.lock(),p.Z.lockIntersectionGroup(Wr),p.Z.checkAnimations(!0,Wr)})),this.addEventListener("closed",(()=>{p.Z.unlockIntersectionGroup(Wr),jr.lazyLoadQueue.unlock(),jr.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0}))}init(){this.managers=s.Z.managers,this.emojiTab=new Ar(this.managers),this.stickersTab=new Hr(this.managers),this.gifsTab=new Br(this.managers),this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,ue.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),p.Z.checkAnimations(!1,Wr)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{1===this.tabId?Ws.isTabExists(Vr)||Ws.createTab(Vr).open():Ws.isTabExists(Gr)||Ws.createTab(Gr).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",(e=>{var t;const i=mm.chat.input.messageInput;(null===(t=i.lastChild)||void 0===t?void 0:t.tagName)?i.lastElementChild.remove():i.lastChild&&(i.lastChild.textContent.length?i.lastChild.textContent=i.lastChild.textContent.slice(0,-1):i.lastChild.remove());const s=new Event("input",{bubbles:!0,cancelable:!0});mm.chat.input.messageInput.dispatchEvent(s),(0,a.Z)(e)}));const e=Je.IS_APPLE_MOBILE,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),(0,n.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),mm.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}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===mm.chat.input.messageInput)return e.getRangeAt(0)}}jr.lazyLoadQueue=new ye,jr.menuOnClick=(e,t,i,s=0)=>{let n=-1;const a=t=>t!==s&&(e.children[s].classList.remove("active"),e.children[t].classList.add("active"),s=t,!0),o=new er(t.container,((s,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=(0,Dn.Z)(o);!s&&r||(a(r),i&&i.scrollIntoViewNew({element:e.children[r],position:"center",axis:"x"}))}));return e.addEventListener("click",(e=>{let i=e.target;if(i=(0,r.Z)(i,"menu-horizontal-div-item"),!i)return;const s=(0,Dn.Z)(i);if(!a(s))return;const o=(t.splitUp||t.container).children[s].offsetTop+1;t.container.scrollTop=n=o})),{stickyIntersector:o,setActive:a}},jr.onMediaClick=(e,t=!1)=>{let i=e.target;if(i=(0,l.Z)(i,"DIV"),!i)return!1;const s=i.dataset.docId;return!!s&&(mm.chat.input.sendMessageWithDocument(s,void 0,t)?($r.container&&($r.forceClose=!0,$r.container.classList.add("disable-hover"),$r.toggle(!1)),!0):(console.warn("got no doc by id:",s),!1))};const $r=new jr;R.GO.emoticonsDropdown=$r;const qr=$r;var Qr=i(2381);const Yr=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 Jr(e){return e.replace(/\D/g,"")}const Xr={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])/},el={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}},tl=Yr(((e="")=>{const t=Object.keys(Xr),i=Jr(e);let s,n=0;return t.forEach((e=>{const t=Xr[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function il(e=""){return"diners14"===(t=tl(e))?"diners":t;var t}var sl=i(2398),nl=i(7298);function al(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const ol="0".charCodeAt(0)-"0".charCodeAt(0),rl=/[0-9]/g;function ll(e){return String.fromCharCode(e.charCodeAt(0)-ol)}function cl(e){return e.replace(rl,ll)}function dl(e,t){return{type:"optional",result:e,consumed:t}}function hl(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function ul(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?dl:hl;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const pl=ul(/1[0-2]|0?[1-9]|0/),ml={digit:function(e){return ul(/[0-9]/)(cl(e))},capitalCharacter:function(e){const t=ul(/\w/)(e);return t.result?hl(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=pl(cl(e)),i=Jr(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?hl(t.result,e.length,!0):hl(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=ul(e,!0)(t);return i.result?i:dl("",0)}},gl=ml.digit,vl=ml.capitalCharacter,fl=ml.formattingCharacter(" "),yl=ml.optionalPattern(/\d\d/),bl=[gl,gl,gl,gl,fl,gl,gl,gl,gl,gl,gl,fl,gl,gl,gl,gl,gl],wl=[gl,gl,gl,gl,fl,gl,gl,gl,gl,gl,gl,fl,gl,gl,gl,gl],Sl=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"]),Cl=Yr((e=>{const t=[];for(let i=0,s=0;i[ml.month,ml.formattingCharacter("/"),gl,gl,yl],cardCvc:e=>Ll.cardCvcFromBrand(tl(e)),cardCvcFromBrand:Yr((e=>{const t=el[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=al(i||s,gl);if(i&&i{switch(e){case"US":return al(5,gl);case"CA":return Je.IS_ANDROID?null:[vl,vl,vl,fl,vl,vl,vl];default:const t=al(10,ml.optionalPattern(/\d/));return Sl.has(e)&&(t[0]=gl),t}}))},Il=Ll;function Ml(e){return Ie(e.map((e=>e.length)),0)}const El=new RegExp("‎","g");function Pl(e){return e?{type:"invalid",code:e}:null}function Tl(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=Jr(e),i=tl(e);return{sanitized:t,brand:i,minLength:el[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"===tl(e)?null:Pl("invalid"):i?null:Pl("incomplete")}(i,s,t.ignoreIncomplete)}function kl(e,t={}){const i=e.replace(El,"").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:Pl("incomplete"):Pl(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{_l.set(i.contentWindow,t)}),{once:!0}),i}window.addEventListener("message",(e=>{const t=_l.get(e.source);t&&t(JSON.parse(e.data))}));class Zl extends A.Z{constructor(e){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.d()}d(){const e=Al(this.url,(e=>{"web_app_open_tg_link"===e.eventType&&(this.dispatchEvent("finish"),this.hide(),mm.openUrl("https://t.me"+e.eventData.path_full))}));this.body.append(e),this.show()}}class Dl extends b.Z{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 l=0,c=0,d=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===d&&c+1>=i.selectionStart&&(d=Ml(o)+(s?r.length:0)),null===h&&c+1>=i.selectionEnd&&(h=Ml(o)+(s?r.length:0)),c+=e)};for(;l=t.length)break;r.push(a),++l,u(d)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===d||t.length&&i.selectionStart===t.length?Ml(o):d,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?Ml(o):h},autocorrectComplete:l===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:l}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:l}}({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 l;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={}),l=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:Pl("incomplete")}(this.lastTransformed,0,t),null==l?void 0:l.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[l.code];return!i&&this.setState(b.I.Error,e),!1}return!i&&this.setState(b.I.Neutral),!0}}function Fl(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 Dl){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 Rl(e,t){let i,s;return(e||t)&&(e&&(i=new xl.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new Dl({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return Il.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Bl=new Set(["stripe","smartglocal"]);class Nl extends A.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Bl.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Bl.has(e.native_provider))this.d();else{const t=Al(e.url,(t=>{if("payment_form_submit"!==t.eventType)return;const i=t.eventData,s={title:i.title,save:!1};this.dispatchEvent("finish",{token:i.credentials,card:s}),this.hide(),e.pFlags.can_save_credentials&&Wa({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{s.save=!0}),ft.Z)}));this.body.append(t),this.show()}}d(){const e=this.savedCard,t=new Wo({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new Dl({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:Il.cardNumber,validateMethod:Tl,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=Vl(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),Ze(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(il(e.value)),c.update()}});let r;i.need_cardholder_name&&(r=new b.Z({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const l=new Dl({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:Il.cardExpiry,validateMethod:kl}),c=new Dl({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",formatMethod:()=>Il.cardCvc(o.value)}),d=[o,l,c,r].filter(Boolean);d.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=d[d.indexOf(e)-1];t&&(0,sl.Z)(t.input,!0)}};if(e instanceof Dl){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=d.indexOf(e),i=d.length;te.container))));const v=!!this.paymentForm.pFlags.can_save_credentials;p=new xi.Z({text:"PaymentCardSavePaymentInformation",checked:!!v});const f=new fi({checkboxField:p,subtitleLangKey:v?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text",noCheckboxSubtitle:!0});v||f.container.classList.add("is-disabled"),(u||t).content.append(f.container),this.scrollable.append(...[t,u].filter(Boolean).map((e=>e.container)));const y=Kl({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:l.value,expiryMonth:l.value.split("/")[0],expiryYear:l.value.split("/")[1],cvc:c.value,cardholderName:null==r?void 0:r.value,country:null==m?void 0:m.value,zip:null==g?void 0:g.value,save:null==p?void 0:p.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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((n=n.apply(e,t||[])).next())}));var e,t,s,n}});Fl([o,r,l,c,m,g].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,l.value=e.expiryFull,c.value=e.cvc,r&&(r.value=e.cardholderName),m&&(m.value=e.country),g&&(g.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,sl.Z)(o.input)}}class Ul extends A.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 Wo({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new Aa.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(b.I.Neutral)};s.input.addEventListener("input",n);const a=Kl({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{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,sl.Z)(s.input)}}class Ol extends A.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.message=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,n,a,o,r,l,c,d,h,u;if(e.pFlags.shipping_address_requested){i=new Wo({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new b.Z({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new b.Z({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new b.Z({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new b.Z({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=Rl(!0,!0);r=e.countryInputField,l=e.postcodeInputField,i.content.append(...[s,n,a,o,r,l].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){c=new Wo({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=ka(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(d=new b.Z({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new b.Z({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new Fo.Z({required:!0,validate:i})),c.content.append(...[d,h,u].filter(Boolean).map((e=>e.container)))}const p=new xi.Z({text:"PaymentShippingSave",checked:!0}),m=new fi({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo",noCheckboxSubtitle:!0});(c||i).content.append(m.container),this.scrollable.append(...[i,c].filter(Boolean).map((e=>e.container)));const g=Kl({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,c=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:l.value},name:null==d?void 0:d.value,email:null==h?void 0:h.value,phone:null==u?void 0:u.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.message.peerId,this.message.mid,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:l,REQ_INFO_NAME_INVALID:d,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(c.next(e))}catch(e){n(e)}}function o(e){try{r(c.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((c=c.apply(e,t||[])).next())}));var e,t,i,c}});if(this.body.append(this.btnConfirmOnEnter=g),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),l.value=e.post_code),t.name&&d&&(d.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:v}=Fl([s,n,a,o,r,l,d,h,u].filter(Boolean),(e=>{g.disabled=!e}));let f;v(),this.show(),f=this.focus?{name:d,email:h,phone:u}[this.focus]:s,f&&(0,sl.Z)(f.input)}}class Hl extends A.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 Wo({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new fi({radioField:new Li({text:e.title,name:"shipping-method",value:e.id}),subtitle:yn(Ie(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=yi(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=Kl({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 zl=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Gl=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function Vl(e){if(Gl.includes(e))return`assets/img/${e}.svg`}function Kl(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new v.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),a=s.key,o=(0,M.Z)("btn-primary btn-color-primary payment-item-pay");return o.append(s.element),(0,n.fc)(o,(()=>zl(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,be.y)(o),n=(0,Ai.Z)([o],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),n(),s.compareAndUpdate({key:a}),i.remove()}})))),o}class Wl extends A.Z{constructor(e,t,i){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.receiptPeerId=t,this.receiptMsgId=i,this.tipButtonsMap=new Map,this.d()}d(){var e,t;return zl(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let i=!1;const a=()=>{i||(i=!0,me&&me.hide(),this.hide())};this.listenerSetter.add(s.Z)("payment_sent",(({peerId:e,mid:t})=>{this.message.peerId===e&&this.message.mid===t&&a()}));const{message:o}=this,l=o.media,d=!(!this.receiptMsgId&&!l.receipt_msg_id);(0,v.$d)(this.title,d?"PaymentReceipt":"PaymentCheckout"),l.pFlags.test&&this.title.append(" (Test)");const h="payment-item",u=document.createElement("div");u.classList.add(h);const p=h+"-details",m=document.createElement("div");let f;m.classList.add(p),l.photo&&(f=document.createElement("div"),f.classList.add(p+"-photo","media-container-contain"),dt({photo:l.photo,container:f,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),m.append(f));const y=p+"-lines",b=document.createElement("div");b.classList.add(y);const w=document.createElement("div");w.classList.add(y+"-title");const S=document.createElement("div");S.classList.add(y+"-description");const C=document.createElement("div");C.classList.add(y+"-bot-name"),b.append(w,S,C),(0,c.Z)(w,(0,Zt.Z)(l.title)),(0,c.Z)(S,(0,Zt.Z)(l.description));const L=new Nt;C.append(L.element),m.append(b),u.append(m),this.scrollable.append(u);const I=document.createElement("div");let E;I.classList.add(h+"-preloader-container"),(0,be.y)(I,!0),this.scrollable.container.append(I),null!==(e=this.receiptMsgId)&&void 0!==e||(this.receiptMsgId=l.receipt_msg_id),null!==(t=this.receiptPeerId)&&void 0!==t||(this.receiptPeerId=this.receiptMsgId&&o.peerId),E=d?yield this.managers.appPaymentsManager.getPaymentReceipt(this.receiptPeerId,this.receiptMsgId):yield this.managers.appPaymentsManager.getPaymentForm(o.peerId,o.mid);let P=E.saved_info||E.info;const T=E.saved_credentials;let[k,x,_]=yield Promise.all([!d&&P&&this.managers.appPaymentsManager.validateRequestedInfo(o.peerId,o.mid,P).catch((()=>{})),T&&this.managers.passwordManager.getState(),Bs({peerId:E.provider_id.toPeerId()})]);console.log(E,k),yield L.update({peerId:E.bot_id.toPeerId()}),I.remove(),this.element.classList.remove("is-loading");const A=(e,t)=>yn(e,D,t),{invoice:Z}=E,D=this.currency=Z.currency,F=()=>{const e=document.createElement("div");e.classList.add(R+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},R=h+"-prices",B=document.createElement("div");B.classList.add(R);const N=e=>e.map((e=>{const{amount:t,label:i}=e,s=F();s.left.textContent=i;const n=A(t);return s.right.textContent=n,s.label})),U=N(Z.prices);let O=()=>0,H=0;const z=()=>{const e=A(K+O()+H);V.right.textContent=e,G.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},G=new v.ZP.IntlElement,V=F();V.label.classList.add("is-total"),(0,v.$d)(V.left,"PaymentTransactionTotal");const K=Ie(Z.prices.map((({amount:e})=>+e)),0),W=void 0!==Z.max_tip_amount&&!d||!!E.tip_amount;if(W){const e=h+"-tips",t=fn[D];O=()=>+i().replace(/\D/g,"");const i=()=>l.value,s=()=>{const e=wt(i(),`500 16px ${yt}`);l.style.width=e+"px"},a=e=>{e=Math.min(+e,+Z.max_tip_amount);const t=A(e,!0);l.value=t,document.activeElement===l&&(0,sl.Z)(l),f&&f();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),z()},o=F();(0,v.$d)(o.left,d?"PaymentTip":"PaymentTipOptional");const l=document.createElement("input");l.type="tel",l.classList.add("input-clear",e+"-input"),o.right.append(l),d?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,ta.Z)(e.target,l)||(0,sl.Z)(l)}));const c=l instanceof HTMLInputElement?1:2,u=()=>{g?--g:(g=c,(0,sl.Z)(l))},p=()=>{setTimeout((()=>{g=c,(0,sl.Z)(l),document.addEventListener("selectionchange",u)}),0)},m=()=>{l.addEventListener("focus",p,{once:!0}),document.removeEventListener("selectionchange",u)};let g;l.addEventListener("focusout",m),m(),l.addEventListener("input",(()=>{a(O())}));let f,y=[t.symbol,t.space_between?" ":""];if(t.symbol_left||y.reverse(),o.right[t.symbol_left?"prepend":"append"](y.join("")),U.push(o.label),d)a(E.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=Z.suggested_tip_amounts.map((e=>{const t=(0,M.Z)(i,{noRipple:!0});return t.textContent=A(e),this.tipButtonsMap.set(+e,t),t}));f=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,n.fc)(t,(e=>{const t=(0,r.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{f(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}a(s)})),a(0),t.append(...s),U.push(t)}}else z();U.push(V.label),B.append(...U),u.append(B);const j=(e,t)=>zl(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield Ze(i,Vl(t));let s=e.media;s?(0,g.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i))})),$=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new fi(e);return t.container.classList.add(h+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},q=(e,t)=>{if(e.title.textContent=t,!t){const t=v.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,v.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},Q=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=il(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ee.title.classList.remove("tgico","tgico-card_outline"),j(ee,s||t.toLowerCase()),q(ee,i)},Y=()=>{new Nl(E,J).addEventListener("finish",(({token:e,card:t})=>{X=e,J=t,Q(t)}))};let J,X;const ee=$({titleLangKey:"PaymentCheckoutMethod",clickable:d?void 0:Y,icon:"card_outline"});ee.container.classList.add(h+"-method-row"),T?Q(T):E.credentials_title&&Q({title:E.credentials_title});const te=$({title:_,subtitleLangKey:"PaymentCheckoutProvider"}),ie=new km;let se,ne,ae,oe,re,le,ce,de;ie.classList.add("avatar-32"),te.createMedia("small").append(ie),ie.updateWithOptions({peerId:E.provider_id.toPeerId()});const he=Z.pFlags.shipping_address_requested?e=>{if(!e)return re.subtitle.classList.add("hide"),void(0,g.Z)(re.title,(0,v.ag)("PaymentShippingAddress"));const t=e.shipping_address;q(se,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),re.container.classList.toggle("hide",!k&&!d)}:void 0,ue=e=>{he&&he(e),ne&&q(ne,e.name),ae&&q(ae,e.email),oe&&q(oe,e.phone&&"+"+(0,ds.u)(e.phone).formatted)};if(d||(ce=e=>{new Ol(E,o,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{k=t,P=E.saved_info=e,ue(e)}))}),Z.pFlags.shipping_address_requested){const e=e=>{const i=new yr(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return H=0,z(),i.restore(),void this.onContentUpdate();le=e,q(re,e.title),H=Ie(e.prices.map((({amount:e})=>+e)),0),t=N(e.prices);let s=V.label;W&&(s=s.previousElementSibling,d||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),z(),i.restore(),this.onContentUpdate()};let t;se=$({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!d&&ce.bind(null,void 0)}),re=$({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!d&&(de=()=>{new Hl(E,k,le).addEventListener("finish",(t=>{e(t)}))})}),re.container.classList.add("hide");const i=E.shipping;i&&e(i)}Z.pFlags.name_requested&&(ne=$({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!d&&ce.bind(null,"name")})),Z.pFlags.email_requested&&(ae=$({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!d&&ce.bind(null,"email")})),Z.pFlags.phone_requested&&(oe=$({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!d&&ce.bind(null,"phone")})),P&&ue(P);const pe=[ee,te,se,re,ne,ae,oe].filter(Boolean);let me,ge,ve;this.scrollable.append(...[document.createElement("hr"),...pe.map((e=>e.container))].filter(Boolean)),ve=Kl(d?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=Z.pFlags.name_requested&&!(null==P?void 0:P.name)?"name":Z.pFlags.email_requested&&!(null==P?void 0:P.email)?"email":Z.pFlags.phone_requested&&!(null==P?void 0:P.phone)?"phone":void 0;if(Z.pFlags.shipping_address_requested){if(!k)return void ce();if(!le)return void de()}else if(e)return void ce(e);return J||ge?Promise.resolve().then((()=>zl(this,void 0,void 0,(function*(){const e=ge?{_:"inputPaymentCredentialsSaved",id:T.id,tmp_password:ge.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(X.token?X:{type:X.type,id:X.id})},pFlags:{save:J.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(o.peerId,o.mid,E.form_id,null==k?void 0:k.id,null==le?void 0:le.id,e,O());"payments.paymentResult"===t._?a():(me=new Zl(t.url),me.addEventListener("finish",(()=>{me=void 0,a()})),yield new Promise(((e,t)=>{me.addEventListener("close",(()=>{if(me=void 0,i)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?(Ei({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(x=ge=void 0,(0,n.tH)(ve),e.handled=!0),e}})))):T?void Promise.resolve(null!=x?x:this.managers.passwordManager.getState()).then((e=>{new Ul(T.title,e).addEventListener("finish",(e=>{x=void 0,ge=e,(0,n.tH)(ve);const t=e.valid_until-(0,nl.Z)(!0)-5;setTimeout((()=>{ge===e&&(ge=void 0)}),1e3*t)}))})):void Y()},textEl:G}),this.body.append(this.btnConfirmOnEnter=ve),this.onContentUpdate()}))}}var jl=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const $l=new Set(["messageActionHistoryClear","messageActionChatCreate"]),ql=new Set;pr.Z&&ql.add("messageActionPhoneCall");const Ql=void 0;let Yl=Ql,Jl=0;const Xl=3,ec=new Error("peer changed");function tc(e){return Math.max(...e)}class ic{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.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=(0,Zn.k)(),this.replyFollowHistory=[],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.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;e&&e.random_id&&(delete e.random_id,this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),e.random_id))}}},this.onBubblesMouseMove=e=>jl(this,void 0,void 0,(function*(){const t=(0,r.Z)(e.target,"bubble-content");if(t&&!this.chat.selection.isSelecting){const e=(0,r.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 o=yield this.chat.getMessage(+e.dataset.mid);o=yield this.managers.appMessagesManager.getGroupsFirstMessage(o);const r=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(o),(0,fr.Z)(400)]).then((([e])=>{const t=e[0];t?pi({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:r,group:hm,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,si.Z)(e),r()&&(e.addEventListener("firstFrame",(()=>{r()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,n.fc)(s,(e=>{(0,a.Z)(e),this.managers.appReactionsManager.sendReaction(o,t.reaction),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter}))})):s.remove()}))}}else this.unhoverPrevious()})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>jl(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,r.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,r.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==le.NM?this.chat.appImManager.setInnerPeer({peerId:t}):Mi(v.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,r.Z)(i,"bubble-content")){if(s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){A.Z.createPopup(Xo,new Date(+e),this.onDatePick).show();break}return}if(!mi.Z&&(0,r.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,a.Z)(e),mi.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,r.Z)(i,"grouped-item")||s)}const o=(0,r.Z)(i,"contact");if(o)return void this.chat.appImManager.setInnerPeer({peerId:o.dataset.peerId.toPeerId()});const c=(0,r.Z)(i,"bubble-call");if(c)return void this.chat.appImManager.callUser(this.peerId.toUserId(),c.dataset.type);if((0,r.Z)(i,"is-buy")){(0,a.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new Wl(t)}const d=(0,l.Z)(i,"REACTION-ELEMENT");if(d){if((0,a.Z)(e),d.classList.contains("is-inactive"))return;const t=d.parentElement,i=t.getReactionCount(d),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}if((0,r.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===le.hj){const t=yield this.chat.getMessage(e),i=(0,Bi.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(i,n,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 h=(0,r.Z)(i,"is-via");if(h){const t=h.querySelector(".peer-title");if(i===t||(0,ta.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,a.Z)(e)}}const u=(0,r.Z)(i,"peer-title")||(0,l.Z)(i,"AVATAR-ELEMENT")||(0,Ui.Z)(i,"data-saved-from");if(u&&u!==s){i=u||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);t&&new Wl(t,this.peerId,+s.dataset.mid)}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==le.NM?this.chat.appImManager.setInnerPeer({peerId:t}):Mi(v.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 oo(i.stickerSetInput).show())}const p=(0,r.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")||p&&!p.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,r.Z)(i,"album-item")||(0,r.Z)(i,"document-container"),o=(t||s).querySelector(".preloader-container");if(o)return(0,n.tH)(o),void(0,a.Z)(e);(0,a.Z)(e);const l=+(t||s).dataset.mid,c=yield this.chat.getMessage(l);if(!c)return void this.log.warn("no message by messageId:",l);const d="webpage",h=s.classList.contains(d),u=p?e=>bm.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),m=[],g=h?[l]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>jl(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,Se.Z)(t);return i&&u(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));g.forEach((e=>{let t;p?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(p)i.forEach((e=>{m.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,r.Z)(i,"media-container-aspecter"))return;let n=(0,r.Z)(i,"album-item");const a=n||i.parentElement;s.has(a)||(s.add(a),m.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),m.sort(((e,t)=>e.mid-t.mid));let v=m.findIndex((e=>e.mid===l));return R.ZP&&this.log("open mediaViewer single with ids:",g,v,m),m[v]?void(new bm).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:p?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!h,isScheduled:"scheduled"===this.chat.type}).openMedia(c,m[v].element,0,!0,m.slice(0,v),m.slice(v+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,l.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 qn({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,r.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.replyFollowHistory.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,Bi.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)=>{var i,s;if(this.isHeavyAnimationInProgress){if(this.sliceViewportDebounced&&this.sliceViewportDebounced.clearTimeout(),this.scrolledDown&&!e)return}else this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),this.sliceViewportDebounced&&this.sliceViewportDebounced(),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const n=null!==(i=null==t?void 0:t.distanceToEnd)&&void 0!==i?i:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&n>0||t)&&(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!==(s=null==t?void 0:t.duration)&&void 0!==s?s:0))),n<300&&(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.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 I.Z,this.constructBubbles(),this.bubbleGroups=new Jo(this.chat),this.preloader=new Ue({cancelable:!1}),this.lazyLoadQueue=new ye,this.lazyLoadQueue.queueId=++Jl,this.listenerSetter.add(s.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>jl(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:n}=i,a=this.bubbles[n];if(!a)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[n]!==a)return;const o=this.bubbleGroups.getItemByBubble(a);if(!o)return;if(o.mid===n)return;if(t){const e=o.group,r=this.bubbleGroups.createItem(a,i),l=this.bubbleGroups.itemsArr.slice();(0,k.Z)(l,o);const c=this.bubbleGroups.findGroupSiblingByItem(r,l);if(e===(null==c?void 0:c.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&r.dateTimestamp===o.dateTimestamp||this.peerId===s.Z.myId&&t&&r.dateTimestamp===o.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(a,n)}this.bubbleGroups.removeAndUnmountBubble(a);const{groups:r}=this.groupBubbles([{bubble:a,message:i}]);this.bubbleGroups.mountUnmountGroups(r),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(s.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(s.Z)("message_sent",(e=>jl(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:n,mid:a,message:o}=e;if(this.chat.messagesStorageKey!==t)return;const l=this.bubbles,c=l[i];if(c){const e=l[i];l[a]=e,e.dataset.mid=""+a,delete l[i],(0,Be.T2)((()=>{const t=+e.dataset.mid;l[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===s.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(a)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=n.date-10&&this.deleteMessagesByIds([a]),!c)return;let d,h;const u=o.grouped_id;if(u){d=yield this.managers.appMessagesManager.getMessagesByAlbum(u);const e=d.map((({mid:e})=>e));if(!e.length||tc(e)!==a||l[a]!==c)return;if(l[a]!==c)return;h=Array.from(c.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else d=[o],h=[i];const p=Array.from(c.querySelectorAll("reactions-element"));p.length&&p.forEach((e=>{e.changeMessage(o)})),d.forEach(((e,t)=>{var i,s,a,o,l;if(!e)return;const d=h[t],p=e.mid,m=c.querySelector(`.document-container[data-mid="${p}"]`)||c;if("message"!==e._)return;if(e.replies){const t=c.querySelector("replies-element");t&&(t.message=e,t.init())}const g=null!==(i=e.media)&&void 0!==i?i:{},v=g.document,f=g.poll,y=g.webpage;if(v){const t=m.querySelector(`.document-container[data-mid="${d}"] .document`);if(t){const i=(0,r.Z)(t,"document-container");!(null===(o=null===(a=null===(s=n.media)||void 0===s?void 0:s.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=v.thumbs)||void 0===l?void 0:l.length)&&(0,He.e9)().then((()=>jl(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield Xt({message:e});t.replaceWith(s),i&&s.querySelector(".document-size").append(i)})))),i&&(i.dataset.mid=""+p)}const i=m.querySelector(`audio-element[data-mid="${d}"], .document[data-doc-id="${d}"], .media-round[data-mid="${d}"]`);i&&(i instanceof Vt||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):i.dataset.docId=""+v.id)}else if(f){const t=m.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+f.id),t.setAttribute("message-id",""+p))}else y&&!m.querySelector(".web")&&(0,He.e9)().then((()=>{this.safeRenderMessage(e,!0,m),this.scrollToBubbleIfLast(m)}));if(u){const e=m.querySelector(`.grouped-item[data-mid="${d}"]`)||m;e&&(e.dataset.mid=""+p)}}))})))),this.listenerSetter.add(s.Z)("message_edit",(({storageKey:e,message:t})=>jl(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,He.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(s.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=tc(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=tc(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),"scheduled"!==this.chat.type&&this.listenerSetter.add(s.Z)("messages_reactions",(e=>jl(this,void 0,void 0,(function*(){let t;const i=e.map((({message:e,changedResults:t})=>jl(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=sr.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(s.Z)("messages_downloaded",(({peerId:e,mids:t})=>jl(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,He.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,mo.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})=>jl(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);lr.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,n.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,l.Z)(e.target,"CODE");return t?((0,a.Z)(e),bi(t.textContent),void Ei({langPackKey:"TextCopied"})):void 0})),this.stickyIntersector=new er(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})),Je.IS_SAFARI||(this.sliceViewportDebounced=(0,Pi.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,He.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,i&&i()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),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 I.Z),R.ZP&&this.listenerSetter.add(e)("dblclick",(e=>jl(this,void 0,void 0,(function*(){const t=(0,r.Z)(e.target,"grouped-item")||(0,r.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),"pinned"!==this.chat.type&&"scheduled"!==this.chat.type)if(Je.IS_MOBILE){if(mi.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o=!1;Kn({element:e,verifyTouchTarget:e=>jl(this,void 0,void 0,(function*(){return!(this.chat.selection.isSelecting||!(yield this.chat.canSend())||(n=(0,r.Z)(e.target,"bubble"),n&&(Re(n,t,!0,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)),!n))})),onSwipe:(e,t)=>{o=e>=s,o&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(i,e));n.style.transform=`translateX(${r}px)`,zn()},onReset:()=>{const e=n;Re(e,t,!1,250,(()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())})),(0,Be.T2)((()=>{if(e.style.transform="",o){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),o=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>jl(this,void 0,void 0,(function*(){if(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(s.Z)("history_append",(({storageKey:e,message:t})=>jl(this,void 0,void 0,(function*(){if(e===this.chat.messagesStorageKey&&(this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId(),s.Z.settings.animationsEnabled)){const e=this.chat.gradientRenderer;e&&e.toNextPosition()}})))),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(s.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,He.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(s.Z)("dialogs_multiupdate",(e=>{e[this.peerId]&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(s.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(s.Z)("chat_update",(e=>jl(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e()))})))),this.listenerSetter.add(s.Z)("settings_updated",(({key:e})=>jl(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,ra.Z)(this.bubbles,"desc").map((e=>jl(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.forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(s.Z)("messages_views",(e=>{(0,Be.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=zo(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}t&&t.restore()}))})),this.observer=new br({root:this.scrollable.container}),this.listenerSetter.add(this.chat.appImManager)("chat_changing",(({to:e})=>{const t=e!==this.chat,i=()=>{this.observer.toggleObservingNew(t)};t?i():setTimeout((()=>{i()}),400)})),this.sendViewCountersDebounced=(0,Pi.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0)}get peerId(){return this.chat.peerId}createScrollSaver(e=!0){return new yr(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,l=this.scrollable.isScrolledDown;r===t||s&&l||(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},l=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})},c=this.resizeObserver=new ResizeObserver((e=>{if(s)return void l(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let c=r+a;const d=c%1;if(c-=d,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void l(!1);if(n+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.setScrollTopSilently(e)}l(!1),a=d,t=o}));c.observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(xs)("toggle",this.unhoverPrevious),this.listenerSetter.add(Lr.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){Re(e,"is-visible",t,200,t?void 0:()=>{e.remove()},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=Cr.Z.getFocusPromise().then((()=>jl(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)wr(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),R.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())}))}))))}constructPinnedHelpers(){this.listenerSetter.add(s.Z)("peer_pinned_messages",(e=>{const{peerId:t,mids:i,pinned:s}=e;t===this.peerId&&i&&(s||this.deleteMessagesByIds(i))}))}constructScheduledHelpers(){const e=()=>jl(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(s.Z)("scheduled_new",(t=>{t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(s.Z)("scheduled_delete",(({peerId:t,mids:i})=>{t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}onGoDownClick(){return jl(this,void 0,void 0,(function*(){if(!this.replyFollowHistory.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.replyFollowHistory.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=zi.height/2>e.top}else s&&(a=!1);a&&this.replyFollowHistory.splice(this.replyFollowHistory.indexOf(e),1)})),this.replyFollowHistory.sort(((e,t)=>t-e));const s=this.replyFollowHistory.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=dr(this.scrollable.container,e,"center");return t&&(t=(0,r.Z)(t,"bubble")),t}getGroupedBubble(e){return jl(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 jl(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,ra.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&&(e?(R.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)):(R.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 m.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),mi.Z}updateUnreadByDialog(){return jl(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===s.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"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}deleteMessagesByIds(e,t=!0,i){let s=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(s=!0,delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(t),this.observer&&(this.observer.unobserve(t,this.unreadedObserverCallback),this.unreaded.delete(t),this.observer.unobserve(t,this.viewsObserverCallback),this.viewsMids.delete(e)),this.emptyPlaceholderBubble===t&&(this.emptyPlaceholderBubble=void 0))})),s&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),p.Z.checkAnimations(!1,hm),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}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(ft.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return jl(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>jl(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){const t=null==e?void 0:e.reply_to;if(!t||(t.reply_to_top_id||t.reply_to_msg_id)!==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,r.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.group.firstItem===e&&(0,Dn.Z)(e.group.container)===(this.stickyIntersector?Xl:1)&&(a=e.group.container.parentElement)}const o=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),l=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:o?({rect:e})=>{let t=zi.height;return t-=this.container.offsetTop,t-=d.Z.isMobile||zi.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{this.onScroll(!0,e)}});return i===Ni.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),l}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return jl(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 jl(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,v.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===ur)i=(0,v.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new v.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,v.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){const{date:t,dateTimestamp:i}=this.getDateForDateContainer(e);if(!this.dateMessages[i]){const s=this.createDateBubble(e,t),n=this.createDateBubble(e,t);n.classList.add("is-fake");const a=document.createElement("section");a.className="bubbles-date-group",a.append(s,n),this.dateMessages[i]={div:s,container:a,firstTimestamp:t.getTime()};const o=(0,ra.Z)(this.dateMessages,"asc");let r,l=0,c=o.length;for(;lthis.setPeerTempId===a,c=Ir(l,ec);e||(yield c(this.chat.onChangePeer(c)));const d=this.chat.type;("scheduled"===d||this.chat.isRestricted)&&(i=0);const h=yield c(this.chat.getHistoryStorage());let u="pinned"===d?yield c(this.managers.appMessagesManager.getPinnedMessagesMaxId(t)):null!==(n=h.maxId)&&void 0!==n?n:0;const m=void 0!==i;let v,f,y,b=0;if(!m)if(e||(f=this.chat.appImManager.getChatSavedPosition(this.chat)),f);else if(u){b=yield c(this.managers.appMessagesManager.getReadMaxIdIfUnread(t,this.chat.threadId));const s=yield c(this.managers.appMessagesManager.getDialogOnly(t));if(!b||e||s&&1===s.unread_count)i=u;else{const e=h.history.findSliceOffset(b);e&&e.slice.isEnd(cr.D.Bottom)&&(y=e.slice[e.offset-25]||e.slice[0]||b),v=!m,i=b}}const w=i!==u;if(void 0===s&&(yield c(this.chat.isStartButtonNeeded()))&&(s=le.gZ),e){const e=yield c(this.getMountedBubble(i));if(e)return m?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",i,!1)):u&&!w&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",i,!0)),void 0!==s&&this.chat.input.setStartParam(s),null}else this.peerId&&(this.lazyLoadQueue.queueId=++Jl,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.replyFollowHistory.length=0,this.passEntities={messageEntityBotCommand:(yield c(this.managers.appPeersManager.isAnyGroup(t)))||(yield c(this.managers.appUsersManager.isBot(t)))};R.ZP&&r("setPeer peerId:",t,h,i,u);const S=null!=y?y:w||"scheduled"===d||this.chat.isRestricted?0:u;let C=0;if(e){let e=this.getBubbleByPoint("bottom");e&&(C=+e.dataset.mid),C<=0&&(C=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const L=this.chatInner,I=this.emptyPlaceholderBubble;this.cleanup();const M=this.chatInner=document.createElement("div");e?(M.className=L.className,M.classList.remove("disable-hover","is-scrolling")):M.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const E=e||u&&w||m,P=C>0&&(!i||Cthis.performHistoryResult({history:f.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield c(this.getHistory1(i,!0,w,S)),this.setPeerCached=x.cached,r.warn("got history");const{promise:_,cached:A}=x;A||e||(yield c(this.chat.finishPeerChange(m,w,i,s)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),p.Z.lockGroup(hm);const Z=c(_).then((()=>jl(this,void 0,void 0,(function*(){r.warn("promise fulfilled");let n=E?yield c(i?this.getMountedBubble(i):{bubble:this.getLastBubble()}):void 0;A&&!e&&(r.warn("finishing peer change"),yield c(this.chat.finishPeerChange(m,w,i,s)),r.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,g.Z)(a.container,M),I&&this.cleanupPlaceholders(I),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!m&&"chat"===this.chat.type&&this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(0),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),r.warn("mounted chat",this.chatInner===M,this.chatInner.parentElement,performance.now()-o),p.Z.unlockGroup(hm),p.Z.checkAnimations(!1,hm),this.lazyLoadQueue.unlock(),f)a.setScrollTopSilently(f.top);else if(E){let t;if(T)a.setScrollTopSilently(99999);else if(k){const e=this.setTopPadding();e.isPaddingNeeded&&(t=e.unsetPadding),a.setScrollTopSilently(0)}let s,o=v&&this.firstUnreadBubble||(null==n?void 0:n.bubble);if((null==o?void 0:o.parentElement)||(o=this.findNextMountedBubbleByMsgId(i,!1)||this.findNextMountedBubbleByMsgId(i,!0)),o){const t=this.getLastBubble(),i=v?"start":w||m||t!==o?"center":"end";s="end"===i&&t===o&&e?this.scrollToEnd():this.scrollToBubble(o,i,e?void 0:Ni.f.Static),!v&&m&&this.highlightBubble(o)}t&&(s||Promise.resolve()).then((()=>{t()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const l=Promise.all([Z,(0,He.e9)()]);if(l.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",i,!w),Promise.all([this.setFetchReactionsInterval(l),this.setFetchHistoryInterval({afterSetPromise:l,lastMsgId:i,samePeer:e,savedPosition:f,topMessage:u})]).then((()=>{r("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&u&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===d){const e=yield c(this.managers.appMessagesManager.getDialogOnly(t));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(t,!0)}})))).catch((e=>{throw r.error("getHistory promise error:",e),l()||this.preloader.detach(),e}));return{cached:A,promise:Z}}))}setFetchReactionsInterval(e){return jl(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(yield this.managers.appPeersManager.isChannel(this.peerId)){const i=()=>jl(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,He.e9)(),(0,fr.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return jl(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,a=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!a)return;if(yield i,!e())return;if(this.setLoaded("bottom",!1),this.scrollable.checkForTriggers(),!a)return;const o=()=>{this.fetchNewPromise=new Promise((i=>jl(this,void 0,void 0,(function*(){e()&&(yield this.managers.appMessagesManager.isFetchIntervalNeeded(t))?this.managers.appMessagesManager.getNewHistory(t,this.chat.threadId).then((t=>{if(!e()||!t)return void i();const{isBottomEnd:s}=t;this.scrollable.loadedAll.bottom&&this.scrollable.loadedAll.bottom!==s&&(this.setLoaded("bottom",s),this.onScroll()),setTimeout(o,3e4),i()})):i()})))).finally((()=>{this.fetchNewPromise=void 0}))};n?setTimeout(o,3e4):o()}))}onScrolledAllDown(){return jl(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 jl(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.managers.appPeersManager.isChannel(this.peerId),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.messagesQueue.push(e),this.setMessagesQueuePromise()}setMessagesQueuePromise(){if(!this.messagesQueue.length)return Promise.resolve();if(this.messagesQueuePromise)return this.messagesQueuePromise;const e=this.getMiddleware(),t=this.log.bindPrefix("queue"),i=Ir(e,ec),s=()=>jl(this,void 0,void 0,(function*(){var e;t("start");const n=this.messagesQueue.slice();this.messagesQueue.length=0;const a=n.map((e=>{const i=performance.now();return e.then((e=>{t("render message time",performance.now()-i,e)})),e}));let o=yield i(Promise.all(a));const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));o=r(o),t("messages rendered");const l=null===(e=o[0])||void 0===e?void 0:e.reverse,{groups:c,avatarPromises:d}=this.groupBubbles(o.filter((e=>e.updatePosition))),h=o.reduce(((e,i)=>{const s=performance.now(),n=i.promises.slice(),a=n.map((e=>jl(this,void 0,void 0,(function*(){return yield e,performance.now()-s}))));return Promise.all(a).then((e=>{t.groupCollapsed("media message time",performance.now()-s,i,e),e.forEach(((e,i)=>{t("media message time",e,i,n[i])})),t.groupEnd()})),e.push(...i.promises),e}),[]);h.push(...d),t("media promises to call",h,o,this.isHeavyAnimationInProgress),yield i(Promise.all([...h,this.setUnreadDelimiter()])),yield i((0,Be.AD)()),t("media promises end"),o=r(o);const{restoreScroll:u,scrollSaver:p}=this.prepareToSaveScroll(l);this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(p&&p.replaceSaved(t,e),!o.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i.mounted=!1,c.includes(i.group)||c.push(i.group),this.bubblesToReplace.delete(e)}if(this.chat.selection.isSelecting&&o.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),o.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(c),this.updatePlaceholderPosition&&this.updatePlaceholderPosition(),u&&u(),this.messagesQueue.length)return t("have new messages to render"),s();t("end")}));t("setting pause");const n=this.messagesQueuePromise=i((0,fr.Z)(0)).then(s).finally((()=>{this.messagesQueuePromise===n&&(this.messagesQueuePromise=null)}));return n}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.middleware.get(e)}safeRenderMessage(e,t,i,s=!0,n){return jl(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware();let o;try{this.renderingMessages.add(e.mid);const r=document.createElement("div");r.dataset.mid=""+e.mid,r.dataset.peerId=""+e.peerId,r.dataset.timestamp=""+e.date,i&&(this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(r,i),this.bubbleGroups.changeBubbleByBubble(i,r)),i=this.bubbles[e.mid]=r;let l=this.renderMessage(e,t,i);n&&(l=n(l,i));const c=l.then((e=>e&&a()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),o=yield c,!a())return;o||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return a()?(this.renderingMessages.delete(e.mid),o):void 0}))}renderMessage(e,t=!1,i){var o,l;return jl(this,void 0,void 0,(function*(){const h="message"===e._,u=h&&e.grouped_id;let p,m;const g=u?yield this.managers.appMessagesManager.getMessagesByAlbum(u):void 0,f="pinned"!==this.chat.type;if(u&&f){p=g.map((e=>e.mid));const t=tc(p);if(e.mid!==t)return}h&&(m=u?g[0]:e);const y=this.chat.isOurMessage(e),b=document.createElement("div");let w,S;b.classList.add("message"),S=document.createElement("div"),S.classList.add("bubble-content-wrapper"),w=document.createElement("div"),w.classList.add("bubble-content"),i.classList.add("bubble"),S.append(w),i.append(S),y||e.pFlags.out||!this.observer||(e.pFlags.unread||wr(e))&&(this.observer.observe(i,this.unreadedObserverCallback),this.unreaded.set(i,e.mid));const C=[],L={bubble:i,promises:C,message:e,reverse:t};if(!("messageService"!==e._||e.action&&ql.has(e.action._))){const t=e.action;if(t){const e=t._;if($l.has(e)||v.Hz.hasOwnProperty(e)&&!v.Hz[e])return}i.className="bubble service",w.innerHTML="";const s=document.createElement("div");if(s.classList.add("service-msg"),t){let i;if("messageActionChannelMigrateFrom"===t._){const e=new Nt;i=e.update({peerId:t.chat_id.toPeerId(!0)}),s.append((0,v.ag)("ChatMigration.From",[e.element]))}else if("messageActionChatMigrateTo"===t._){const e=new Nt;i=e.update({peerId:t.channel_id.toPeerId(!0)}),s.append((0,v.ag)("ChatMigration.To",[e.element]))}else s.append(yield Ln(e))}return w.append(s),e.pFlags.is_single&&i.classList.add("is-group-last"),L}let I,M,E=h&&e.media;if(h)if((null==E?void 0:E.document)&&!["video","gif"].includes(E.document.type));else if(u&&f){const e=(0,Qr.Z)(g);I=e.message,M=e.totalEntities}else"sticker"!==(null===(o=null==E?void 0:E.document)||void 0===o?void 0:o.type)&&(I=e.message,M=e.totalEntities);else"messageActionPhoneCall"===e.action._&&(E={_:"messageMediaCall",action:e.action});let P=(0,ei.Z)(I,{entities:M,passEntities:this.passEntities}),T=!0,k=!1,x=!0;if(M&&!E){let e=M.filter((e=>"messageEntityEmoji"===e._)),t=I.length;if(e.reduce(((e,t)=>e+t.length),0)===t&&e.length<=3&&M.length===e.length){if(s.Z.settings.emoji.big){let t=yield this.managers.appStickersManager.getAnimatedEmojiSticker(I);if(1===e.length&&!E&&t)E={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),(0,c.Z)(t,P),i.classList.add("emoji-"+e.length+"x"),w.append(t)}i.classList.add("is-message-empty","emoji-big"),k=!0,T=!1,x=!1}i.classList.add("can-have-big-emoji")}}x&&(0,c.Z)(b,P);const _=lr.setTime({chatType:this.chat.type,message:e,reactionsMessage:m});if(b.append(_),w.prepend(b),h&&e.views){if(i.classList.add("channel-post"),!(null===(l=e.fwd_from)||void 0===l?void 0:l.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),w.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const A=h&&e.reply_markup;if(A&&"replyInlineMarkup"===A._&&A.rows&&A.rows.length){const t=A.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach((t=>{const i=t.buttons;if(!i||!i.length)return;const o=document.createElement("div");o.classList.add("reply-markup-row"),i.forEach((t=>{let i,s=(0,ei.Z)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":i=rn((0,ei.Z)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]})).firstElementChild,i.classList.add("is-link");break;case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,n.fc)(i,(i=>{(0,a.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 qn({[this.peerId]:[]},(t=>{e(t)}),!0);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":i=document.createElement("button"),i.classList.add("is-buy"),"messageMediaInvoice"===(null==E?void 0:E._)&&E.receipt_msg_id&&(s=(0,v.ag)("Message.ReplyActionButtonShowReceipt"));break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp","tgico"),"string"==typeof s?i.insertAdjacentHTML("beforeend",s):i.append(s),(0,we.Z)(i),o.append(i)})),s.append(o)})),(0,n.fc)(s,(i=>{let s=i.target;if(s.classList.contains("reply-markup-button")||(s=(0,r.Z)(s,"reply-markup-button")),!s||s.classList.contains("is-link")||s.classList.contains("is-switch-inline")||s.classList.contains("is-buy"))return;(0,a.Z)(i);const n=(0,Dn.Z)(s),o=t[(0,Dn.Z)(s.parentElement)];if(!o.buttons||!o.buttons[n])return void this.log.warn("no such button",o,n,e);const l=o.buttons[n];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,l).then((e=>{"string"==typeof e.message&&e.message.length&&Mi((0,ei.Z)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),T=!1,i.classList.add("with-reply-markup"),S.append(s)}const Z=e.pFlags.is_outgoing;if(y){(e.pFlags.unread||Z)&&this.unreadOut.add(e.mid);let t="";t=Z?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}Z&&i.classList.add("is-outgoing");const D=h&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),F=!!D&&e.mid>0;F&&i.classList.add("with-replies");const R=h&&e.fwd_from,B=h&&e.fwdFromId,N=this.chat.isOutMessage(e);let U=w;const O=!(e.viaBotId||e.fromId!==s.Z.myId&&e.pFlags.out);if(E){let t=document.createElement("div");t.classList.add("attachment"),I||i.classList.add("is-message-empty");let n=!1;switch(E._){case"messageMediaPhoto":{const s=E.photo;if(I||(T=!1),O&&i.classList.add("hide-name"),i.classList.add("photo"),f&&u&&1!==p.length){i.classList.add("is-album","is-grouped"),$t({messages:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:y,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:C,autoDownload:this.chat.autoDownload});break}const n=!Je.IS_ANDROID&&T&&!F&&!1;n&&i.classList.add("with-media-tail"),dt({photo:s,message:e,container:t,withTail:n,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:C,autoDownloadSize:this.chat.autoDownload.photo});break}case"messageMediaWebPage":{n=!0;let t=E.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let s=document.createElement("div");s.classList.add("web");let a,o,r=document.createElement("div");r.classList.add("quote");const l=t.photo;(l||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));let h=document.createElement("div");h.classList.add("quote-text");const u=t.document;if(u)if("gif"===u.type||"video"===u.type||"round"===u.type){const t="round"===u.type?d.Z.active.round:d.Z.active.webpage;"round"===u.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),jt({doc:u,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:N,group:hm,loadPromises:C,autoDownload:this.chat.autoDownload})}else{const t=yield Xt({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:C,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}}});o.append(t),o.classList.add("preview-with-document"),h.classList.add("has-document")}let p;if(a&&h.append(a),t.site_name){const e=rn((0,ei.Z)(t.url)).firstElementChild;e.classList.add("webpage-name");const i=document.createElement("strong");(0,c.Z)(i,(0,Zt.Z)(t.site_name)),e.textContent="",e.append(i),h.append(e),p=e}const m=ca(t);if(m.textContent){let e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,c.Z)(t,m),e.append(t),h.append(e),p=e}const g=la(t);if(g.textContent){let e=document.createElement("div");e.classList.add("text"),(0,c.Z)(e,g),h.append(e),p=e}if(r.append(h),l&&!u){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&p?(i.classList.add("is-square-photo"),s=!0,lt(l,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),dt({photo:l,message:e,container:o,boxWidth:s?0:d.Z.active.webpage.width,boxHeight:s?0:d.Z.active.webpage.height,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:C,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}s.append(r),b.insertBefore(s,_);break}case"messageMediaDocument":{const s=E.document;if(s.sticker){i.classList.add("sticker"),T=!1,k=!0,s.animated&&i.classList.add("sticker-animated");const e=d.Z.active,n=i.classList.contains("emoji-big")?e.emojiSticker:s.animated?e.animatedSticker:e.staticSticker;lt(s,t,n.width,n.height),w.style.minWidth=t.style.width,w.style.minHeight=t.style.height,pi({doc:s,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:hm,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?I:void 0,withThumb:!0,loadPromises:C})}else if("video"===s.type||"gif"===s.type||"round"===s.type){const n="round"===s.type;if(n&&(k=!0),!n&&I||(T=!1),O&&i.classList.add("hide-name"),i.classList.add(n?"round":"video"),f&&u&&1!==p.length)i.classList.add("is-album","is-grouped"),$t({messages:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:y,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:C,autoDownload:this.chat.autoDownload});else{const a=!Je.IS_ANDROID&&!Je.IS_APPLE&&!n&&T&&!F&&!1;a&&i.classList.add("with-media-tail"),jt({doc:s,container:t,message:e,boxWidth:d.Z.active.regular.width,boxHeight:d.Z.active.regular.height,withTail:a,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:hm,loadPromises:C,autoDownload:this.chat.autoDownload,searchContext:n?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l,useSearch:d,sizeType:h,managers:u}){return ti(this,void 0,void 0,(function*(){let d;const p=e?yield n.getMidsByMid(t.mid):[t.mid],m=p.map(((e,t)=>ti(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield Xt({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l,sizeType:h,managers:u}),m=document.createElement("div");m.classList.add("document-container"),m.dataset.mid=""+e,m.dataset.peerId=""+i.peerId;const g=document.createElement("div");if(g.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message");const t=(0,ei.Z)(i.message,{entities:i.totalEntities});(0,c.Z)(e,t),g.append(e)}if(p.length>1){const e=document.createElement("div");e.classList.add("document-selection"),m.append(e),m.classList.add("grouped-item"),0===t&&(d=g)}return g.append(s),m.append(g),m})))),g=yield Promise.all(m);return s.append(...g),p.length>1&&i.classList.add("is-multiple-documents","is-grouped"),d}))}({albumMustBeRenderedFull:f,message:e,bubble:i,messageDiv:b,chat:this.chat,loadPromises:C,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===s.type||"audio"===s.type?{peerId:this.peerId,inputFilter:{_:"voice"===s.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName"});t&&(U=t);const a=b.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(_),i.classList.remove("is-message-empty"),b.classList.add((["photo","pdf"].includes(s.type)?"document":s.type||"document")+"-message"),n=!0}break}case"messageMediaCall":{const e=E.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const s=e.pFlags.video?"video":"voice";t.dataset.type=s;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,v.$d)(a,N?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(vn(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,v.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(a,o),n=!0,i.classList.remove("is-message-empty"),b.classList.add("call-message"),b.append(t);break}case"messageMediaContact":{const e=E,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,n=!0;const s=document.createElement("div");s.className="contact-details";const a=document.createElement("div");a.className="contact-name",a.append((0,Zt.Z)([e.first_name,e.last_name].filter(Boolean).join(" ")));const o=document.createElement("div");o.className="contact-number",o.textContent=e.phone_number?"+"+(0,ds.u)(e.phone_number).formatted:"Unknown phone number",t.append(s),s.append(a,o);const r=new km;r.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),r.classList.add("contact-avatar","avatar-54"),t.prepend(r),i.classList.remove("is-message-empty"),b.classList.add("contact-message"),b.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=s.Z.managers){const i=new nn;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);b.prepend(t),b.classList.add("poll-message");break}case"messageMediaInvoice":{const e=E.pFlags.test,s=E.photo,n=document.createElement(s?"span":"div"),a=document.createDocumentFragment(),o=(0,v.ag)(E.receipt_msg_id?"PaymentReceipt":e?"PaymentTestInvoice":"PaymentInvoice");o.classList.add("text-uppercase");const r=" ‎",l=document.createElement("span");if(l.classList.add("text-bold"),l.textContent=yn(E.total_amount,E.currency)+r,a.append(l,o),e&&E.receipt_msg_id){const e=document.createElement("span");e.classList.add("text-uppercase","pre-wrap"),e.append(r+"(Test)"),a.append(e)}if((0,c.Z)(n,a),s){const e=d.Z.active.invoice;dt({photo:s,container:t,withTail:!1,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:C,boxWidth:e.width,boxHeight:e.height}),i.classList.add("photo"),n.classList.add("video-time"),t.append(n)}else t=void 0;const h=document.createElement("div");h.classList.add("bubble-primary-color"),(0,c.Z)(h,(0,Zt.Z)(E.title));const u=(0,Zt.Z)(E.description);b.prepend(...[h,!s&&n,u].filter(Boolean)),i.classList.remove("is-message-empty"),i.classList.add("is-invoice");break}default:t=void 0,i.classList.remove("is-message-empty"),b.append((0,v.ag)(v.nK),_),this.log.warn("unrecognized media type:",E._,e)}!n&&t&&w.append(t)}k&&i.classList.add("just-media");let H="";const z=e.fromId!==s.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(z||R||e.reply_to_mid){let t,n;const a=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===B;let o,r=R&&!R.from_id;if(e.viaBotId&&(n=document.createElement("span"),n.innerText="@"+(yield this.managers.appUsersManager.getUser(e.viaBotId)).username,n.classList.add("peer-title"),i.classList.add("must-have-name")),r?(t=document.createElement("span"),(0,c.Z)(t,(0,Zt.Z)(R.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new Nt({peerId:B||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&h&&(yield lr.setReply({chat:this.chat,bubble:i,bubbleContainer:w,message:e})),B||R)if(this.peerId===s.Z.myId||a||i.classList.add("forwarded"),e.savedFrom&&(H=e.savedFrom,t.dataset.savedFrom=H),o=document.createElement("div"),t.dataset.peerId=""+B,this.peerId!==s.Z.myId&&this.peerId!==le.hj&&!a||k){const e=[t];k&&e.unshift(document.createElement("br")),o.append((0,v.ag)("ForwardedFrom",[e]))}else o.style.color=Ls(B,!1),o.append(t);else if(!e.viaBotId)if(!k&&z){o=document.createElement("div"),o.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&o.append(vs(s.scam)),y||(o.style.color=Ls(e.fromId,!1)),o.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append((0,v.ag)("ViaBot")," ",n),e.classList.add("is-via"),o.append(e)}o&&(o.classList.add("name"),U.append(o))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(H=`${this.chat.peerId}_${e.mid}`),D&&D.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),H&&("pinned"===this.chat.type||R.saved_from_msg_id)&&this.peerId!==le.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),w.append(e),i.dataset.savedFrom=H,i.classList.add("with-beside-button")}return i.classList.add(N?"is-out":"is-in"),F&&lr.renderReplies({bubble:i,bubbleContainer:w,message:D,messageDiv:b,loadPromises:C,lazyLoadQueue:this.lazyLoadQueue})&&(T=!0),h&&this.appendReactionsElementToBubble(i,e,m),T&&(i.classList.add("can-have-tail"),w.append(sc())),L}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser())return;if(!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new nr;if(n.init(i,"block"),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=lr.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){return jl(this,void 0,void 0,(function*(){let i=e.history;i=i.slice(),this.needReflowScroll&&(hr(this.scrollable.container),this.needReflowScroll=!1);const s=yield Promise.all(i.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),n=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),s=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!s.isEnd(cr.D.Bottom)||s.length&&!i.includes(s[0])||(t.bottom=!0),!n.isEnd(cr.D.Top)||n.length&&!i.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i}=this.setPeerOptions;this.setPeerOptions=void 0,e&&!this.bubbles[i]&&e!==i||(t.bottom=!0)}t.top&&n.push(this.setLoaded("top",!0)),t.bottom&&n.push(this.setLoaded("bottom",!0))}yield Promise.all(n);const a=s.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(a),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional())}))}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 jl(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,ra.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 l=r.slice(r.findIndex((e=>o>e))),c=i?[]:[o],d=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();R.ZP&&a("targeting mid:",o,n,e,l.map((e=>(0,oi.Z)(e))),d.map((e=>(0,oi.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,m=(e,t=0)=>{const i=(0,Oe.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 l=r.lastElementChild,c=[l],d=this.bubbleGroups.getItemByBubble(r);if(d&&d.group.avatar&&d.group.lastItem===d&&c.push(d.group.avatar),c.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===l&&(i.resolve(),l.removeEventListener("transitionend",e))};l.addEventListener("transitionend",e)}h.push(...c)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},g=m(l,p),v=m(c),f=m(d,p),y=[g.animationPromise,v.animationPromise,f.animationPromise],b=[g.lastMsDelay,v.lastMsDelay,f.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,Be.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(l.length||c.length||d.length)&&(w=Promise.all(y),(0,He.YW)(w,Math.max(...b)+200).then((()=>{(0,Be.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 jl(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let o,r;if(t.classList.add(i,i+"-"+e),"group"===e?o=(0,v.ag)("GroupEmptyTitle1"):"saved"===e?o=(0,v.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?o=(0,v.ag)("NoMessages"):"noScheduledMessages"===e?o=(0,v.ag)("NoScheduledMessages"):"restricted"===e&&(o=document.createElement("span"),o.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),o.classList.add("center",i+"-title"),s.push(o),"group"===e)s.push((0,v.ag)("GroupEmptyTitle2")),r=[(0,v.ag)("GroupDescription1"),(0,v.ag)("GroupDescription2"),(0,v.ag)("GroupDescription3"),(0,v.ag)("GroupDescription4")];else if("saved"===e)r=[(0,v.ag)("ChatYourSelfDescription1"),(0,v.ag)("ChatYourSelfDescription2"),(0,v.ag)("ChatYourSelfDescription3"),(0,v.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,v.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const o=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>jl(this,void 0,void 0,(function*(){if(!o())return;const i=[];return yield pi({doc:e,div:t,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:hm,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,n.fc)(t,(e=>{(0,a.Z)(e),jr.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}r&&(s.push(...r.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?r.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&r.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){return jl(this,void 0,void 0,(function*(){const i=!!e.pFlags.sponsored,a=Ir(this.getMiddleware());return this.safeRenderMessage(e,!i,void 0,i,(o=>jl(this,void 0,void 0,(function*(){const{bubble:r}=yield a(o);if(!r)return o;r.classList.add("is-group-last","is-group-first");const l=()=>{this.updatePlaceholderPosition===l&&(this.updatePlaceholderPosition=void 0),u[p](r)};i||(r.classList.add("bubble-first"),r.classList.remove("can-have-tail","is-in"));const c=[],d=yield a(this.managers.appPeersManager.isBot(this.peerId));let h,u=this.container,p="append";if(this.chat.isRestricted)h=this.renderEmptyPlaceholder("restricted",r,e,c);else{if(i){let t,i,s,a;r.classList.add("avoid-selection");const l=this.sponsoredMessage=e.sponsoredMessage,c=(0,Bi.Z)(l.from_id);l.channel_post?(t="OpenChannelPost",i=(0,Sr.Z)(l.channel_post)):l.start_param||d?(t="Chat.Message.ViewBot",s=l.start_param):t=(yield this.managers.appPeersManager.isAnyGroup(c))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",a=l.chat_invite?()=>{new vr(l.chat_invite_hash,l.chat_invite)}:l.chat_invite_hash?()=>{const e={_:gr.JOIN_CHAT,invite:l.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:c,lastMsgId:i,startParam:s})};const h=(0,M.Z)("btn-primary btn-primary-transparent bubble-view-button",{text:t});return this.observer.observe(h,this.viewsObserverCallback),a&&(0,n.fc)(h,a),r.querySelector(".bubble-content").prepend(h),o}if(d&&"message"===e._){const e=document.createElement("b");e.append((0,v.ag)("BotInfoTitle")),c.push(e,"\n\n"),u=this.chatInner,p="prepend"}else h=(yield a(this.managers.appPeersManager.isAnyGroup(this.peerId)))&&(yield a(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",r,e,c):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",r,e,c):s.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",r,e,c):this.peerId.isUser()&&!d&&(yield a(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",r,e,c):this.renderEmptyPlaceholder("noMessages",r,e,c)}h&&(yield h),c.length&&r.querySelector(".message, .service-msg").prepend(...c);const m=!!this.messagesQueueOnRenderAdditional,g=this.setPeerCached&&!m;if(g){const e=r.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(ft.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||g||(t=!0),m||t?(this.updatePlaceholderPosition=l,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,Be.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,l()}:this.updatePlaceholderPosition=l,!m&&t){yield a((0,He.e9)());const t=(0,ra.Z)(this.bubbles);(0,k.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return this.emptyPlaceholderBubble=r,o}))))}))}generateLocalMessageId(e=0){let t=("scheduled"===this.chat.type?-1:0)+e;const i=-Math.abs(t);return{id:i,mid:-Math.abs((0,Sr.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return jl(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,si.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return function({overflowElement:e,selector:t,extraSize:i}){const s=e.getBoundingClientRect(),n=Array.from(e.querySelectorAll(t)),a=[],o=[],r=[];let l=!1;for(const t of n){const i=t.getBoundingClientRect(),n=mr(t,e,!1,i,s);let c;n?(l=!0,c=o):c=l?r:a,c.push({element:t,rect:i,visibleRect:n})}if(i&&o.length){const e=o[0].rect.top-i,t=o[o.length-1].rect.bottom+i;for(let t=a.length-1;t>=0;--t){const i=a[t];i.rect.top>=e&&(a.splice(t,1),o.unshift(i))}for(let e=0,i=r.length;e+e.dataset.mid));let o;!!i.length==!!s.length||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(Je.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return jl(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,i?!this.chat.isRestricted&&("bottom"===e&&(yield this.managers.appPeersManager.isBroadcast(this.peerId))&&this.toggleSponsoredMessage(t),"top"===e&&t&&(yield this.managers.appPeersManager.isBot(this.peerId)))?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return jl(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.bubbles[i]&&this.getSponsoredMessagePromise===s)),s=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>jl(this,void 0,void 0,(function*(){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])=>{e()&&(t("rendering",i),this.performHistoryResult({history:[i]},!1))}))})))).finally((()=>{this.getSponsoredMessagePromise=void 0}))}else t("clearing rendered",i),this.deleteMessagesByIds([i]),this.getSponsoredMessagePromise=void 0}))}renderBotPlaceholder(){return jl(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=>jl(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=>{e.message=s.bot_info.description}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return jl(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||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,n=0,a=!1,o){return jl(this,void 0,void 0,(function*(){const r=this.peerId,l=yield this.managers.appPeersManager.isBroadcast(r),c=Math.min(30,zi.height/40|0);let d=l?20:Object.keys(this.bubbles).length>0?Math.max(35,c):c;if(void 0!==Yl){if(!Yl)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--Yl}let h,u=0;if(i&&(u=d,t||(d=0)),n&&!i)if("pinned"===this.chat.type)h=[n];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,m=yield this.requestHistory(e,d,u);const g=(null==h?void 0:h.length)&&!m.cached,v=this.isFirstLoad&&u&&!m.cached||g;g&&(p=m.result,m={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const f=e=>jl(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(r)}})),y=e=>(0,He.e9)().then((()=>f(e))).then((()=>(!g&&n&&e.history.unshift(n),this.performHistoryResult(e,t)))),b=e=>{const t=Promise.resolve(e).then((e=>{if(o&&!o())throw ec;if(!a)return y(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(m.cached){if(a)return this.scrollable.onScroll(),null;S=!0,w=y(yield m.result)}else S=!1,w=b(m.result);const C=g?b(p):w;if(v&&s.Z.settings.animationsEnabled){let i=g?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(n,h,g,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return a?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return jl(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])){let 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?Xl: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 sc(){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}class nc{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,n=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:n}=this;let a,o,r,l=[],c=[];const d=A.Z.MANAGERS,h=yield d.appPeersManager.canPinMessage(e),u=(s,a,o)=>{setTimeout((()=>{let s;s=i&&!t?h?d.appMessagesManager.unpinAllMessages(e):d.appMessagesManager.hidePinnedMessages(e):d.appMessagesManager.updatePinnedMessage(e,t,i,o,a),n&&s.then(n)}),300)};if(i){let i="UnpinMessage";t?(a="UnpinMessageAlertTitle",o="Chat.Confirm.Unpin"):h?(a="Popup.Unpin.AllTitle",o="Chat.UnpinAllMessagesConfirmation",r=[""+((yield d.appMessagesManager.getPinnedMessagesCount(e))||1)]):(a="Popup.Unpin.HideTitle",o="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),l.push({langKey:i,isDanger:!0,callback:u})}else{a="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(l.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield d.appChatsManager.isBroadcast(e.toChatId()))?o="PinMessageAlertChannel":(o="PinMessageAlert",c.push({text:"PinNotify",checked:!0}))):(o="PinMessageAlertChat",e===s.Z.myId?l.push({langKey:t,callback:u}):(l.push({langKey:t,callback:e=>u(0,!e.size)}),c.push({text:"PinAlsoFor",textArgs:[new Nt({peerId:e}).element],checked:!0})))}(0,A.x)(l),new _i("popup-delete-chat",{peerId:e,titleLangKey:a,descriptionLangKey:o,descriptionLangArgs:r,buttons:l,checkboxes:c}).show()},new((i=void 0)||(i=Promise))((function(s,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((n=n.apply(e,t||[])).next())}));var e,t,i,n}}function ac(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}function oc(e,t,i){return s.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return u.Z.downloadMedia({media:s}).then((n=>{return a=this,o=void 0,l=function*(){const a=d.Z.active.emojiSticker,o=(0,ci.tB)(e),r=yield ri.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:o},"none");r.addEventListener("firstFrame",(()=>{ai(s,r.canvas,o),r.remove()}),{once:!0})},new((r=void 0)||(r=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 r?n:new r((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,o||[])).next())}));var a,o,r,l}))}))}class rc extends _i{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&&Ei({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");La({div:n,emoji:rc.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.append(n);const a=new b.Z({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}rc.STICKER_EMOJI="👮‍♀️";class lc extends _i{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,M.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const a=oc(rc.STICKER_EMOJI);(0,n.fc)(this.body,(n=>{const o=(0,r.Z)(n.target,"btn-primary"),l=s[(0,Dn.Z)(o)][1];a.then((()=>{this.hide(),new rc(e,t,l,i)}))}),{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class cc extends _i{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,v.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(v.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var dc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class hc extends A.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return dc(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message),t=yield this.managers.appMessagesManager.canViewMessageReadParticipants(e),i=new nr,s=Object.assign(Object.assign({},e),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},e.reactions),{pFlags:{},recent_reactions:[]})});s.reactions.results=s.reactions.results.map((e=>Object.assign(Object.assign({},e),{pFlags:{}}))),i.init(s,"block"),i.render(),i.classList.add("no-stripe"),i.classList.remove("has-no-reactions"),i.append(this.btnClose),this.header.append(i);const n=document.createElement("div");n.classList.add("tabs-container"),n.dataset.animation="tabs";const a=new Map;let o=!1;if(s.reactions.results.length){const e=this.createFakeReaction("reactions",s.reactions.results.reduce(((e,t)=>e+t.count),0));i.prepend(e),s.reactions.results.unshift(e.reactionCount),o=!0}let r=!1;if(t)try{const t=yield this.managers.appMessagesManager.getMessageReadParticipants(e.peerId,e.mid);if(!t.length)throw"";const n=this.createFakeReaction("checks",t.length);i.prepend(n),s.reactions.results.unshift(n.reactionCount),r=!0}catch(e){}s.reactions.results.forEach((t=>{const i=new m.ZP(void 0);i.container.classList.add("tabs-tab");const s=new Wo({noShadow:!0,noDelimiter:!0}),o=Jm.createChatList({dialogSize:72});Jm.setListClickListener(o,(()=>{this.hide()}),void 0,!1,!0),s.content.append(o),i.container.append(s.container);const r="checks"!==t.reaction,l="checks"===t.reaction;let c;["checks","reactions"].includes(t.reaction)&&(t.reaction=void 0);const d=new Di({scrollable:i,getPromise:()=>dc(this,void 0,void 0,(function*(){const i=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(e,void 0,t.reaction,c,r,l);return c=i.nextOffset,yield Promise.all(i.combined.map((({peerId:e,reaction:t})=>dc(this,void 0,void 0,(function*(){const{dom:i}=Jm.addDialogNew({peerId:e,autonomous:!0,container:o,avatarSize:54,rippleEnabled:!1,meAsSaved:!1});if(t){const e=document.createElement("div");e.classList.add("reacted-list-reaction-icon"),pi({doc:(yield this.managers.appReactionsManager.getReactionCached(t)).static_icon,div:e,width:24,height:24}),i.listEl.append(e)}(0,g.Z)(i.lastMessageSpan,ce(yield this.managers.appUsersManager.getUser(e.toUserId())))}))))),!c}))});a.set(i.container,d),n.append(i.container)})),this.body.append(n);const l=(0,ue.X)(i,n,((e,t)=>{if(e===i.childElementCount-1)return!1;const s=i.children[e],n=l.prevId();-1!==n&&i.children[n].setIsChosen(!1),s.setIsChosen(!0),a.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new ir;i.init("block"),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 uc="btn-menu-reactions-reaction",pc=!Je.IS_SAFARI;class mc{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,r.Z)(e.target,uc);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 s=this.widthContainer=document.createElement("div");s.classList.add("btn-menu-reactions-container"),s.classList.add("btn-menu-reactions-container-"+t);const a=this.container=document.createElement("div");a.classList.add("btn-menu-reactions");const o=this.scrollable="vertical"===t?new m.ZP(void 0):new m.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(),p.Z.setOverrideIdleGroup(this.animationGroup,!0),mi.Z||a.addEventListener("mousemove",this.onMouseMove),(0,n.fc)(a,(e=>{const t=(0,r.Z)(e.target,uc);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),s.append(a),this.middleware=null!=i?i:(0,Zn.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,tr.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,Be.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),p.Z.setOverrideIdleGroup(this.animationGroup,!1),p.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return s.Z.settings.animationsEnabled&&!Je.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(uc);const i=document.createElement("div");i.classList.add(uc+"-scale");const s=document.createElement("div");let n;s.classList.add(uc+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(uc+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:e.reaction};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(mi.Z?1:1.25),l={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;pi(Object.assign({doc:e.appear_animation,div:s,play:!0},l)).then((({render:e})=>e)).then((e=>{(0,si.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,si.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),ft.Z)}))}),ft.Z);const i=pi(Object.assign({doc:e.select_animation,div:n},l)).then((({render:e})=>e)).then((e=>((0,si.Z)(e),ri.Z.waitForFirstFrame(e)))).catch(ft.Z)}else delete l.needFadeIn,delete l.withThumb,pi(Object.assign({doc:e.static_icon,div:s},l));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=mr(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=""}pc&&(i.style.transform=n)}}var gc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class vc{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,r.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,r.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&&(()=>{gc(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!ac(),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"),this.chat.selection.isSelecting&&!i){if(a)return;const e=yield this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));t&&(n=t)}}this.isOverBubble=!!i;const o=(0,r.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=yield this.chat.getMessage(this.mid),this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0;const l=yield this.init();if(!l)return;s=l.element;const{cleanup:c,destroy:d,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:p}=l;let m=!1;if(u){const e="is-visible";if(m=u.container.classList.contains(e),m&&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,c(),setTimeout((()=>{d()}),300)})),m&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>gc(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,n.tH)(this.chat.selection.selectionSendNowBtn):new Jn(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>gc(this,void 0,void 0,(function*(){if(ac()){const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];bi((yield Promise.all(e.map((e=>gc(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join(""))}else document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{bi(this.target.href)},this.onCopyLinkClick=()=>gc(this,void 0,void 0,(function*(){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,oi.Z)(i);let o,r="https://t.me/";n?(r+=n+"/"+(e?(0,oi.Z)(e.fwd_from.channel_post):a),e&&(r+="?comment="+a),o="LinkCopied"):(r+="c/"+t.toChatId()+"/"+a,e&&(r+="?thread="+(0,oi.Z)(e.mid)),o="LinkCopiedPrivateInfo"),Mi(v.ZP.format(o,!0)),bi(r)})),this.onPinClick=()=>{new nc(this.peerId,this.mid)},this.onUnpinClick=()=>{new nc(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>gc(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,n.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new qn({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,r.Z)(this.target,"grouped-item")||(0,r.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>gc(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,n.tH)(this.chat.selection.selectionDeleteBtn):new Yn(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new I.Z,this.attachListenerSetter=new I.Z,this.middleware=(0,Zn.k)()}attachTo(e){this.attachListenerSetter.removeAll(),mi.Z?(0,n.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,a.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):Gn(e,this.onContextMenu,this.attachListenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return gc(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):Ki(e,(e=>gc(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||mi.Z,t=yield e.verify()),!!t}))))}))}setButtons(){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,si.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:()=>gc(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:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>gc(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:()=>gc(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:()=>{bi(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{bi(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>gc(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:()=>gc(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:()=>gc(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:()=>{u.Z.downloadToDisc({media:this.message.media.document})},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let i=!!mi.Z;const s=!t.type||!["gif","video","sticker"].includes(t.type);return s&&(i=i||!!(0,r.Z)(this.target,"document")||!!(0,r.Z)(this.target,"audio")),s&&i}},{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:()=>gc(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!==le.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 lc(this.peerId,[this.mid])},verify:()=>gc(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 hc(this.message)}},verify:()=>gc(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},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>gc(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 cc},verify:()=>!1,isSponsored:!0}]}init(){return gc(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=$n(e,this.listenerSetter);t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>!e.icon));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 v.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,v.ag)("Chat.Context.ReactedFast",[a]):(0,v.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,v.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const l=22,c=3,d=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?d*Math.min(c,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 Nt({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,v.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,v.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=d*Math.min(c,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new qs({avatarSize:l});e.render(t?t.map((e=>(0,Bi.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){a=Je.IS_APPLE||mi.Z?"horizontal":"vertical",n=this.reactionsMenu=new mc(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0,i=0;s="vertical"===a?{top:t,left:e}:{top:e,right:i,left:t}}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}}))}}var fc=i(4329),yc=i.n(fc),bc=i(9043);class wc{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=$n(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Gn(e.onContextElement,(t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,a.Z)(t),xs.openBtnMenu(this.sendMenu))}),e.listenerSetter)}setPeerId(e){this.type=e===s.Z.myId?"reminder":"schedule"}}var Sc=i(3735),Cc=i(1293),Lc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Ic extends A.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,l.Z)(t,"LABEL"),s=(0,Cc.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,l.Z)(t,"LABEL"),s=(0,Dn.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),v.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return Lc(this,void 0,void 0,(function*(){if(this.questionInputField=new b.Z({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 wc({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,v.$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,v.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new xi.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new xi.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new xi.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("")),a.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),(0,v.$d)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),l=document.createElement("div");l.classList.add("poll-create-questions"),this.quizSolutionField=new b.Z({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()}));const c=document.createElement("div");c.classList.add("subtitle"),(0,v.$d)(c,"AddAnExplanationInfo"),l.append(this.quizSolutionField.container,c),a.push(r,o,l),a.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...a),(0,n.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new m.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,Sc.Z)(i,!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,Sc.Z)(this.quizSolutionField.input,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return Lc(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,Sc.Z)(this.quizSolutionField.input);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 b.Z({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Li({text:"",name:"question"});s.main.append(i.container),(0,n.fc)(i.input,a.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,Dn.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const o=document.createElement("span");o.classList.add("btn-icon","tgico-close"),i.container.append(o),(0,n.fc)(o,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)}}function Mc(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),to({media:e,mediaSize:(0,ot.C)(t,i),boxSize:(0,ot.C)(320,240),quality:.9})}function Ec(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{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),(0,sl.Z)(this.input)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s={};s.file=e;const n=document.createElement("div");n.classList.add("popup-item"),s.itemDiv=n;const a=i?this.attachMedia(s,n):this.attachDocument(s,n);return t.sendFileDetails.push(s),a},this.construct(i)}construct(e){return Pc(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!1};const t=yield this.managers.apiManager.getConfig();if(this.captionLengthMax=t.caption_length_max,(0,n.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new wc({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)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new m.ZP(null);i.container.append(this.mediaContainer),this.inputField=new b.Z({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:this.captionLengthMax,withLinebreaks:!0}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",(()=>{this.files=[],Tc=void 0})),Tc=this}))}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new xi.Z({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",(()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()}))):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find((e=>o.Z.has(e.type)));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new xi.Z({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",(()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()}))):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!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.inputField.value;if(t.length>this.captionLengthMax)return void Mi(v.ZP.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat;s.forEach((e=>{e.itemDiv=void 0}));const{length:r}=s,l=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},l),{clearDraft:!0})),t=void 0);const s=Object.assign(Object.assign({},i),{sendFileDetails:e});this.managers.appMessagesManager.sendAlbum(a,s.sendFileDetails.map((e=>e.file)),Object.assign(Object.assign(Object.assign({},l),{caption:t,isMedia:n,clearDraft:!0}),s)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent()}attachMedia(e,t){return Pc(this,void 0,void 0,(function*(){t.classList.add("popup-item-media");const i=e.file;let s;if(i.type.startsWith("video/")){const n=ut(),a=document.createElement("source");a.src=e.objectURL=yield Ci.Z.invoke("createObjectURL",i),n.autoplay=!0,n.controls=!1,n.muted=!0,n.addEventListener("timeupdate",(()=>{n.pause()}),{once:!0}),s=(0,pt.Z)(n).then((()=>Pc(this,void 0,void 0,(function*(){e.width=n.videoWidth,e.height=n.videoHeight,e.duration=Math.floor(n.duration);const i=n.webkitAudioDecodedByteCount;void 0!==i&&(e.noSound=!i),t.append(n);const s=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{Mc(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(n);e.thumb=Object.assign({url:yield Ci.Z.invoke("createObjectURL",s.blob)},s)})))),n.append(a)}else{const n=new Image;s=new Promise((s=>{n.onload=()=>{e.width=n.naturalWidth,e.height=n.naturalHeight,t.append(n),"image/gif"===i.type?(e.noSound=!0,Promise.all([Ec(n).then((t=>{e.duration=Math.ceil(t)})),Mc(n).then((t=>Pc(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield Ci.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{s()}))):s()}})),n.src=e.objectURL=yield Ci.Z.invoke("createObjectURL",i)}return s}))}attachDocument(e,t){return Pc(this,void 0,void 0,(function*(){t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");(s||n||i.size<2e7)&&(e.objectURL=yield Ci.Z.invoke("createObjectURL",i));const a={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let o;e.objectURL&&(o={url:e.objectURL,downloaded:i.size,type:"full"});const r=yield Xt({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}},cacheContext:o});return new Promise((i=>{const n=()=>{t.append(r),i()};if(s){const t=new Image;t.src=e.objectURL,t.onload=()=>{e.width=t.naturalWidth,e.height=t.naturalHeight,n()},t.onerror=n}else n()}))}))}shouldCompress(e){return"media"===this.willAttach.type&&o.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),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,g.Z)(t,(0,v.ag)(s,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const i=(0,Ce.Z)(t.width,t.height,380,320);e.style.width=i.width+"px",e.style.height=i.height+"px"}this.mediaContainer.append(e)}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{i.innerHTML="",e.length&&(this.setTitle(),this.iterate((e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Te({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:380,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e.itemDiv,e)}))})))})).then((()=>{this.onRender()}))}}const _c="keydown",Ac="active",Zc=["ArrowUp","ArrowDown"],Dc=["ArrowLeft","ArrowRight"];class Fc 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}=function({list:e,type:t,onSelect:i,once:s,waitForKey:o}){let l=(null==o?void 0:o.length)?new Set(o):void 0;const c=new Set("xy"===t?Zc.concat(Dc):"x"===t?Dc:Zc);let d;const h=()=>d||e.querySelector(".active")||e.firstElementChild,u=(e,i)=>{if(d===e)return;let s=!1;d&&(s=!0,d.classList.remove(Ac)),d=e,d&&(d.classList.add(Ac),s&&v&&i&&(0,Ni.Z)({container:v,element:d,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},p=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let m;m="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):p(t,"ArrowRight"===i):(e,t)=>p(e,"ArrowRight"===t||"ArrowDown"===t);let g=i=>{const s=i.key;if(c.has(s)){if((0,a.Z)(i),e.childElementCount>1){let e=h();e=m(e,s),u(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,a.Z)(i),b(h()))};const v=(0,r.Z)(e,"scrollable");e.classList.add("navigable-list");const f=t=>{const i=(0,ta.Z)(t.target,e);i&&u(i,!1)},y=t=>{(0,a.Z)(t);const i=(0,ta.Z)(t.target,e);i&&(u(i,!1),b(h()))},b=e=>{const t=i(e);(void 0!==t?!t:s)&&C()};let w=!1;const S=()=>{w||(w=!0,document.addEventListener(_c,g,{capture:!0,passive:!1}),e.addEventListener("mousemove",f,{passive:!0}),(0,n.fc)(e,y))},C=()=>{w&&(w=!1,document.removeEventListener(_c,g,{capture:!0}),e.removeEventListener("mousemove",f),(0,n.EN)(e,y))},L=()=>{l||u(e.firstElementChild,!1)};if(l){const e=g;g=t=>{l.has(t.key)&&((0,a.Z)(t),document.removeEventListener(_c,g,{capture:!0}),g=e,document.addEventListener(_c,g,{capture:!0,passive:!1}),l=void 0,L())}}else L();return S(),{attach:S,detach:C,resetTarget:L}}({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,Je.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},C.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(C.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,x.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&&(C.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 n=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),Re(this.container,"is-visible",!e,s.Z.settings.animationsEnabled&&!i?300:0,(()=>{this.hidden&&this.dispatchEvent("hidden")}),n)}}class Rc extends Fc{constructor(e,t,i){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!jr.onMediaClick({target:e},!0),waitForKey:["ArrowUp","ArrowDown"]}),this.managers=i,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),s.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(d.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),s.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),oc(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*d.Z.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},d.Z.addEventListener("changeScreen",this.onChangeScreen)),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 m.ZP(this.container),this.lazyLoadQueue=new ye,this.superStickerRenderer=new Or(this.lazyLoadQueue,hm,this.managers)}}const Bc=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Nc=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Uc extends Xo{constructor(e,t,i){var s;if(super((s=e).getTime()>Nc().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Bc(),maxDate:Nc(),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,M.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,n.fc)(e,(()=>{t(ur),this.hide()}))}}}var Oc=i(6299),Hc=i(9041),zc=i(6875);function Gc(e,t=!0){const i=[],s=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),i=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&i==t.endOffset){const s=i-1,n=e.childNodes;if(t.startContainer===e&&n[s]){a=n[s],o=0;for(let e=0;e{i.onEmojiSelected(_r(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 m.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=>{xr(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{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class Kc extends Fc{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(Kc.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(Kc.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new m.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=Kc.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=Kc.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 km;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,c.Z)(n,(0,Zt.Z)(e.name)):n.append(new Nt({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,c.Z)(s,(0,Zt.Z)(e.description)),i.append(s)}return i}}Kc.BASE_CLASS="autocomplete-peer-helper",Kc.BASE_CLASS_LIST_ELEMENT=Kc.BASE_CLASS+"-list-element";var Wc=i(5082);function jc(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new Wc.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{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 $c extends Kc{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${Kc.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=jc(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class qc{constructor(){this.helpers=new Set,this.middleware=(0,Zn.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 Qc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Yc extends Kc{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="";e.username?s="@"+e.username:(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=>Qc(this,void 0,void 0,(function*(){if(!n())return;const t=s.slice(1).toLowerCase(),i=e.map((e=>Qc(this,void 0,void 0,(function*(){const i=yield this.managers.appUsersManager.getUser(e);if(!i.username||i.username.toLowerCase()!==t)return{peerId:e,description:i.username?"@"+i.username:void 0}}))));this.render((yield Promise.all(i)).filter(Boolean))})))),!0}}var Jc=i(5494),Xc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ed extends Kr{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,ta.Z)(t,this.element)||t===this.btnHover||((0,a.Z)(e),this.toggle(!1))},(0,x.Z)(this,e),this.element.classList.add(ed.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(s.Z)("history_reply_markup",(({peerId:e})=>Xc(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,He.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>Xc(this,void 0,void 0,(function*(){yield this.render(),mi.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,n.fc)(this.element,(e=>{const t=(0,r.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:n}=this;"keyboardButtonRequestPhone"===i?Wa({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(n,s.Z.myId)})):this.managers.appMessagesManager.sendText(n,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return Xc(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 Xc(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 Xc(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.element.textContent="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(ed.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(ed.BASE_CLASS+"-button","btn"),(0,c.Z)(t,(0,Zt.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.element.append(e)}}))}checkAvailability(e){var t;return Xc(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()}}ed.BASE_CLASS="reply-keyboard";var td=i(7084),id=i(515);const sd="INLINE-HELPER";class nd extends Fc{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,id.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,a=void 0,r=function*(){const s=this.controller.getMiddleware(),a=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==a._)throw"NOT_A_BOT";const o=this.managers.appInlineBotsManager.getInlineResults(e,a.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=""+a.id,i.dataset.queryId=""+t.query_id;const o=new Rr(null,sd,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],l=!!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=l?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),l)t.classList.add("grid-item");else{n.classList.add("empty"),(0,c.Z)(n,(0,Zt.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,c.Z)(s,(0,Zt.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,c.Z)(a,(0,ei.Z)(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"),l&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>u.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,td.Z)(e).then((e=>{De(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&l)(0,si.Z)(i),"gif"===i.type?o.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=l?48:void 0;l&&t.classList.add("no-border-radius"),dt({photo:i,container:l?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void o.clear();i.classList.toggle("is-gallery",l),i.classList.toggle("super-stickers",l),this.container.classList.toggle("is-gallery",l);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,M.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,c.Z)(i,(0,Zt.Z)(t.switch_pm.text)),(0,n.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,a.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*d.Z.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},d.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:a,renderPromise:o}},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function n(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof o?s:new o((function(e){e(s)}))).then(i,n)}l((r=r.apply(s,a||[])).next())}));var s,a,o,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Pi.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(d.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 m.ZP(this.container),this.lazyLoadQueue=new ye,this.superStickerRenderer=new Or(this.lazyLoadQueue,sd,this.managers)}}var ad=i(8090);class od extends Kc{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${Kc.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,tr.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=jc(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var rd=i(6241),ld=i(6535),cd=i(2821);function dd(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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}function hd(e){return e.then(dd)}var ud=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class pd{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,Zn.k)(),this.listenerSetter=new I.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;const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;Re(this.closeBtn,"is-visible",e,300,void 0,s),i||Re(t,"is-visible",!e,300,void 0,s)};fa({noRipple:!0,listenerSetter:this.listenerSetter,container:this.container},"top-right",e,(()=>{i(!0)}),(()=>{i(!1)})),e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=this.container.firstElementChild,this.btnMenu.classList.add("scrollable","scrollable-y"),this.container.append(this.closeBtn)}updateButtons(e){return ud(this,void 0,void 0,(function*(){const t=e.map(((e,t)=>ud(this,void 0,void 0,(function*(){const i=document.createElement("div"),n=document.createElement("div");return n.classList.add("btn-menu-item-subtitle"),e.isUser()?n.append((0,v.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?n.append((0,v.ag)("VoiceChat.DiscussionGroup")):n.append(yield $i(e.toChatId())),i.append(new Nt({peerId:e}).element,n),{onClick:t?()=>ud(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),n=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,k.Z)(t,e),t.unshift(e),this.updateButtons(t)};s.Z.settings.animationsEnabled?setTimeout(n,250):n(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),i=yield Promise.all(t),n=$n(i);i.forEach(((t,i)=>{const s=e[i],n=new km;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),Array.from(this.btnMenu.children).slice(1).forEach((e=>e.remove())),this.btnMenu.append(...Array.from(n.children))}))}updateAvatar(e,t){return ud(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);let s=t?0:2;const n=t?0:300,a=this.avatar=new km;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),Re(a,"is-visible",!0,n,void 0,s),i&&Re(i,"is-visible",!1,n,(()=>{i.remove()}),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,Bi.Z)(e.default_send_as):void 0))})))}updateManual(e){return ud(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===c)),{container:n}=this,a=t.toChatId(),o=(yield hd(this.getDefaultSendAs())).result,r=e;o instanceof Promise&&(e=void 0);const l=r&&!e,c=this.updatingPromise=(0,tr.Z)(o,(t=>ud(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(a).then((e=>{if(!i())return;const s=e.map((e=>(0,Bi.Z)(e)));this.sendAsPeerIds=s.slice(),(0,k.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const o=()=>{this.onReady(n,e),this.addedListener||(this.listenerSetter.add(s.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!l)return o;o()}))));return c.finally((()=>{this.updatingPromise===c&&(this.updatingPromise=void 0)})),l?void 0:c}))}update(e){return this.updateManual(e).then((e=>e&&e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}class md extends b.Z{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.inputFake.innerHTML=this.input.innerHTML,this.onFakeInput()})),e.placeholder&&(0,v.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===t)return;const s=Math.round(50*Math.log(Math.abs(t-i)));this.input.style.transitionDuration=`${s}ms`,e&&(this.input.style.height=t?t+"px":"");const n="is-changing-height";Re(this.input,n,!0,s,(()=>{this.input.classList.remove(n)}))}setValueSilently(e,t){super.setValueSilently(e,t),this.inputFake.innerHTML=e,t||this.onFakeInput()}}var gd=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const vd="Posting media content isn't allowed in this group.";class fd{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,a.Z)(e),this.recordCanceled=!0,this.recorder.stop(),bc.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=mi.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=mi.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>gd(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,n=this.chat.bubbles.getMiddleware(),a=s.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new Uc(t,(t=>{n()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{n()&&this.appImManager.openScheduled(i)}),0))}),a).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,a.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(document.getSelection().toString().trim().length&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,a.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}=Gc(this.messageInputField.input),a=(0,cd.Z)(i,s,!0),o=(0,rd.Z)(s,(0,ld.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"})),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),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)=>{this.insertAtCaret(e,Tr(e),t)},this.onBtnSendClick=e=>gd(this,void 0,void 0,(function*(){if((0,a.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{if(this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend("send_media")))return void Mi(vd);this.chatInput.classList.add("is-locked"),(0,Xn.Z)(),this.recorder.start().then((()=>{this.releaseMediaPlayback=vt.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),bc.Z.setKeepAlive(!0);const e=()=>{new _i("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,n.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,r.Z)(t.target,"chat-input")||(0,r.Z)(t.target,"popup-cancel-record")||((0,a.Z)(t),e())}),{capture:!0,passive:!1}),C.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),o=255*s.length;let l=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));let t=Math.min(1,e/o+.36);this.recordRippleEl.style.transform=`scale(${t})`;let n=Date.now()-this.recordStartTime,a=n%1e3,r=gt(n/1e3)+","+("00"+Math.round(a/10)).slice(-2);this.recordTimeEl.innerText=r,(0,Be.T2)(l)};l()})).catch((e=>{switch(e.name){case"NotAllowedError":Mi("Please allow access to your microphone");break;case"NotReadableError":Mi(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),Mi(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>gd(this,void 0,void 0,(function*(){if(e&&(0,a.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=(0,cd.Z)(this.messageInputField.value,[]);if(e.message!==t)return void new _i("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,a.Z)(e),(0,r.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&mi.Z&&!e.container.classList.contains("active")&&xs.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new I.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=sc();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=F({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,n.fc)(this.goDownBtn,(e=>{(0,a.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=E(""),this.replyElements.cancelBtn=E("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(r=!0,this.canToggleHideAuthor()),t=()=>{r=!1},i=this.forwardElements={};let r=!1;const l=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new xi.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new xi.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new xi.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new xi.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],c=i.container=$n(l,this.listenerSetter),d=Array.from(c.children);if([{elements:d.slice(0,2),onChange:(e,t)=>{const s=!!+e;r&&(this.forwardWasDroppingAuthor=!s);const n=this.replyElements.container.querySelector(".reply-title");if(n){const e=n.firstElementChild,t=v.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:d.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=vi(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),c.append(t)})),c.append(i.changePeer.element),mi.Z||(this.forwardHover=new Kr({element:c})),i.modifyArgs=l.slice(0,-1),this.replyElements.container.append(c),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.btnToggleEmoticons=E("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type){this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=F({icon:"mention",className:"bubbles-corner-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,n.fc)(this.goMentionBtn,(e=>{(0,a.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=E("scheduled btn-scheduled float hide",{noRipple:!0}),(0,n.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(s.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=E("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new ed({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 od(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const e=document.createElement("div");e.classList.add("new-message-bot-commands-icon-scale");const t=this.botCommandsIcon=document.createElement("div");t.classList.add("animated-menu-icon","animated-menu-close-icon"),e.append(t),this.botCommandsToggle.append(e),(0,n.fc)(this.botCommandsToggle,(e=>{(0,a.Z)(e),t.classList.contains("state-back")?(this.botCommands.toggle(!0),t.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),t.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{t.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{t.classList.remove("state-back")}))}this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...o.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:()=>{A.Z.createPopup(Ic,this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=fa({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),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 qc,this.stickersHelper=new Rc(this.rowsWrapper,this.autocompleteHelperController,this.managers),this.emojiHelper=new Vc(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new $c(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new Yc(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new nd(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=E("delete btn-circle z-depth-1 btn-record-cancel"),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=E("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new wc({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!this.isInputEmpty()||!!Object.keys(this.forwarding).length}),this.btnSendContainer.append(this.sendMenu.sendMenu)),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),qr.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(qr)("open",this.onEmoticonsOpen),this.listenerSetter.add(qr)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(s.Z)("settings_updated",(()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()})),this.listenerSetter.add(s.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat===e&&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)})),"scheduled"===this.chat.type?this.listenerSetter.add(s.Z)("scheduled_delete",(({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})):(this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(s.Z)("dialogs_multiupdate",(e=>{e[this.chat.peerId]&&(this.startParam===le.gZ?this.setStartParam():this.center(!0))})));try{this.recorder=new(yc())({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=>{let t=e.target.files;t.length&&(A.Z.createPopup(xc,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,n.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,n.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&&(C.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"});bc.Z.decode(e,!0).then((e=>{bc.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,n.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,n.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Pi.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,M.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,v.ag)("BotStart")),(0,n.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,Ai.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)}constructPinnedHelpers(){this.pinnedControlBtn=(0,M.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 nc(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))})),this.chatInput.classList.add("type-pinned")}_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 l=i.getBoundingClientRect(),c=this.fakeRowsWrapper.getBoundingClientRect(),d=c.width,h=l.width;if(d!==h){const e=h/d,t=(d-h)/2;if(a=l.left-c.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=12;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return Re(this.inputContainer,"is-centering",s,u),Re(this.rowsWrapperWrapper,"is-centering-to-control",!!(s&&e&&e.classList.contains("chat-input-control")),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:d,widthTo:h}}center(e=!1){return gd(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(e=this.startParam){return gd(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.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return gd(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),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)}}))}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=(0,Sc.Z)(this.messageInputField.input);let i;(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,nl.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,i)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),ea(),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 gd(this,void 0,void 0,(function*(){if(!i&&!(0,Cc.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,Be.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e){const t=(0,ld.Z)(e.message),i=e.entities||[],s=(0,rd.Z)(i.slice(),t);return(0,fo.Z)((0,yo.Z)(e.message,{entities:s}))}(e);return(this.messageInputField.value!==s||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 pd(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 gd(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:l}=this,c=this.sendAs,d=this.createSendAs(),[h,u,p,m,g,f,y,b,w]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),hd(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?hd(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,d?(d.setPeerId(this.chat.peerId),d.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),S=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),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&&y){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,tr.Z)(y.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),l&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),l.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=f.result;(0,tr.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}c&&c.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?this.updateMessageInput(m,S,w):this.pinnedControlBtn&&this.pinnedControlBtn.append((0,v.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this._center(g,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,Re(this.newMessageWrapper,"has-offset",t,i?0:300,void 0,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 gd(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=this.chat;let i;return i=t?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==s.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",i}))}updateMessageInputPlaceholder(e){const t=v.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(!this.attachMenuButtons)return;const{peerId:e,threadId:t}=this.chat;return Ki(this.attachMenuButtons,(i=>i.verify(e,t)))}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),this.attachMenuButtons&&this.attachMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!i.includes(e))})),e?(a.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.removeAttribute("contenteditable"),n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new md({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.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),ad.T&&(0,ad.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,Oc.Z)(e))(0,a.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,sl.Z)(this.messageInput)})),mi.Z&&(0,n.fc)(this.messageInput,(e=>{this.appImManager.selectTab(1),qr.toggle(!1)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",(()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"var(--font-monospace)"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null),spoiler:()=>document.execCommand("fontName",!1,"spoiler")};if(!i[e])return!1;const s=i[e],n=this.prepareDocumentExecute(),a=[];a.push(document.execCommand("styleWithCSS",!1,"true"));const o=e=>{let t=!1;const i=window.getSelection();if(!i.isCollapsed){const s=i.getRangeAt(0),n=Hc.o[e],a=s.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}return t};return"monospace"===e||"spoiler"===e?o(e)?a.push(this.resetCurrentFontFormatting()):(("monospace"===e||o("monospace"))&&a.push(this.resetCurrentFormatting()),a.push("function"==typeof s?s():document.execCommand(s,!1,null))):(o("monospace")&&a.push(this.resetCurrentFormatting()),a.push("function"==typeof s?s():document.execCommand(s,!1,null))),a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){const{value:s,caretPos:n,entities:a}=Gc(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),l=s.substr(o),c=i?r.match(fd.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,u=(0,ld.Z)(s);(0,rd.Z)(a,u);const p=t?Math.max(t.length,e.length):e.length,m=[];t&&(m.push(t),t.offset=d);const g=c?p-c[2].length:p;a.forEach((e=>{e.offset>=d&&(e.offset+=g)})),(0,rd.Z)(a,m);{const e={_:"messageEntityCaret",offset:d+p,length:0};let t=0;for(let i=a.length;te.offset);++t);a.splice(t,0,e)}const v=(0,fo.Z)((0,yo.Z)(h,{entities:a}));this.messageInputField.setValueSilently(v);const f=this.messageInput.querySelector(".composer-sel");f&&(function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const i=document.createTextNode("");e.parentNode.insertBefore(i,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=i}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}(f),f.remove()),this.onMessageInput()}checkAutocomplete(e,t,i){return gd(this,void 0,void 0,(function*(){if(void 0===e){const s=Gc(this.messageInputField.input,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,cd.Z)(e,i,!0);i=(0,rd.Z)(i,(0,ld.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const n=e.match(fd.AUTO_COMPLETE_REG_EXP);let a;if(n){const t=i[0];let o=n[2];const r=o[0];if(this.stickersHelper&&s.Z.settings.stickers.suggest&&(yield this.chat.canSend("send_stickers"))&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)a=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?(0,oi.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?le.NM:this.chat.peerId,e))&&(a=this.mentionsHelper)}else n[1]||"/"!==r?s.Z.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(a=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):(yield this.commandsHelper.checkQuery(o,this.chat.peerId))&&(a=this.commandsHelper)}a=this.checkInlineAutocomplete(e,a),this.autocompleteHelperController.hideOtherHelpers(a)}))}checkInlineAutocomplete(e,t){let i=!1;if(!t){const s=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(s){const n=s[1],a=e.slice(s[0].length);i=s[0].length===e.length,t=this.inlineHelper,this.btnPreloader?Re(this.btnPreloader,"show",!0,400):(this.btnPreloader=E("none btn-preloader float show disable-hover",{noRipple:!0}),(0,be.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{Re(this.btnPreloader,"show",!1,400)}))})).catch(ft.Z)}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Re(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&(Re(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,Fi.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new qn(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return gd(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&Je.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,Jc.Z)(e),this.messageInputField.setValueSilently(i),(0,Jc.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);mi.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,Cc.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),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}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 i=this.messageInputField.value;(0,ld.Z)(i).filter((e=>"messageEntityEmoji"===e._)).forEach((e=>{const t=(0,ci.zu)(e.unicode);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,Sc.Z)(this.messageInputField.input);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new Yn(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,Fi.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()}));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1){var s;return gd(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))?(Mi(vd),!1):"scheduled"!==this.chat.type||t?!!e&&(this.managers.appMessagesManager.sendFile(this.chat.peerId,e,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{isMedia:!0,clearDraft:i||void 0})),this.onMessageSent(i,!0),"sticker"===e.type&&(null===(s=qr.stickersTab)||void 0===s||s.pushRecentSticker(e)),!0):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,l.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return gd(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,fo.Z)((0,yo.Z)(t.message,{entities:t.totalEntities}));const s=()=>gd(this,void 0,void 0,(function*(){const n=yield In(t,void 0,[t.mid]);this.setTopInfo("edit",s,(0,v.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>gd(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),n=new Set;let a=0,o=0;const r=i.map((t=>gd(this,void 0,void 0,(function*(){const i=e[t],s=i.map((e=>gd(this,void 0,void 0,(function*(){var i;const s=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=s.fwd_from)||void 0===i?void 0:i.from_name)||s.fromId||s.fwdFromId?n.add("P"+s.fromId):n.add("N"+s.fwd_from.from_name),s.media&&s.message&&++o}))));yield Promise.all(s),a+=i.length}))));yield Promise.all(r);const c=n.size>2,d=[...n].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===s.Z.myId?(0,v.ag)("Chat.Accessory.Forward.You"):new Nt({peerId:t,dialog:!1,onlyFirstName:c}).element}return c?e.split(" ")[0]:e})),{forwardElements:h}=this;(0,l.Z)(h.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const u=h.hideCaption.checkboxField.checked;o&&u?h.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?h.hideSender:h.showSender).checkboxField.setValueSilently(!0);const p=h.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",m=(0,v.ag)(p,[a]),g=document.createDocumentFragment();let f,y;if(d.length<3?g.append(...(0,v.v_)(d,!1)):g.append(d[0],(0,v.ag)("AndOther",[d.length-1])),1===i.length){const t=i[0],s=e[t];if(f=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),y=!!f.grouped_id,y){const e=yield this.managers.appMessagesManager.getMidsByMessage(f);(e.length!==a||e.find((e=>!s.includes(e))))&&(y=!1)}}const b=document.createDocumentFragment();if(y||1===a){const t=e[i[0]],s=yield In(f,void 0,t);b.append(g,": ",s)}else b.append((0,v.ag)("Chat.Accessory.Forward.From"),": ",g);let w=this.setTopInfo("forward",t,m,b);h.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=v.ZP.weakMap.get(s);n.args=[t<2?i.length:o],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(w,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return gd(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 Nt({peerId:t.fromId,dialog:!1}).element:(s=(0,v.ag)("Loading"),this.managers.appMessagesManager.wrapSingleMessage(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.replyToMsgId=e};i()}))}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=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")&&(C.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";Re(this.chat.container,e,!0,150,(()=>{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,Be.T2)((()=>{i&&(0,sl.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,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=E(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:c}=kn(i,s,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),"webpage"===e&&(c.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),Je.IS_MOBILE||C.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),c}}fd.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;const yd="pinned-container";class bd{constructor(e){this.floating=!1,(0,x.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(yd,"hide"),t.title.classList.add(yd+"-title"),t.subtitle.classList.add(yd+"-subtitle"),t.content.classList.add(yd+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(yd+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(yd+"-wrapper"),(0,we.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(yd+"-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,n.fc)(e,(e=>{(0,a.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||d.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()}}class wd extends _t{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,a.Z)(e),vt.Z.muted=!vt.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=vt.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,wd.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+wd.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);vt.Z.muted=!1,vt.Z.volume=t}});const i="player-volume",s=this.btn=document.createElement("div");s.classList.add("btn-icon",i);const o=this.icon=document.createElement("span");o.classList.add(i+"__icon"),s.append(o,this.container),(0,n.fc)(o,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(vt.Z)("playbackParams",this.setVolume),this.setVolume()}}wd.ICONS=["volume_off","volume_mute","volume_down","volume_up"];class Sd extends bd{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new on("pinned-audio",((e,t)=>{(0,g.Z)(this.divAndCaption.title,e),(0,g.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{vt.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 l="voice"!==e.type&&"round"!==e.type;if(l){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,Zt.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,Zt.Z)(t.performer):(0,v.ag)("AudioUnknownArtist")}else o=new Nt({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=G(t.date);this.fasterEl.classList.toggle("hide",l),this.repeatEl.classList.toggle("hide",!l),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=E("fast_rewind active",{noRipple:!0}),o=E("fast_forward active",{noRipple:!0}),r=(e,t)=>{(0,n.fc)(e,(e=>{(0,a.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};r(s,(()=>{vt.Z.previous()})),r(o,(()=>{vt.Z.next()})),this.toggleEl=E("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),r(this.toggleEl,(()=>{vt.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,o),this.volumeSelector=new wd(this.listenerSetter,!0);const l=document.createElement("div");l.classList.add("progress-line-container"),l.append(this.volumeSelector.container);const c=document.createElement("div");c.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(c),this.volumeSelector.btn.append(l),this.repeatEl=E("audio_repeat",{noRipple:!0}),r(this.repeatEl,(()=>{const e=vt.Z.getPlaybackParams();e.round?e.loop?(vt.Z.round=!1,vt.Z.loop=!1):vt.Z.loop=!vt.Z.loop:vt.Z.round=!0}));const d=this.fasterEl=E("playback_2x",{noRipple:!0});r(d,(()=>{vt.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const h=document.createElement("div");h.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new At(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),h.append(this.progressLine.container),this.wrapper.insertBefore(h,this.wrapperUtils),this.topbar.listenerSetter.add(vt.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(vt.Z)("pause",this.onPause),this.topbar.listenerSetter.add(vt.Z)("stop",this.onStop),this.topbar.listenerSetter.add(vt.Z)("playbackParams",this.onPlaybackParams);const u=vt.Z.getPlayingDetails();u&&(this.onMediaPlay(u),this.onPlaybackParams(u.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}var Cd;!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"}(Cd||(Cd={}));const Ld="pinned-message-border";class Id{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=Cd.ONE:2===e?i=Cd.TWO:3===e?i=Cd.THREE:4===e?i=Cd.FOUR:e>3&&(i=Cd.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=Cd.ONE:2===e?i=Cd.TWO:3===e?i=Cd.THREE:4===e?i=Cd.FOUR:e>3&&(i=Cd.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-Cd.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?Cd.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add(Ld),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=Ld+"-wrapper-1",this.border.classList.remove(Ld+"-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),l=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle(Ld+"-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=Ld+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}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(Ld+"-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 Md=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Ed{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Ed.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=Ed.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)}),Ed.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)}}Ed.DURATION=200,Ed.BASE_CLASS="animated-super";class Pd{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Pd.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Pd.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Pd.BASE_CLASS+"-decimal-placeholder";const s=new Ed;return s.container.className=Pd.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()}))}),Ed.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Pd.EMPTY_INDEX,!0),t.animatedSuper.animate(Pd.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:Pd.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Pd.EMPTY_INDEX=-1,Pd.BASE_CLASS="animated-counter";class Td{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 I.Z,this.log=(0,he.kg)("PM"),this.debug=!0,this.isStatic=!1;const o=new Tn("pinned-message");this.pinnedMessageContainer=new bd({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:o,onClose:()=>Md(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new nc(this.chat.peerId,this.pinnedMid,!0):new nc(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new Id,o.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Ed,o.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Ed,this.animatedMedia.container.classList.add("pinned-message-media-container"),o.content.prepend(this.animatedMedia.container),this.animatedCounter=new Pd(!0),o.title.append((0,v.ag)("PinnedMessage")," ",this.animatedCounter.container);const r=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(r),o.container.prepend(r),this.btnOpen=E("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,n.fc)(this.btnOpen,(e=>{(0,a.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.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(s.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Pi.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,mt.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic="discussion"===this.chat.type}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;let 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>Td.LOAD_COUNT&&(!this.loadedBottom&&e<=Td.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=Td.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Md(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:Td.LOAD_COUNT,backLimit:Td.LOAD_COUNT}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId).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 I.Z,function(e,t,i,s){if(mi.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 Md(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,He.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 Md(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 Md(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=[],l=yield Pn({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(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)}))}}Td.LOAD_COUNT=50,Td.LOAD_OFFSET=5;var kd=i(6818);const xd=[{time:3600,langKey:"ChatList.Mute.1Hour"},{time:14400,langKey:"ChatList.Mute.4Hours"},{time:28800,langKey:"ChatList.Mute.8Hours"},{time:86400,langKey:"ChatList.Mute.1Day"},{time:259200,langKey:"ChatList.Mute.3Days"},{time:-1,langKey:"ChatList.Mute.Forever"}];class _d extends _i{constructor(e){super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer(e,-1===i?le.rU:(0,nl.Z)(!0)+i)}}],body:!0});const t=xd.map((e=>new fi({radioField:new Li({langKey:e.langKey,name:"mute-time",value:""+e.time})})));let i;const s=yi(t,(e=>{i=+e}));this.body.append(s),t[t.length-1].radioField.checked=!0,this.show()}}class Ad{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)}}let Zd;function Dd(){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}function Fd(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}function Rd(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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}function Bd(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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=Bd;function Nd(){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?Rd:Bd)(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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=Nd;var Ud=i(6669);function Od(e){e.stop(),(0,Ud.Z)(e,"ended")}class Hd{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}}function zd(e){return e<<0}function Gd(e){return e>>>0}function Vd(e){return"screencast"===e?"video":e}function Kd(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function Wd(e,t="9",i){const s=Kd(e);return`m=${Vd(e)} ${t} ${s} ${i.join(" ")}`}class jd extends Hd{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=Gd(e.source);t+=n,i+=n;const a=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(Gd);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(a)}})):a(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:r}=e,l=t.transport,c="application"===n,d=c?void 0:t[n],h="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${Vd(n)} 0 ${Kd(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const u=c?[{id:5e3}]:d["payload-types"],p=u.map((e=>e.id));s(Wd(n,r,p),"c=IN IP4 0.0.0.0",`a=rtcp:${r} IN IP4 0.0.0.0`),l["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let m=o;if("sendrecv"===o||!i||h||c||(m="sendonly"===o?"recvonly":"sendonly"),s(`a=${m}`),this.addTransport(l),c)s(`a=sctpmap:${u[0].id} webrtc-datachannel 256`);else{const e=d["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),u.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"!==m&&"sendrecv"!==m||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:s,isAnswer:n}=e;this.addHeader(t.sessionId,s),Je.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((n?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,n);return this}static fromConference(e){return(new jd).addConference(e).finalize()}}class $d{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 qd{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);o.getByteFrequencyData(r);const l=function(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;t{const e=this.counter%3==0,t=(e?this.items:this.items.filter((e=>"input"===e.type))).filter((e=>"audio"===e.kind)).slice(0,50).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),qd.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,he.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,l=qd.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:""+zd(+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:r}=a;r||(r=a.createTransceiver(e.connection,n)),a.direction!==r.direction&&(r.direction=a.direction);const l=Vd(t),c=o.findIndex((e=>e.kind===l)),d=-1!==c?o.splice(c,1)[0]:void 0,h=r.sender;h.track!==d&&h.replaceTrack(d).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{Od(e)}))}catch(e){this.log.error(e)}}}qd.ANALYSER_LISTENER=new L.Z;class Qd extends L.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=Nd()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(ft.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&&Dd(),video:t&&{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:Fd(!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=qd.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const n="output"===i,{player:a,elements:o,streamManager:r}=this,l=t.kind,c="video"===l,d=c?s:l;let h=o.get(d);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),o.delete(d)}),{once:!0}),n&&r.addTrack(e,t,i);const u=c?e:r.outputStream;if(h)h.paused&&h.play().catch(ft.Z),h.srcObject=u;else{if(h=document.createElement(l),h.autoplay=!0,h.srcObject=u,h.volume=1,"undefined"!==h.sinkId){const{outputDeviceId:e}=this;e&&h.setSinkId(e)}c?(h.setAttribute("playsinline","true"),h.muted=!0):a.appendChild(h),o.set(d,h)}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=>{Od(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}class Yd{constructor(e,t){this.mid=e,this.type=t,this.port="9"}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(Vd(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 Jd(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 Xd{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,x.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new Yd(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,k.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 jd.fromConference(Object.assign({conference:this},e))}}class eh{constructor(e){var t;(0,x.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,he.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,he.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,he.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 Xd(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))}}var th,ih,sh=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},nh=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 ah{constructor(e,t){th.set(this,void 0),ih.set(this,void 0),sh(this,th,e,"f"),sh(this,ih,t,"f")}get session(){return nh(this,th,"f")}get media(){return nh(this,ih,"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 oh(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}th=new WeakMap,ih=new WeakMap;var rh,lh,ch,dh=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},hh=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 uh{constructor(e,t){rh.set(this,void 0),lh.set(this,void 0),ch.set(this,void 0),dh(this,rh,new Set,"f"),dh(this,lh,e,"f"),dh(this,ch,t,"f")}generate(){const e=hh(this,lh,"f"),t=hh(this,ch,"f"),i=hh(this,rh,"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){hh(this,rh,"f").add(e)}}rh=new WeakMap,lh=new WeakMap,ch=new WeakMap;var ph,mh,gh=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},vh=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 fh{constructor(e,t){ph.set(this,void 0),mh.set(this,void 0),gh(this,ph,e,"f"),gh(this,mh,t,"f")}get key(){return vh(this,ph,"f")}get value(){return vh(this,mh,"f")}}ph=new WeakMap,mh=new WeakMap;var yh,bh,wh,Sh,Ch=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},Lh=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 Ih{constructor(e,t,i,s){yh.set(this,void 0),bh.set(this,void 0),wh.set(this,void 0),Sh.set(this,void 0),Ch(this,yh,e,"f"),Ch(this,bh,t,"f"),Ch(this,wh,i,"f"),Ch(this,Sh,s,"f")}get type(){return Lh(this,yh,"f")}get port(){return Lh(this,bh,"f")}get protocol(){return Lh(this,wh,"f")}get ids(){return Lh(this,Sh,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}yh=new WeakMap,bh=new WeakMap,wh=new WeakMap,Sh=new WeakMap;var Mh,Eh,Ph,Th,kh=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},xh=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 _h{constructor(e,t){if(Mh.set(this,void 0),Eh.set(this,void 0),Ph.set(this,void 0),Th.set(this,void 0),kh(this,Mh,e,"f"),"string"==typeof t){if(kh(this,Eh,t,"f"),"m"===e){const e=t.split(" ");kh(this,Ph,new Ih(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=oh(t,":",1);t=e[0],kh(this,Th,1===e.length?new fh(t,null):new fh(t,e[1]),"f")}}else t instanceof Ih?(kh(this,Ph,t,"f"),kh(this,Eh,t.toString(),"f")):t instanceof fh&&(kh(this,Th,t,"f"),kh(this,Eh,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return xh(this,Mh,"f")}get value(){return xh(this,Eh,"f")}get parsed(){return xh(this,Th,"f")}get mediaLineParts(){return xh(this,Ph,"f")}toString(){return`${this.key}=${this.value}`}}Mh=new WeakMap,Eh=new WeakMap,Ph=new WeakMap,Th=new WeakMap;var Ah,Zh,Dh,Fh,Rh,Bh,Nh=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},Uh=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 Oh{constructor(e,t,i=":",s=!1){Ah.set(this,void 0),Zh.set(this,void 0),Dh.set(this,void 0),Fh.set(this,void 0),Rh.set(this,void 0),Bh.set(this,void 0),Nh(this,Ah,e,"f"),Nh(this,Zh,t,"f"),Nh(this,Dh,i,"f"),Nh(this,Rh,s,"f"),Nh(this,Fh,s?new Map:null,"f"),Nh(this,Bh,s?[]:null,"f")}get lines(){return Uh(this,Zh,"f")}get value(){return Uh(this,Rh,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!Uh(this,Rh,"f")}get key(){return Uh(this,Ah,"f")}get keys(){return Oh.fill(this),Uh(this,Bh,"f")}forEach(e){Oh.fill(this),Uh(this,Fh,"f").forEach(e)}get(e){return Oh.fill(this),Uh(this,Fh,"f").get(e)||new Oh(e,[],":",!0)}static fill(e){if(null!==Uh(e,Fh,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=oh(i,Uh(e,Dh,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=Nh(e,Fh,Oh.makeAttributes(t),"f");Nh(e,Bh,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new Oh(i,e))})),t}}Ah=new WeakMap,Zh=new WeakMap,Dh=new WeakMap,Fh=new WeakMap,Rh=new WeakMap,Bh=new WeakMap;var Hh,zh,Gh=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},Vh=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 Kh{constructor(e){Hh.set(this,void 0),zh.set(this,void 0),Gh(this,Hh,e,"f"),Gh(this,zh,new Map,"f"),Kh.fillAttributes(this)}get(e){return Vh(this,zh,"f").get(e)||new Oh(e,[]," ",!0)}static fillAttributes(e){const t=new Map;Vh(e,Hh,"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)=>{Vh(e,zh,"f").set(i,new Oh(i,t," ",!1))}))}}Hh=new WeakMap,zh=new WeakMap;var Wh,jh,$h,qh,Qh=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},Yh=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 Jh{constructor(e){Wh.set(this,void 0),jh.set(this,void 0),$h.set(this,void 0),qh.set(this,void 0),Qh(this,Wh,e,"f"),Qh(this,jh,e[0],"f"),Qh(this,$h,Qh(this,qh,null,"f"),"f")}get lines(){return Yh(this,Wh,"f")}get mediaLine(){return Yh(this,jh,"f")}get mediaLineParts(){return Yh(this,jh,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!Yh(this,qh,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",Qh(this,qh,t,"f")}return Yh(this,qh,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return Yh(this,$h,"f")||Qh(this,$h,new Kh(this.lines),"f"),Yh(this,$h,"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}}Wh=new WeakMap,jh=new WeakMap,$h=new WeakMap,qh=new WeakMap;var Xh,eu,tu=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},iu=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 su{constructor(e){Xh.set(this,void 0),eu.set(this,void 0),tu(this,Xh,e,"f"),tu(this,eu,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return iu(this,Xh,"f")}get sessionId(){return iu(this,eu,"f")}}function nu(e){function t(){i?s.push(new Jh(n)):i=new su(n)}let i=null,s=[],n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=au(e);"m"===i.key&&(t(),n=[]),n.push(i)}})),t(),new ah(i,s)}function au(e){const t=oh(e,"=",1);return new _h(t[0],t[1])}function ou(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 s=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>zd(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[n,a]=i.fingerprint.split(" ",2),o=i.ssrc&&zd(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:a,setup:i.setup,hash:n},source:o,sourceGroups:s,mid:i.mid}}Xh=new WeakMap,eu=new WeakMap;var ru,lu=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class cu extends eh{constructor(e){super(e),this.negotiateThrottled=(0,mt.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 lu(this,void 0,void 0,(function*(){const{groupCall:n,description:a}=this,o=n.id,r=t.map((t=>{const i=function(e,t){const i=ou(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})),l=r.find((e=>"audio"===e.media.mediaType)),c=r.find((e=>"video"===e.media.mediaType));let{source:d,params:h}=l||{};const u=c||l,p={audio:l,video:c};if(a.entries.forEach((e=>{if("sendonly"===e.direction){const t=p[e.type];if(!t)return;a.setEntrySource(e,t.sourceGroups||t.source),a.setEntryPeerId(e,s.Z.myId)}})),h!==u.params){const e=JSON.parse(u.params.data);d?e.ssrc=d:delete e.ssrc,h={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(o,h,i),g=JSON.parse(m.params.data);return g.audio=g.audio||n.connections.main.description.audio,a.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,mo.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 lu(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=nu(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=function(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 uh(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(au("a=ssrc-group:SIM "+o.join(" ")));const l=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(au("a=ssrc-group:FID "+e+" "+i)),l.forEach((t=>{a.push(au("a=ssrc:"+e+" "+t))})),l.forEach((e=>{a.push(au("a=ssrc:"+i+" "+e))})))})),e.media[s]=new Jh(a)}})),!!t}(s)||n),(0,mo.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,l=(r.ids,o.toString()),c=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(l!==Wd(e.mediaType,void 0,c)){const o=ou(s,e);let l=Object.assign({},i);l.transport=(0,Fi.Z)(l.transport),l.transport.ufrag=o.ufrag,l.transport.pwd=o.pwd,l.transport.fingerprints=[o.fingerprint],l.transport.candidates=[];const c=new Yd(o.mid,r.type);c.setPort(r.port),o.source&&c.setSource(o.sourceGroups||o.source),c.setDirection(e.direction);const d=nu((new jd).addSsrcEntry(c,l).finalize()).media[0];a[t]=d,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 l=[],c=a.bundle;(0,mo.Z)(c,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),l.push(n))}));const d=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new Yd(i,e.mediaType),s.setDirection("inactive")),s})),h={type:"answer",sdp:t.generateSdp({bundle:c,entries:d,isAnswer:!0})};l.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,h.sdp),yield e.setRemoteDescription(h),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()}}!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"}(ru||(ru={}));const du=ru;var hu=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class uu extends Qd{constructor(e){super(),(0,x.Z)(this,e),this.log||(this.log=(0,he.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,mt.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===du.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return du.CLOSED;if("connected"===e||Je.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?du.MUTED:du.UNMUTED:du.MUTED_BY_ADMIN}return du.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!==du.UNMUTED}get isClosing(){const{state:e}=this;return e===du.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,k.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,k.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return hu(this,void 0,void 0,(function*(){return le.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(le.NM)))}changeUserMuted(e,t){return hu(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return le.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 cu(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 hu(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Rd(Fd()),i=new qd,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 hu(this,void 0,void 0,(function*(){const e={video:{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}};try{const t=yield Bd(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 hu(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&(Od(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 hu(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){let 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&&s.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return hu(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const s=e.pFlags.self;if(s&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const n=t.muted;void 0!==n&&e.pFlags.self&&(n?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),s&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(i=this.connections.main.sources.video)&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:i.sourceGroups,audio_source:undefined}),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}var i;return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,Bi.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=mu(0,"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 l=o?[]:function(e){var t,i;return[mu(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&mu(0,"audio",e.video.audio_source),e.video&&mu(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&mu(0,"audio",e.presentation.audio_source),e.presentation&&mu(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,l);const c=new Set;r.forEach((e=>{const t=e.source;if(!l.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),c.add(e.type))}})),l.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),c.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"}),c.add(t.type))})),c.size&&(c.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}var pu=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function mu(e,t,i,s){return Jd(t,i,s)}class gu extends L.Z{construct(e){this.managers=e,this.audioAsset=null!=Zd?Zd:Zd=new Ad(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,he.kg)("GCC"),s.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))})),s.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 pu(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:Dd(),video:t&&{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}},s=new qd(100);try{const t=yield Bd(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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n)}))}joinGroupCallInternal(e,t,i,n,a=!1,o){return pu(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);const l="main";let{currentGroupCall:c}=this;if(!c||!a){c=new uu({chatId:e,id:t,managers:this.managers}),c.fixSafariAudio(),c.addEventListener("state",(e=>{this.currentGroupCall===c&&e===du.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),s.Z.dispatchEvent("chat_update",c.chatId))})),c.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const d=c.createConnectionInstance({streamManager:i,type:l,options:{type:l,isMuted:n,joinVideo:o,rejoin:a}}),h=d.createPeerConnection();return h.addEventListener("negotiationneeded",(()=>{d.negotiate()})),h.addEventListener("track",(e=>{r("ontrack",e),c.onTrack(e)})),h.addEventListener("iceconnectionstatechange",(()=>{c.dispatchEvent("state",c.state);const{iceConnectionState:e}=h;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":c.hangUp();break;case"connected":c.joined||(c.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),d.createDescription(),d.createDataChannel(),d.appendStreamToConference(),this.setCurrentGroupCall(c),r("set currentGroupCall",t,c),this.startConnectingSound(),d.negotiate()}c.handleUpdateGroupCallParticipants=!1,c.updatingSdp=!1,r("update currentGroupCall",t,c)}))}}const vu=new gu;R.GO&&(R.GO.groupCallController=vu);const fu=vu;var yu=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class bu{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,a.Z)(e),(()=>{yu(this,void 0,void 0,(function*(){const e=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);t&&this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith((0,v.ag)(e));const i=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(i.map((e=>yu(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=>yu(this,void 0,void 0,(function*(){var t;if(!kd.Z||this.peerId.isUser())return!1;const i=fu.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.getChatTyped(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,Ri.Z)(n,"manage_call")})),this.verifyCallButton=e=>yu(this,void 0,void 0,(function*(){if(!pr.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 _d(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",d.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===d._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),Je.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{Je.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=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.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=""+e},this.setPeerStatusManual=(e=!1)=>yu(this,void 0,void 0,(function*(){if(!this.subtitle)return;const t=this.peerId;return this.chat.appImManager.setPeerStatus(t,this.subtitle,e,!1,(()=>t===this.peerId))})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{e&&e()})),this.listenerSetter=new I.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=E("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=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 Sd(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=fa({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,this.verifyButtons)),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(d.Z)("changeScreen",this.onChangeScreen),(0,n.fc)(this.container,(e=>{const t=(0,r.Z)(e.target,"pinned-container");if((0,Xn.Z)(),t){if((0,a.Z)(e),(0,r.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=vt.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else d.Z.activeScreen===d._.medium&&document.body.classList.contains(Vo)?o():(0,l.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(Vs)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const o=e=>{if(e&&(0,a.Z)(e),d.Z.activeScreen===d._.medium&&document.body.classList.contains(Vo))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);C.Z.back(e?"im":"chat")}};(0,n.fc)(this.btnBack,o,{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:()=>d.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>yu(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&s.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute(this.peerId)},verify:()=>yu(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&s.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1))}))},{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:()=>yu(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),Ci.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>yu(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),Mi((0,v.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(ps)){const e=this.appSidebarRight.createTab(ps);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>yu(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 Xi({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new _i("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new Nt({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:()=>yu(this,void 0,void 0,(function*(){return s.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"lock",text:"BlockUser",onClick:()=>{new _i("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new Nt({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&Ei({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>yu(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!==s.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&&Ei({langPackKey:"UserUnblocked"})}))},verify:()=>yu(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 as(this.peerId)},verify:()=>yu(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=E("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,n.fc)(e,(e=>{(0,a.Z)(e),!i&&(0,Xn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new km;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 Td(this,this.chat,this.managers),this.btnJoin=(0,M.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=E("phone"),this.btnGroupCall=E("videochat"),this.btnPinned=E("pinlist"),this.btnMute=E("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,(()=>yu(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,s.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(s.Z)("chat_update",(e=>yu(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(s.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(s.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(s.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(s.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.pinnedMessage&&this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();Ci.Z.getState().then((s=>{i()&&(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.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(s.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()}))}constructDiscussionHelpers(){this.pinnedMessage=new Td(this,this.chat,this.managers)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),this.chatAudio&&this.chatAudio.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){return yu(this,void 0,void 0,(function*(){const e=this.peerId;let t;this.avatarElement&&(t=this.constructAvatar());const[i,s,n,a,o,r,l]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,t?t.updateWithOptions({peerId:e}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),Ci.Z.getState()]);return()=>{var a;if(this.btnMute&&this.btnMute.classList.toggle("hide",!i),this.btnJoin&&(s?((0,g.Z)(this.btnJoin,(0,v.ag)(i?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(a=null==n?void 0:n.pFlags)||void 0===a?void 0:a.left))):this.btnJoin.classList.add("hide")),t&&(this.avatarElement.replaceWith(t),this.avatarElement=t),this.setUtilsWidth(),this.verifyButtons(),this.pinnedMessage)if("chat"===this.chat.type){if(this.chat.wasAlreadyUsed){const e=new Td(this,this.chat,this.managers);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}this.pinnedMessage.hidden=!!l.hiddenPinnedMessages[e]}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());o(),r&&r(),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return yu(this,void 0,void 0,(function*(){const t=this.peerId,i=()=>this.peerId===t;let n,a;if("pinned"===this.chat.type)n=void 0===e?(0,v.ag)("Loading"):(0,v.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!i())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,v.ag)(t===s.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const i=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,this.chat.threadId);if(i.cached){const t=yield i.result;e=t.count}else i.result.then((e=>this.setTitle(e.count)))}n=void 0===e?(0,v.ag)("Loading"):(0,v.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n,a]=yield Promise.all([Bs({peerId:t,dialog:!0}),fs(t)]),!i()))return;return()=>{(0,g.Z)(this.title,n),a&&this.title.append(...a)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return yu(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId;let t=yield this.managers.appNotificationsManager.isPeerLocalMuted(e,!1);(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"}))}}class wu extends P{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new w("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=E("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new y(e,this.inputSearch,{messages:new f("Chat.Search.PrivateSearch","messages")})}open(e,t,i,s){const a=super.open();return 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,n.fc)(this.btnPickDate,(()=>{A.Z.createPopup(Xo,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),Ws.toggleSidebar(!0)),a}}class Su{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,a.Z)(e),A.Z.createPopup(Xo,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,l.Z)(e.target,jm);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,a.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,a.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,we.Z)(this.backBtn);const s=this.listenerSetter=new I.Z,o=(e,t)=>{(0,n.fc)(e,t,{listenerSetter:s})};o(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new w("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new f(!1,"messages",void 0,"",!1),o(this.searchGroup.list,this.onResultsClick),this.appSearch=new y(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,g.Z)(this.foundCountEl,this.inputSearch.value?(0,v.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"),o(this.footer,this.onFooterClick),(0,we.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"),o(this.dateBtn,this.onDateClick),o(this.upBtn,this.onUpClick),o(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),Je.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},C.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,C.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,Dn.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(t,i);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,g.Z)(this.foundCountEl,(0,v.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}class Cu{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,es.Z)(t.options,e)));return t||(t=new Cu,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.img=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=Ze(t,e,!1).then((()=>t))}cleanup(e){this.canvases.delete(e),this.canvases.size||((0,k.Z)(Cu.INSTANCES,this),this.objectUrl&&URL.revokeObjectURL(this.objectUrl))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.img;let a=n.width,o=n.height,r=1480*e.dpr;+e.dataset.originalHeight!==s&&(r*=.875),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 l=e=>{for(let s=0;s0){let e=c;do{l(e-=o)}while(e>=0)}const d=s-1;for(let e=c+o;ei.resize(e,t))))}}Cu.INSTANCES=[];var Lu=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Iu extends L.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",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,he.kg)("CHAT",he.v9.Log|he.v9.Warn|he.v9.Debug|he.v9.Error),this.peerId=le.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){const i=Ya.Z.getTheme();let n;if(i.background.color&&!i.background.slug&&!i.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=i.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const a=++this.backgroundTempId,o=this.gradientRenderer,r=this.patternRenderer,l=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const c=i.background.intensity&&i.background.intensity/100,d=!!c&&c<0;let h,u,p,m=null==n?void 0:n.firstElementChild;if(!n)if(n=document.createElement("div"),n.classList.add("chat-background-item"),e)if(c){n.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=Cu.getInstance({url:e,width:t.width,height:t.height,mask:d}),m=this.patternCanvas=h.createCanvas(),m.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),d&&n.classList.add("is-dark")}else i.background.slug&&n.classList.add("is-image");else i.background.color&&n.classList.add("is-color");const g=i.background.color;if(g){const{canvas:e,gradientRenderer:t}=Qa.create(g);p=this.gradientRenderer=t,u=this.gradientCanvas=e,u.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),s.Z.settings.animationsEnabled&&p.scrollAnimate(!0)}h&&(d?u:m).style.setProperty("--opacity-max",""+Math.abs(c));const v=new Promise((i=>{const s=()=>{if(this.backgroundTempId!==a)return h&&h.cleanup(m),void(p&&p.cleanup());const e=this.backgroundEl.lastElementChild;if(e===n)return void i();const s=[u,m].filter(Boolean);s.length&&n.append(...s),this.backgroundEl.append(n),Re(n,"is-visible",!0,t?0:200,e?()=>{r&&r.cleanup(l),o&&o.cleanup(),e.remove()}:null,2),i()};h?h.renderToCanvas(m).then((()=>{if(this.backgroundTempId!==a)return;let e;e=Promise.resolve(),e.then(s)})):e?Ae(n,e,s):s()}));return this.setBackgroundPromise=Promise.race([(0,fr.Z)(500),v])}setType(e){this.type=e}init(){this.topbar=new bu(this,Ws,this.managers),this.bubbles=new ic(this,this.managers),this.input=new fd(this,this.appImManager,this.managers),this.contextMenu=new vc(this,this.managers),this.selection=new oa(this,this.bubbles,this.input,this.managers),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),"scheduled"===this.type||mi.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)})),this.bubbles.listenerSetter.add(s.Z)("dialog_drop",(e=>{e.peerId===this.peerId&&this.appImManager.setPeer()}))}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.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()}onChangePeer(e){return Lu(this,void 0,void 0,(function*(){const{peerId:t}=this,i=Ws.getTab(wu);i&&i.close();const[s,n,a,o,r]=yield e(Promise.all([this.managers.appPeersManager.noForwards(t),this.managers.appPeersManager.isRestricted(t),this._isAnyGroup(t),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(t)]));this.noForwards=s,this.isRestricted=n,this.isAnyGroup=a,this.isMegagroup=r,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=Ws.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(t,this.threadId),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e,t,i){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.peerId===e;if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=e||le.NM,this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`;if(!e)return Ws.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer(!1,e),this.appImManager.dispatchEvent("peer_changed",e),Ws.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(s,e,t,i),a=this.setPeerPromise=n.then((e=>e.promise)).catch(ft.Z).finally((()=>{this.setPeerPromise===a&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){(0,k.Z)(this.sharedMediaTabs,e),e.destroy()}setAutoDownloadMedia(){return Lu(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,a=function*(){let t,i=0,n=0,a=0;const o=s.Z.settings,r=s.Z.managers.appPeersManager;return!o.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield r.isContact(e))?"contacts":"private":(yield r.isBroadcast(e))?"channels":"groups",o.autoDownload.photo[t]&&(i=o.autoDownloadNew.photo_size_max),o.autoDownload.video[t]&&(n=o.autoDownloadNew.video_size_max),o.autoDownload.file[t]&&(a=o.autoDownloadNew.file_size_max)),{photo:i,video:n,file:a}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(t,i||[])).next())}));var t,i,n,a}(this.peerId)}))}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,i,s){return Lu(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;n.loadSidebarMedia(!0);const a=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s)]),[o]=yield Promise.all([a,n.fillProfileElements()]);i()&&(o.forEach((e=>{e()})),Ws.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",t))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return Lu(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:cr.Z.fromJSON(e.historySerialized)})))}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return Lu(this,void 0,void 0,(function*(){return e===s.Z.myId||e===le.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(d.Z.isMobile)this.search?this.search.setQuery(e):this.search=new Su(this.topbar,this,e);else{let t=Ws.getTab(wu);t||(t=Ws.createTab(wu)),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,sendSilent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===s.Z.myId||e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return this.isOurMessage(e)&&(!t||this.peerId!==s.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}}var Mu=i(6637);class Eu{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,mi.Z){if(e&&(0,a.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=E(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,a.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,n.fc)(i,(e=>{(0,a.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=E("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,v.$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,da.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,a.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=E("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"),o=document.createElement("span"),r=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),o.classList.add("markup-tooltip-delimiter"),r.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(r,this.linkApplyButton),t.append(this.linkBackButton,o,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,a.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,Mu.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,da.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,C.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=function(){const e=[],t=window.getSelection();for(let i=0;i!!e))}(),t=[...new Set(e.map((e=>e.parentNode)))],i=new Set;return t.forEach((e=>{for(const t in Hc.o){const s=Hc.o[t];e.closest(s.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&i.add(this.buttons[t])}})),[...i]}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=mr(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,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=(0,Me.Z)(e.left,l,c)}else{const e=s.left+(s.width-o.width)/2;d=(0,Me.Z)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),ac())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"),Je.IS_MOBILE||C.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){mi.Z&&!Je.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,a.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(ac(i))this.hide();else if(mi.Z)if(Je.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()})))}}function Pu(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function Tu(e,t,i,s,n,a,o,r){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-a)),a>0&&l.push("A"+Pu(a,a,0,0,1,e+i,t+a)),l.push("V"+(t+s-o)),o>0&&l.push("A"+Pu(o,o,0,0,1,e+i-o,t+s)),l.push("H"+(e+r)),r>0&&l.push("A"+Pu(r,r,0,0,1,e+0,t+s-r)),l.push("V"+(t+n)),n>0&&l.push("A"+Pu(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}R.GO.generatePathData=Tu;class ku{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,v.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,v.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=Tu(5,5,e.width-t,e.height-t,t,t,t,t);this.path.setAttributeNS(null,"d",i)}}var xu=i(7922);function _u(e){e.forEach((e=>e.classList.add("no-transition"))),(0,Be.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var Au=i(490),Zu=i(5228);class Du{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 l=n.getContext("2d");l.beginPath(),l.moveTo(i,s),l.lineTo(e,s);const{radius:c,radiusNext:d,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(c[n]*(1-i)+d[n]*i))*r+o*(1-r);l.lineTo(e,s)}else{const a=this.progress[n-1],u=c[n-1]*(1-a)+d[n-1]*a,p=this.progress[n],m=(i-e)/h*(n-1),g=(i-e)/h*n,v=m+(g-m)/2,f=(t-u)*r+o*(1-r),y=(t-(c[n]*(1-p)+d[n]*p))*r+o*(1-r);l.bezierCurveTo(v,f,v,y,g,y),n===h&&l.lineTo(i,s)}a(l),l.fill(),l.closePath()}}}class Fu{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=Fu.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===du.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===du.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===du.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===du.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class Ru{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:l,currentState:c,previousState:d,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let m=Date.now()-this.lastUpdateTime;m>20&&(m=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*m,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:g,amplitude2:v,progressToState:f}=this,y=6*v*n,b=6*v*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*g)*n,i.minRadius=0,i.maxRadius=(3+9*g)*n,s.minRadius=0,s.maxRadius=(3+9*g)*n,t.update(g,.3),i.update(g,.7),s.update(g,.7);for(let e=0;e<2;e++){if(0===e&&!d)continue;let n=1,h=null;0===e?(n=1-f,h=d):(n=d?f:1,c.update(l-o,r-a,m,g),h=c);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},v=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};i.draw(a,o-y,r,l,p,u,o,1),s.draw(a,o-b,r,l,p,u,o,1),t.draw(a,o,r,l,p,v,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([[du.UNMUTED,new Fu(du.UNMUTED)],[du.MUTED,new Fu(du.MUTED)],[du.MUTED_BY_ADMIN,new Fu(du.MUTED_BY_ADMIN)],[du.CONNECTING,new Fu(du.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(du.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 Du(3),this.lbd1=new Du(7),this.lbd2=new Du(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}}const Bu=new class{constructor(){this.cache={},s.Z.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(let 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)}},Nu=Bu;class Uu{constructor(e,t){this.item=e,(0,x.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class Ou{constructor(e,t){this.icon=e,this.autoplay=!1,(0,x.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=ri.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=>ri.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 Uu(this,e)}getPart(e){return e instanceof Uu?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 Hu{constructor(e){(0,x.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(ft.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Ou(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 n=e.getPart(t);e.player.playPart({from:s.Z.settings.animationsEnabled&&!this.skipAnimation?n.startFrame:n.endFrame,to:n.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 zu extends Hu{constructor(e){super({width:e.width,height:e.height}),(0,x.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(ft.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 Gu extends zu{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=vp;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 Vu=i(6733);class Ku extends zu{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=gp;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=gp;let i,s;switch(e){case t.HAND:s="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:s=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:s="green"}const n=Nu.getProperty("gc-"+s+"-text-color");return i=(0,an.oo)(n),i}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=Hu.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=gp;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const Wu="group-call-participant-status";class ju{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(Wu+"-container")}setState(e,t){const i=gp,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(Wu+"-icon",Wu+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,v.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,v.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,v.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,c.Z)(this.container,(0,Zt.Z)(t.about));n=(0,v.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(Wu,a),o.append(...s,n),(0,g.Z)(this.container,o)}}var $u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class qu extends Bn{constructor(e){super({getIndex:e=>$u(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=>$u(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=fp(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{Fn(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=Jm.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});t.listEl.classList.add("group-call-participant");const i=new Ku(!0),s=new ju(["presentation","video"]);return(0,g.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:Be.T2}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=Jm.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}class Qu extends L.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,x.Z)(this,e);const{listenerSetter:t,element:i}=this;mi.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,r.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,r.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)}}function Yu(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,ht.jt)((()=>(s(),t.isConnected))),s(),t}const Ju="group-call-participant-video";class Xu{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add(Ju+"-container"),this.info=document.createElement("div"),this.info.classList.add(Ju+"-info"),this.left=document.createElement("div"),this.left.classList.add(Ju+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(Ju+"-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(Ju+"-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,v.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new Nt({peerId:(0,Bi.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new Ku(!1),this.groupCallParticipantStatus=new ju([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add(Ju,"call-video"),i.paused&&i.play();const n=Yu(i);n.classList.add(Ju+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=fp(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class ep extends Qu{constructor(e){super(),(0,x.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(s.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,n.fc)(this.container,(e=>{const t=(0,r.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,Bi.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 Xu(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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var tp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ip{constructor(e){this.onOpenProfileClick=()=>{const e=A.Z.getPopups(wp)[0];e&&e.hide(),mm.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:()=>tp(this,void 0,void 0,(function*(){Wa({peerId:this.targetPeerId,title:new Nt({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new Nt({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),ft.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=$n(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Gn(e.onContextElement,(e=>tp(this,void 0,void 0,(function*(){const t=(0,r.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,a.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 Ki(this.buttons,(e=>tp(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),ua(e.touches?e.touches[0]:e,this.element,"right"),xs.openBtnMenu(this.element))}))),t),t.add(s.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,Bi.Z)(t.peer);this.targetPeerId===e&&xs.closeBtnMenu()}}));let i=document.body;(0,Vu.Ms)(document.body,(()=>{const e=(0,Vu.rB)();i=e?A.Z.getPopups(wp)[0].getContainer():document.body,e||xs.closeBtnMenu()}),t)}}class sp{constructor(e){(0,x.Z)(this,e);const t="group-call-participants",i=new m.ZP(void 0);i.container.classList.add(t+"-scrollable");const n=this.container=document.createElement("div");n.classList.add(t);const a=this.sortedList=new qu(this.instance),{instance:o,listenerSetter:r}=this;this.contextMenu=new ip(Object.assign(Object.assign({},e),{onContextElement:a.list,listenerSetter:r,instance:o})),this.groupCallParticipantsVideo=new ep(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(a.list),n.append(i.container),e.appendTo.append(n),r.add(s.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Di({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(o)}updateParticipant(e){const t=(0,Bi.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 tp(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class np{constructor(e){this.appendTo=e,this.descriptionIntl=new v.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===du.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 ap{constructor(e){this.appendTo=e,this.peerTitle=new Nt({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,c.Z)(i,(0,Zt.Z)(s.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var op=i(2820);function rp(e,t,i){const s=e+"-button",a=document.createElement("div");a.classList.add(s,"call-button","rp-overflow"),i.icon&&a.classList.add("tgico-"+i.icon),i.noRipple||(0,we.Z)(a),i.isDanger&&a.classList.add(s+"-red"),i.isConfirm&&a.classList.add(s+"-green"),i.callback&&(0,n.fc)(a,i.callback,{listenerSetter:t});let o=a;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,v.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(a,t),o=e}return o}const lp="movable-element",cp="movable-element-resize-handler";class dp extends L.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,x.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(lp),this.addResizeHandlers(),this.setSwipeHandler(),d.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(lp),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){d.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(cp,cp+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new Ds({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,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")?zi.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")?zi.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,r.Z)(t,cp);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=zi.height/2-this.height/2,this.left=zi.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Me.Z)(this.width,this.minWidth,zi.width),this.height=(0,Me.Z)(this.height,this.minHeight,zi.height)}fixPosition(){this.top=(0,Me.Z)(this.top,0,zi.height-this.height),this.left=(0,Me.Z)(this.left,0,zi.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 hp,up=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 pp{constructor(e){hp.set(this,void 0),(0,x.Z)(this,e),this.toggleMovable(!mi.Z),this.listenerSetter.add(d.Z)("changeScreen",((e,t)=>{t!==d._.mobile&&e!==d._.mobile||this.toggleMovable(!mi.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,hp,"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=up(this,hp,new dp(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(),up(this,hp,void 0,"f")}}}function mp(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>mp(e,t,!i)}hp=new WeakMap;var gp,vp;function fp(e){const t=gp;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"}(gp||(gp={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(vp||(vp={}));let yp={width:420,height:640};const bp="group-call";class wp extends A.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,Vu.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=mp.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 _i("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{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,Vu.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,s=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!==s&&(p.Z.checkAnimations(e),Ya.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,Vu.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(bp,"night");const e=this.instance=fu.groupCall,{listenerSetter:t}=this;if(!Je.IS_APPLE_MOBILE){const e=this.btnFullScreen=E("fullscreen"),i=this.btnFullScreen2=E("fullscreen group-call-cfs"),s=this.btnExitFullScreen=E("smallscreen");(0,n.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,n.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,n.fc)(s,(()=>{(0,Vu.C8)()}),{listenerSetter:t}),(0,Vu.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=E("adduser");const i=this.btnShowColumn=E("rightpanel group-call-only-big");(0,n.fc)(i,this.toggleRightColumn,{listenerSetter:t});const a=document.createElement("div");a.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),a.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,a,this.btnFullScreen,i].filter(Boolean));const l=this.header.cloneNode(!1),c=a.cloneNode(!1),d=this.title.cloneNode(!1);c.append(d);const h=E("rightpanel");l.append(...[h,c,this.btnFullScreen2].filter(Boolean)),(0,n.fc)(h,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(l);const u=new m.ZP(void 0);u.container.classList.add("group-call-big-video-container"),this.container.append(u.container),this.groupCallTitle=new ap(this.title),this.groupCallDescription=new np(o),this.groupCallBodyHeaderDescription=new np(d),this.constructButtons(),this.groupCallParticipantsVideo=new ep({appendTo:u.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new sp({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new pp({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,r.Z)(t,"chatlist")||(0,r.Z)(t,"group-call-button")||(0,r.Z)(t,"btn-icon")||(0,r.Z)(t,"group-call-participants-video-container")||(0,Vu.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:yp}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(s.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;yp=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("group-call-buttons");const t=rp.bind(null,bp,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",!op.Z);const n=t({noRipple:!0,callback:(0,mt.Z)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new Gu;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!op.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===du.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Vu.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=vp;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===vp.HAND?"hand":i===vp.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 Sp;!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"}(Sp||(Sp={}));const Cp=Sp;class Lp{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===Cp.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=gt(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case Cp.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case Cp.REQUESTING:s="Call.StatusRequesting";break;case Cp.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case Cp.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,v.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===Cp.CONNECTED),(0,g.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class Ip extends zu{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 Mp="call",Ep={width:400,height:580};let Pp=Object.assign({},Ep);class Tp extends A.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,Vu.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,Vu.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,s=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!==s&&(p.Z.checkAnimations(e),Ya.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(Mp,"night");const s=document.createElement("div");s.classList.add("call-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new km;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),s.append(o);const l=new Nt({peerId:a}).element;l.classList.add("call-title");const c=document.createElement("div");c.classList.add("call-subtitle"),this.description=new Lp(c);const d=this.emojisSubtitle=document.createElement("div");d.classList.add("call-emojis"),t.append(s,l,c),Je.IS_MOBILE?this.header.append(d):(this.btnFullScreen=E("fullscreen"),this.btnExitFullScreen=E("smallscreen hide"),(0,n.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,n.fc)(this.btnExitFullScreen,(()=>(0,Vu.C8)()),{listenerSetter:i}),(0,Vu.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(d)),this.partyStates=document.createElement("div"),this.partyStates.classList.add("call-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add("call-party-state");const h=(0,v.ag)("VoipUserMicrophoneIsOff",[new Nt({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);h.classList.add("call-party-state-text");const u=new Ip(!1,!0);u.setState(!1,!1),this.partyMutedState.append(u.container,h),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=rp.bind(null,Mp,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new pp({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,r.Z)(t,"call-button")||(0,r.Z)(t,"btn-icon")||(0,Vu.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Pp:Object.assign({},Ep)});const m=this.movablePanel.movable;m&&this.listenerSetter.add(m)("resize",(()=>{this.resizeVideoContainers()}));const g=this.controlsHover=new Qu;g.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),g.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Pp=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-first");const t=mp.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)}});op.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new v.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Ip(!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("call-buttons","is-second"),this.declineI18nElement=new v.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=document.createElement("div");t.classList.add("call-video-container"),e.classList.add("call-video"),e.paused&&e.play(),(0,n.fc)(t,(()=>{if(!t.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=t.style.cssText,t.classList.remove("small"),t.style.cssText="",this.resizeVideoContainers()}));const i=Yu(e);return i.classList.add("call-video-blur"),t.append(i,e),t}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===Cp.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Vu.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===Cp.PENDING;this.declineI18nElement.compareAndUpdate({key:t===Cp.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 l=e.getMediaState("output");Re(this.partyMutedState,"is-visible",!!(null==l?void 0:l.muted),300);const c=this.videoContainers,d=Object.assign({},c);["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,pt.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=c[t];a&&s&&!o&&(o=c[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete c[t])}));{const e=c.input,t=c.output;Object.keys(d).length!==Object.keys(c).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(c).length),!this.emojisSubtitle.textContent&&t{(0,g.Z)(this.emojisSubtitle,(0,Zt.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,Vu.rB)()?65535:a?i.height:i.width),l=a?t.videoWidth/t.videoHeight:1,c=a?1:t.videoHeight/t.videoWidth;e.style.width=r*l+"px",e.style.height=r*c+"px",e.style.maxWidth=o*l+"px",e.style.maxHeight=o*c+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}function kp(e){const t=ou(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=ou(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 l=new Map,c=e=>{let t=l.get(e);return t||l.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=c(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;c(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=c(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(l.values())}return i}class xp extends eh{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=kp(nu(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}let _p;var Ap=i(4484),Zp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Dp=45e3;class Fp extends L.Z{construct(e){this.managers=e,this.log=(0,he.kg)("CC"),pr.Z&&(this.audioAsset=null!=_p?_p:_p=new Ad(["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=[],s.Z.addEventListener("call_update",(e=>Zp(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(Cp.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(Dp,"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 Ci.Z.invokeCrypto("sha256",t);if(!(0,Ap.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}}})))),s.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 Xp(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===Cp.CLOSED?(this.instances.delete(t.id),(0,k.Z)(this.sortedInstances,t)):(0,Rn.Z)(this.sortedInstances,t,"sortIndex"),e===Cp.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===Cp.EXCHANGING_KEYS||e===Cp.CONNECTING&&s?t.setHangUpTimeout(Dp,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===Cp.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===Cp.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===Cp.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===Cp.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 Zp(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(Cp.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:le.NM,date:(0,nl.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>Zp(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(Cp.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(Dp,"phoneCallDiscardReasonHangup")}))}))}}const Rp=new Fp;R.GO&&(R.GO.callsController=Rp);const Bp=Rp;var Np=i(4903);const Up="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var Op=i(3692),Hp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class zp{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,Np.Z)(...e),Up.digest("SHA-256",(0,Op.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return Hp(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 Hp(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 Hp(this,void 0,void 0,(function*(){const t=yield Up.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield Up[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,l=yield this.prepareAesKeyIv(n,a,s),c=yield this.aesProcessCtr(o,r,l,!1),d=yield this.concatSHA256([n.subarray(88+s,88+s+32),c]);if(this.constTimeIsDifferent(d.subarray(8),a,16))return;const h=new DataView(c.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),c.slice(4))}))}}class Gp{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 Hd;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 l="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",$p(c)),s&&r.add(`a=msid:${l} audio${s}`),r.add("a=rtcp-mux",qp(a),Qp(i,s,n,l));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",$p(c)),s&&r.add(`a=msid:${l} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",qp(a),Qp(i,s,n,l))}}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 Hd;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 l="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",$p(c)),s&&r.add(`a=msid:${l} audio${s}`),r.add("a=rtcp-mux",qp(a),Qp(i,s,n,l));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",$p(c)),s&&r.add(`a=msid:${l} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",qp(a),Qp(i,s,n,l))}}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 Vp{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 l="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+=$p(c),r+="\na=rtcp-mux",r+=qp(a),r+=Qp(i,s,n,l);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+=$p(c),r+="\na=rtcp-mux\na=rtcp-rsize",r+=qp(a),r+=Qp(i,s,n,l)}}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 l="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+=$p(h),r+="\na=rtcp-mux",r+=qp(c),r+=Qp(i,n,a,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${c.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=$p(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=qp(c),r+=Qp(i,n,a,l)}}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 Kp{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 l="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+=$p(c),s&&(r+=`\na=msid:${l} audio${s}`),r+="\na=rtcp-mux",r+=qp(a),r+=Qp(i,s,n,l);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+=$p(c),s&&(r+=`\na=msid:${l} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=qp(a),r+=Qp(i,s,n,l)}}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 l="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+=$p(c),s&&(r+=`\na=msid:${l} audio${s}`),r+="\na=rtcp-mux",r+=qp(a),r+=Qp(i,s,n,l);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+=$p(c),s&&(r+=`\na=msid:${l} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=qp(a),r+=Qp(i,s,n,l)}}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 Wp(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function jp(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function $p(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),c){const e=[];Object.getOwnPropertyNames(c).forEach((t=>{e.push(`${t}=${c[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function Qp(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 Yp{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:l,type:c,relAddress:d,generation:h,tcpType:u,networkId:p,networkCost:m,username:g}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return Wp()?Vp.generateOffer(e):jp()?Kp.generateOffer(e):Gp.generateOffer(e)}static generateAnswer(e){return Wp()?Vp.generateAnswer(e):jp()?Kp.generateAnswer(e):Gp.generateAnswer(e)}}var Jp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Xp extends Qd{constructor(e){super(),this.log=(0,he.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,x.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",Cp[e]),e===Cp.CLOSED&&this.cleanup()}));const t=this.streamManager=new qd(100);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,Pi.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?Cp.CLOSED:"connected"===e||Je.IS_SAFARI&&"completed"===e?Cp.CONNECTED:Cp.CONNECTING}return Cp.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(Cp.CLOSED-e+1);return t+=2147483647e3-(e===Cp.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 Jp(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 Jp(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return Jp(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 Jp(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&&(Od(s),t.appendToConference(i))}))}toggleVideoSharing(){return Jp(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===Cp.CLOSING||e===Cp.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=ro.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 Jp(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(Cp.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=>Jp(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=>Jp(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 xp({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===Cp.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 zp(e,t),this.decryptor=new zp(!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 Jp(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,...l]=e.split(" "),c={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,ci.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return Jp(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;let s=i.entries.map((e=>e.mid));const 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=kp(nu(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 Jp(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(Cp.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 Jp(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))})));[Jd("audio",+e.audio.ssrc),e.video?Jd("video",s(e.video.ssrcGroups)):void 0,e.screencast?Jd("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 Yd(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;let a=i.entries.map((e=>e.mid));const 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=Yp.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 Jp(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 Jp(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 Jp(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"),Bp.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}class em{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new I.Z;t.add(Bp)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(Bp)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(fu)("instance",(e=>{this.updateInstance(e)})),t.add(s.Z)("group_call_update",(e=>{const t=fu.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(qd.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 I.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof uu?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof uu)));const i=this.instance.isMuted;let s=e instanceof uu?e.state:function(e,t){switch(e){case Cp.CLOSING:case Cp.CLOSED:return du.CLOSED;case Cp.CONNECTED:return t?du.MUTED:du.UNMUTED;default:return du.CONNECTING}}(e.connectionState,i);const{weave:n}=this;n.componentDidMount();const a=s===du.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),Re(document.body,"is-calling",!a,250,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 uu)return this.groupCallTitle.update(e);(0,g.Z)(this.center,new Nt({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const i=document.createElement("div");i.classList.add("topbar-call-left");const s=this.groupCallMicrophoneIconMini=new Ip,o=E();o.append(s.container),i.append(o);const r=(0,mt.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,n.fc)(o,(e=>{(0,a.Z)(e),r()}),{listenerSetter:e});const l=this.center=document.createElement("div");l.classList.add("topbar-call-center"),this.groupCallTitle=new ap(l),this.groupCallDescription=new np(i),this.callDescription=new Lp(i);const c=document.createElement("div");c.classList.add("topbar-call-right");const d=E("endcall_filled");c.append(d),(0,n.fc)(d,(e=>{(0,a.Z)(e);const{instance:t}=this;t&&(t instanceof uu?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,n.fc)(t,(()=>{if(this.instance instanceof uu){if(A.Z.getPopups(wp).length)return;(new wp).show()}else if(this.instance instanceof Xp){if(A.Z.getPopups(Tp).find((e=>e.getCallInstance()===this.instance)))return;new Tp(this.instance).show()}}),{listenerSetter:e}),t.append(i,l,c);const h=this.weave=new Ru,u=h.render("topbar-call-weave");t.prepend(u),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var tm=i(6009),im=i(6702),sm=i(1722),nm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const am=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=di.Z,this.faviconEl=document.head.querySelector('link[rel="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&&im.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?im.default.subscribe():im.default.unsubscribe())}im.default.setSettings(this.settings)})),Ci.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,Oe.Z)(),Au.Z.addEventListener("deactivated",(()=>{this.stop()})),Au.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),Cr.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),s.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),s.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&s.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),im.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):im.default.subscribe()})),im.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),im.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),s.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),im.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((()=>nm(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))||mm.setInnerPeer({peerId:t,lastMsgId:(0,Sr.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return nm(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},r=yield this.managers.appPeersManager.getPeerString(n);let l;if(s.show_previews){if("message"===e._&&e.fwd_from&&t>1)l=v.ZP.format("Notifications.Forwarded",!0,[t]);else if(l=yield In(e,void 0,void 0,!0),i){const e="Notification.Contact.Reacted",t=[(0,Pr.Z)(i.reaction),l];l=v.ZP.format(e,!0,t)}}else l=v.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const c=i?(0,Bi.Z)(i.peer_id):e.fromId;o.title=yield(0,Rt.Z)(n,!0,void 0,void 0,this.managers),a&&c!==e.peerId&&(o.title=(yield(0,Rt.Z)(c,!0,void 0,void 0,this.managers))+" @ "+o.title),o.title=(0,Yt.Z)(o.title),o.onclick=()=>{mm.setInnerPeer({peerId:n,lastMsgId:e.mid})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const d=yield this.managers.appPeersManager.getPeerPhoto(n);d?this.managers.appAvatarsManager.loadAvatar(n,d,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=Cr.Z.isIdle){if(Je.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=v.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 ${yt}`,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="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}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,nl.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(let 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 im.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),sm.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,Je.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,nl.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,im.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),s.Z.addEventListener("settings_updated",this.updateLocalSettings),im.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,es.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}))}};R.GO&&(R.GO.uiNotificationsManager=am);const om=am;var rm=i(8576),lm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function cm(e,t=!1){return lm(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>lm(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>lm(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{const t=location.hash;e||C.Z.replaceState();const i=t.split("?"),s=this.parseUriParams(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr){const{onclick:e}=(0,bn.Z)(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else{"#/im"!==i[0]&&(s.p=i[0].slice(1));{const e=s.p;let t=void 0!==s.post?(0,Sr.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=()=>{document.documentElement.style.setProperty("--messages-text-size",s.Z.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!s.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",s.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Pi.Z)((()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),s.Z.settings.animationsEnabled?250:0,!1,!0),ri.Z.setLoop(s.Z.settings.stickers.loop),p.Z.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();v.ZP.setTimeFormat(s.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>dm(this,void 0,void 0,(function*(){const i=kc();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,a.Z)(e)}const s=yield cm(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(o.Z.has(s[0].type)?"media":"document"),A.Z.createPopup(xc,this.chat,s,e.willAttachType)}}))}get myId(){return s.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(v.ZP.lastRequestedLangCode),vt.Z.construct(e),om.construct(e),this.log=(0,he.kg)("IM",he.v9.Log|he.v9.Warn|he.v9.Debug|he.v9.Error),this.backgroundPromises={},eo.h.settings.themes.forEach((e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg"+(Je.IS_FIREFOX?"?1":"");this.backgroundPromises[e.background.slug]=Promise.resolve(t)}})),this.selectTab(0),Cr.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(d.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),C.Z.onHashChange=this.onHashChange,this.setSettings(),s.Z.addEventListener("settings_updated",this.setSettings),(0,He.ZP)((()=>{p.Z.setOnlyOnePlayableGroup("lock"),p.Z.checkAnimations(!0)}),(()=>{p.Z.setOnlyOnePlayableGroup(""),p.Z.checkAnimations(!1)})),Je.IS_FIREFOX&&Ci.Z.oldVersion&&-1===(0,tm.Z)(Ci.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),d.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(Vo)&&document.body.classList.contains(Vs)&&Ws.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),d.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();Cu.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),s.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),s.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),s.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||Lr.Z.isOverlayActive||d.Z.activeScreen===d._.mobile&&1!==this.tabId)return;const a=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==a?void 0:a.action)||void 0===i?void 0:i._)){const t=a.action,i=s.bubbles.bubbles[(0,Sr.Z)(a.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&i.classList.contains("sticker")&&mr(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,n.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const i=e=>{const t="version"===e,i=new A.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,v.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,v.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{sm.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),Au.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};Au.Z.addEventListener("deactivated",i),Au.Z.deactivatedReason&&i(Au.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),s.Z.addEventListener("service_notification",(e=>{Wa({button:{langKey:"OK",isCancel:!0},description:(0,ei.Z)(e.message)})})),s.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>dm(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;Ei({langPackKey:"PaymentInfoHint",langPackArguments:[yn(n.total_amount,n.currency),(0,Zt.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,r.Z)(e.target,"spoiler"),i=(0,r.Z)(t,"message")||t.parentElement,s="is-spoiler-visible",o=i.classList.contains(s);o||((0,a.Z)(e),"click"!==n.pf&&window.addEventListener("click",a.Z,{capture:!0,once:!0}));const l=o?0:2;l&&i.classList.add("will-change");const c=i.dataset.spoilerTimeout;null!==c&&(clearTimeout(+c),delete i.dataset.spoilerTimeout),Re(i,s,!0,200,(()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{Re(i,s,!1,200,(()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}))}),5e3)}),l)},Ci.Z.addEventListener("notificationBuild",(e=>{(this.chat.peerId!==e.message.peerId||Cr.Z.isIdle)&&om.buildNotification(e)})),this.addEventListener("peer_changed",(e=>dm(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.overrideHash(e),Ci.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),xu.Z.setToCache("chatPositions",{}),(pr.Z||kd.Z)&&(this.topbarCall=new em(e)),pr.Z&&(Bp.addEventListener("instance",(({instance:e})=>{const t=new Tp(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(Bp.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=Bp.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),Bp.addEventListener("incompatible",(e=>{Ei({langPackKey:"VoipPeerIncompatible",langPackArguments:[new Nt({peerId:e.toPeerId()}).element]})}))),Au.Z.activateInstance();const o=()=>{Zu.default.setAuthorized(!0)};setInterval(o,U),o(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new _i("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:gr.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:gr.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),kd.Z&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(gr.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>dm(this,void 0,void 0,(function*(){let i;i=Ta.kO.test(e[0])?{_:gr.USER_PHONE_NUMBER,phone:e[0].slice(1)}:"c"===e[0]?{_:gr.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:gr.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(i)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;e.phone?t=this.makeLink(gr.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(t=this.makeLink(gr.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(gr.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(gr.STICKER_SET,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(gr.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener()}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(s.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===d._.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;if(Lr.Z.isOverlayActive||e.has(s))return;const n=t.target,o=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===n.tagName){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(o.input.editMsgId||!o.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(o.peerId,o.threadId).then((e=>{e&&(o.input.initMessageEditing(e.mid),(0,a.Z)(t))}))}else if("ArrowDown"===s)return}else(0,a.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,Jm.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==o?void 0:o.input)||void 0===i?void 0:i.messageInput)&&t.target!==o.input.messageInput&&"INPUT"!==n.tagName&&!n.hasAttribute("contenteditable")&&!mi.Z&&(!d.Z.isMobile||1===this.tabId)&&!o.selection.isSelecting&&!o.input.recording){o.input.messageInput.focus(),(0,sl.Z)(o.input.messageInput);const e=new KeyboardEvent(t.type,t);o.input.messageInput.dispatchEvent(e)}}}))}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return dm(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case gr.MESSAGE:{const t=e.post?(0,Sr.Z)(+e.post):void 0,i=e.comment?(0,Sr.Z)(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start});break}case gr.PRIVATE_POST:{const t=e.channel.toChatId(),i=t.toPeerId(!0);if((yield this.managers.appChatsManager.getChat(t)).deleted)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw Ei({langPackKey:"LinkNotFound"}),e}const s=(0,Sr.Z)(+e.post),n=e.thread?(0,Sr.Z)(+e.thread):void 0;n?this.openThread(i,s,n):this.setInnerPeer({peerId:i,lastMsgId:s,threadId:n});break}case gr.STICKER_SET:new oo({id:e.set}).show();break;case gr.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new vr(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&Mi((0,v.ag)("InviteExpired"))}));break;case gr.VOICE_CHAT:kd.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case gr.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&&Ei({langPackKey:"Alert.UserDoesntExists"})}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,bn.Z)(e),s=document.createElement("a");s.href=t,window[i](s)}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{(0,a.Z)(null);const i=t.href;let s,n;e.noPathnameParams||(s=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(i));const o=e.callback({pathnameParams:s,uriParams:n},t);return void 0===o&&o}}parseUriParams(e,t=e.split("?")){const i={};return t[1]?(t[1].split("&").forEach((e=>{i[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),i):i}openUsername(e){const{userName:t,lastMsgId:i,threadId:s,commentId:n,startParam:a}=e;return this.managers.appUsersManager.resolveUsername(t).then((e=>{const t="user"===e._,o=e.id.toPeerId(!t);return s?this.openThread(o,i,s):n?this.openComment(o,i,n):this.setInnerPeer({peerId:o,lastMsgId:i,startParam:a})}),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?Ei({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&Ei({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e,t,i){return this.managers.appMessagesManager.wrapSingleMessage(e,i).then((s=>(s?this.managers.appMessagesManager.generateThreadServiceStartMessage(s):t=void 0,this.setInnerPeer({peerId:e,lastMsgId:t,threadId:i,type:"discussion"}))))}openComment(e,t,i){return this.managers.appMessagesManager.getDiscussionMessage(e,t).then((e=>this.openThread(e.peerId,i,e.mid)))}callUser(e,t){return dm(this,void 0,void 0,(function*(){Bp.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?Wa({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[new Nt({peerId:e.toPeerId()}).element],button:{langKey:"OK",isCancel:!0}}):(yield this.discardCurrentCall(e.toPeerId()),Bp.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return fu.groupCall&&fu.groupCall!==t?this.discardGroupCallConfirmation(e):Bp.currentCall&&Bp.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return dm(this,void 0,void 0,(function*(){const t=Bp.currentCall;t&&(yield Wa({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[new Nt({peerId:t.interlocutorUserId.toPeerId(!1)}).element,new Nt({peerId:e}).element],button:{langKey:"OK"}}),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return dm(this,void 0,void 0,(function*(){const t=fu.groupCall;t&&(yield Wa({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new Nt({peerId:t.chatId.toPeerId(!0)}).element,new Nt({peerId:e}).element],button:{langKey:"OK"}}),fu.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return dm(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 Ei({langPackKey:"VoiceChat.Chat.Ended"});yield Wa({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{dm(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)}fu.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=Ya.Z.getTheme();if(t.background.slug){const i=eo.h.settings.themes.find((e=>e.name===t.name));return this.getBackground(t.background.slug).then((t=>this.setBackground(t,e)),(()=>(t.background=(0,Fi.Z)(i.background),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&&s.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=xu.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,ra.Z)(t.bubbles,"desc").filter((e=>!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}xu.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=xu.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),Ya.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&_u([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),s.Z.settings.animationsEnabled&&!1!==t&&(0,He.YW)((0,fr.Z)(400),400);const i=(0,Dn.Z)(this.prevTab);(0,Dn.Z)(e)>i&&C.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,Xn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),mi.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Eu(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(a,c)=>dm(this,void 0,void 0,(function*(){if(c===i)return;const d=a.dataTransfer.types,h=d.contains?d.contains("Files"):d.indexOf("Files")>=0,u=kc(),p=yield cm(a,!0);if(!h||!(yield this.canDrag())&&!u)return void(n=0);const m=u?l:r,g=u?t:e;if(c&&!g.length){const e=h&&!p.length,t=p.filter((e=>o.Z.has(e))).length;this.log("drag files",p),u?(u.appendDrops(m),(p.length||e)&&g.push(new ku(m,{header:"Preview.Dragging.AddItems",headerArgs:[p.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((p.length||e)&&g.push(new ku(m,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&g.push(new ku(m,{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(m))}Re(m,"is-visible",c,200,(()=>{c||(g.forEach((e=>{e.destroy()})),g.length=0)})),c?g.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",c),i=c}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,a.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const r=document.createElement("div");r.classList.add("drops-container");const l=r.cloneNode(!0)}canDrag(){return dm(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||Lr.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return dm(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}C.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&_u([Qo.sidebarEl,this.columnEl,Ws.sidebarEl]),document.body.classList.toggle(Vo,0===e);const n=this.tabId;-1!==n&&this.overrideHash(e>0?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.log("selectTab",e,n);let a=s.Z.settings.animationsEnabled?(0,Be.d1)():Promise.resolve();if(-1!==n&&n!==e&&s.Z.settings.animationsEnabled&&!1!==t&&d.Z.activeScreen!==d._.large){const e=100+(d.Z.isMobile?250:200);a=(0,fr.Z)(e),(0,He.YW)(a,e)}this.tabId=e,(0,Xn.Z)(),d.Z.isMobile&&2===n&&e<2&&document.body.classList.remove(Vs),-1!==n&&e>n&&(e<2||!C.Z.findItemByType("im"))&&C.Z.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}});const o=window.onImTabChange;return o&&o(e),a}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new Iu(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 a=this.chat;this.dispatchEvent("chat_changing",{from:n,to:a});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(a.container,i),t){this.dispatchEvent("peer_changed",a.peerId);const e=Ws.getTab(wu);e&&e.close(),Ws.replaceSharedMediaTab(a.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return dm(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=le.NM);const{peerId:s,lastMsgId:n}=e,a=this.chat,o=this.chats.indexOf(a);if(s){if(o>0&&a.peerId&&a.peerId!==s){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(o>0)return void this.spliceChats(o,void 0,t);if(d.Z.activeScreen===d._.medium)return void this.selectTab(+!this.tabId,t)}if(s===a.peerId&&d.Z.activeScreen<=d._.medium&&document.body.classList.contains(Vo))return this.selectTab(1,t),!1;if(s||d.Z.activeScreen!==d._.mobile){const i=yield a.setPeer(s,n,e.startParam),o=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([o,a.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(1,t)}),0)}))}return s?void 0:(this.selectTab(0,t),!1)}))}setInnerPeer(e){var t;const{peerId:i}=e;if(i===le.NM||!i)return;e.threadId&&(e.type="discussion");const s=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex((e=>e.peerId===i&&e.type===s));if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const a=this.chat;let o=a;return a.inited&&(o=this.createNewChat()),s&&(o.setType(s),e.threadId&&(o.threadId=e.threadId)),this.dispatchEvent("chat_changing",{from:a,to:o}),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){return dm(this,void 0,void 0,(function*(){const i=e.isUser();if(i&&(yield this.managers.appUsersManager.isBot(e)))return;const s=yield this.managers.appProfileManager.getPeerTypings(e);if(!(null==s?void 0:s.length))return;const n=s[0],a={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"}},o=i?a.private:s.length>1?a.multi:a.chat;let r=n.action;if(s.length>1){const e={};s.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;let c,d;if(e.isAnyChat()){const e=new Nt;c=e.update({peerId:n.userId.toPeerId(!1),onlyFirstName:!0}),d=[e.element,s.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let h=t.firstElementChild;if(h?h.dataset.action!==r._&&h.replaceWith(this.getTypingElement(r)):(h=this.getTypingElement(r),t.prepend(h)),"sendMessageEmojiInteractionSeen"===r._){d?d.pop():d=[];const e=(0,mn.Z)((0,Zt.Z)(r.emoticon));d.push(e)}const u=(0,v.ag)(l,d);return u.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(u):t.append(u),t}))}getChatStatus(e){return dm(this,void 0,void 0,(function*(){const t=yield this.getPeerTyping(e.toPeerId(!0));if(t)return{cached:!0,result:Promise.resolve(t)};const i=yield this.managers.acknowledged.appProfileManager.getChatFull(e),s=Promise.resolve(i.result).then((t=>dm(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 $i(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,v.v_)([a,(0,v.ag)("OnlineCount",[ji(o)])],!1)),a=e}return a}))));return{cached:i.cached,result:s}}))}getUserStatus(e,t){var i;return dm(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=ce(n);if(!n.pFlags.bot){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){return dm(this,void 0,void 0,(function*(){if(!e)return;let i;return i=e.isAnyChat()?this.getChatStatus(e.toChatId()):this.getUserStatus(e.toUserId(),t),i}))}setPeerStatus(e,t,i,s,n,a){return dm(this,void 0,void 0,(function*(){if(!i){const i=t.querySelector(".peer-typing-container");if(i&&(yield this.getPeerTyping(e,i)))return}const o=yield this.getPeerStatus(e,a);if(!n())return;const r=()=>dm(this,void 0,void 0,(function*(){const e=o&&(yield o.result);if(n())return()=>(0,g.Z)(t,e||l)})),l=s?"‎":"";return!o||o.cached?yield r():i?()=>(t.textContent=l,r().then((e=>e&&e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}}const pm=new um;R.GO&&(R.GO.appImManager=pm);const mm=pm;class gm extends Qu{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 I.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 At(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:o}=this;t.classList.add(s);const r=this.buildControls();let l;if(t.insertAdjacentHTML("beforeend",r),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),r=t.querySelector("#time-elapsed");l=t.querySelector("#time-duration"),l.innerHTML=gt(0|i.duration);const c=new wd(o),d=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),d.insertBefore(c.btn,r.parentElement),Array.from(e).forEach((e=>{(0,n.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,n.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,Pi.Z)(e,t,!1,!0);o.add(i)("enterpictureinpicture",(()=>{s(!0),o.add(i)("leavepictureinpicture",(()=>{const e=o.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{o.remove(e)}),t)}),{once:!0})})),o.add(i)("leavepictureinpicture",(()=>{s(!1)}))}mi.Z||((0,n.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),o.add(document)("keydown",(e=>{if(Lr.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let o=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)vt.Z.muted=!vt.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?o=!1:"ArrowLeft"===s?vt.Z.seekBackward({action:"seekbackward"}):vt.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=vt.Z.playbackRate,i=gm.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{mi.Z||this.toggleFullScreen()})),(0,n.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,Vu.Ms)(t,this.onFullScreen.bind(this,s),o),o.add(i)("timeupdate",(()=>{r.innerHTML=gt(0|i.currentTime)})),o.add(i)("play",(()=>{t.classList.add("played"),mi.Z||o.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),o.add(i)("pause",(()=>{this.showControls(!1)})),o.add(vt.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}o.add(i)("play",(()=>{t.classList.add("is-playing")})),o.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?l.innerHTML=gt(Math.round(i.duration||e)):(0,pt.Z)(i).then((()=>{l.innerHTML=gt(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 ${!Je.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=gm.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{vt.Z.playbackRate=e}}))),t=$n(e);t.classList.add("top-left"),va(this.playbackRateButton,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,void 0,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;gm.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=gm.PLAYBACK_RATES.indexOf(vt.Z.playbackRate);-1===t&&(t=gm.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+gm.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(Je.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,Vu.rB)()?(0,Vu.C8)():(0,Vu.Dj)(e)}onFullScreen(e){const t=(0,Vu.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}}gm.PLAYBACK_RATES=[.5,1,1.5,2],gm.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var vm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class fm extends L.Z{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,a.Z)(e),mi.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,r.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(Lr.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,a.Z)(e)},this.onKeyUp=e=>{Lr.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(Lr.Z.overlaysActive>1||(0,r.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,a.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=s.Z.managers,this.log=(0,he.kg)("AMV"),this.preloader=new Ue,this.preloaderStreamable=new Ue({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new ve.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add("media-viewer");const o=this.topbar=document.createElement("div");o.classList.add("media-viewer-topbar","media-viewer-appear");const l=document.createElement("div");l.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=E("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const c=document.createElement("div");this.author.avatarEl=new km,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),c.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,c);const d=document.createElement("div");d.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=E(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=E("zoomout",{noRipple:!0}),(0,n.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=E("zoomin",{noRipple:!0}),(0,n.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new _t({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("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),l.append(this.buttons["mobile-close"],this.author.container),o.append(l,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-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()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){(0,n.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,n.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,a.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,n.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)},mi.Z&&new Ds({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,Vu.rB)())return Math.abs(e)/zi.width>.2||e>125?(e<0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/zi.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!(0,r.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 Ds({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=fa({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&(0,a.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&C.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){Lr.Z.isOverlayActive=e,p.Z.checkAnimations(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),mi.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return vm(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,l=s.Z.settings.animationsEnabled?o?350:200:0;let c,d;e&&(e instanceof km||e.classList.contains("grid-item")?(c=e,d=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(c=(0,r.Z)(e,"attachment"),d=c.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(c=(0,r.Z)(e,"profile-avatars-container"),d=c.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==d.left&&(e=c=d=void 0))),e||(e=this.content.media),d||(c=e.parentElement,d=e.getBoundingClientRect());let h=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=mr(c,(0,r.Z)(c,"scrollable"),!0);!t||i&&2!==i.overflow.vertical&&2!==i.overflow.horizontal?!i||1!==i.overflow.vertical&&1!==i.overflow.horizontal||(h=!0):(c=(e=this.content.media).parentElement,d=e.getBoundingClientRect())}const u=this.content.media.getBoundingClientRect();let p,m,g,v="";if(o?(p=1===i?zi.width:-u.width,m=u.top):(p=d.left,m=d.top),v+=`translate3d(${p}px,${m}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){g=n.firstElementChild;const e=g.querySelector(".ckin__player");if(e){const t=e.firstElementChild;g.append(t),e.remove()}g.style.cssText||(n.classList.remove("active"),this.setFullAspect(g,u,d),n.offsetLeft,n.classList.add("active"))}else g=document.createElement("div"),g.classList.add("media-viewer-aspecter"),n.prepend(g);g.style.cssText=`width: ${d.width}px; height: ${d.height}px; transform: scale3d(${u.width/d.width}, ${u.height/d.height}, 1);`}n.style.width=u.width+"px",n.style.height=u.height+"px";const f=d.width/u.width,y=d.height/u.height;o||(v+=`scale3d(${f},${y},1) `);let b=window.getComputedStyle(c).getPropertyValue("border-radius");const w=function(e){let 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=w.map((e=>parseInt(e)/f+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=zi.width/2-d.width/2,t=zi.height/2-d.height/2,i=d.left-e,s=d.top-t;this.moversContainer.style.transform=`matrix(${f}, 0, 0, ${y}, ${i}, ${s})`}else n.style.transform=v;let S;h&&(n.style.opacity="0");const C=e.classList.contains("is-out"),L=this.setMoverAnimationPromise=(0,Oe.Z)(),I={onAnimationEnd:L},M=setTimeout((()=>{L.isFulfilled||L.isRejected||L.resolve()}),1e3);if(L.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===L&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(S=n.querySelector("path"),S&&this.sizeTailPath(S,u,f,l,!1,C,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)}),l/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",L.resolve()}),l),n.classList.remove("opening"),I;{let t,i;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}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=ut(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=u,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,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/f:2/f}, ${a}) scale(${+n/f}, ${+o/y})`)),l.setAttributeNS(null,"transform",t),S=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=C?Tu(0,0,s-9/f,a,...i):Tu(9/f,0,s-9/f,a,...i),S.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+u.width),c.setAttributeNS(null,"height",""+u.height),n.prepend(o)}g&&(g.style.borderRadius=b,t&&g.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),g||(t.style.width=u.width+"px",t.style.height=u.height+"px"),i&&(yield Ze(t,i))),n.style.display="",(0,Be.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,Be.d1)(),n.style.transform=`translate3d(${u.left}px,${u.top}px,0) scale3d(1,1,1)`,h&&(n.style.opacity=""),g&&this.setFullAspect(g,u,d),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),g&&(n.querySelector("video"),n.classList.remove("active"),g.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,L.resolve()}),l),S&&this.sizeTailPath(S,u,f,l,!0,C,b),I}))}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:l,height:c}=t;s/=2;const d=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=d.map((e=>e*o));let p;p=a?Tu(0,0,l-9/i*o,c,...u):Tu(9/i*o,0,l,c,...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,r.Z)(e,"document")){if((0,r.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()}}Ae(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=Bs({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,Zt.Z)(e)),t.classList.add("peer-title")}let n=this.author.avatarEl;const a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||le.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,g.Z)(this.author.date,G(t)),(0,g.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,n,o=!1,r=[],l=[],c){return vm(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const h=this.setAuthorInfo(i,t),p="document"===e._,m=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(r,l,o),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=!n||n===g;v&&(n=g),this.target={element:n};const f=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield h,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),Je.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},C.Z.pushItem(this.navigationItem)));const y=this.content.mover,b=zi.width;let w=0;const S=zi.height;S<1e6&&!d.Z.isMobile&&(w=120);const L=S-120-w;let I=Promise.resolve();const M=lt(e,g,b,L,!d.Z.isMobile,void 0,!!(p&&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=at(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const E=!(!p||!e.supportsStreaming),P=E?this.preloaderStreamable:this.preloader,T=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let k;if(m){const t=c&&"gif"!==e.type,i=ut({pip:t}),o=()=>this.setMoverToTarget(n,!1,s).then((({onAnimationEnd:s})=>{const o=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!==f&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),Je.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),o.append(i);const l=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),d=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([l,s]).then((()=>{this.tempId===f&&((this.videoPlayer=new gm({video:i,play:!0,streamable:E,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?C.Z.removeItem(this.navigationItem):C.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,vt.Z.setPictureInPicture(i)):this.releaseSingleMedia=vt.Z.setSingleMedia(i,c))},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(E){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{console.log("ppp 2"),P.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,a.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>vm(this,void 0,void 0,(function*(){const a=E?Promise.resolve():u.Z.downloadMediaURL({media:e});return E||s.then((()=>vm(this,void 0,void 0,(function*(){(yield T()).url||(console.log("ppp 4"),P.attach(y,!0,a))})))),Promise.all([a,s]).then((()=>vm(this,void 0,void 0,(function*(){if(this.tempId!==f)return void this.log.warn("media viewer changed video");const e=(yield T()).url;i.addEventListener("error",(()=>{4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),P&&P.detach()}),{once:!0}),n instanceof SVGSVGElement?o.firstElementChild.lastElementChild.append(i):Ae(i,e),t&&(this.releaseSingleMedia=vt.Z.setSingleMedia(i,c),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(n,e,"video"),d()})))),a}))})}));k=I.then(o)}else{const t=()=>this.setMoverToTarget(n,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>vm(this,void 0,void 0,(function*(){const i=p?u.Z.downloadMediaURL({media:e}):u.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>vm(this,void 0,void 0,(function*(){(yield T()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>vm(this,void 0,void 0,(function*(){var e;if(this.tempId!==f)return void this.log.warn("media viewer changed photo");const t=(yield T()).url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(y,t,"img"),d.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){let e=new Image;e.classList.add("thumbnail"),Ae(e,t,(()=>{this.updateMediaSource(n,t,"img"),s&&(0,Be.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));k=I.then(t)}return this.setMoverPromise=k.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}var ym=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class bm extends fm{constructor(){let e;super(new h.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,Se.Z)(e);if(n&&(!t||bm.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>ym(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>ym(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 Yn(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new qn({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>ym(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((()=>ym(this,void 0,void 0,(function*(){if(d.Z.isMobile){const e=Ws.getTab(Gs);e&&e.close()}mm.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>ym(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,Se.Z)(i);s&&u.Z.downloadToDisc({media:s,queueId:mm.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption","message");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{d.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new m.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,n.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()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),(0,n.fc)(this.buttons.forward,this.onForwardClick),(0,n.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,l.Z)(t.target,"A"),s=(0,r.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,a.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,ei.Z)(t,{entities:e.totalEntities})),(0,c.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 ym(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,l=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,c=(0,Se.Z)(e),d="messageService"===e._||!this.managers.appMessagesManager.canForward(e);[this.buttons.forward,this.btnMenuForward.element].forEach((e=>{e.classList.toggle("hide",d)})),this.wholeDiv.classList.toggle("no-forwards",d);const h=d;[this.buttons.download,this.btnMenuDownload.element].forEach((e=>{e.classList.toggle("hide",h)}));const u=this.managers.appMessagesManager.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach((e=>{e.classList.toggle("hide",!u)})),this.setCaption(e);const p=o._openMedia.call(this,c,e.date,l,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,p}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||o.Z.has(e.mime_type)}}class wm extends bs.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 Sm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Cm extends fm{constructor(e){super(new wm({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=()=>Sm(this,void 0,void 0,(function*(){u.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:mm.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 Sm(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 Lm=i(5880),Im=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Mm=e=>{Array.from(document.querySelectorAll('avatar-element[data-peer-id="'+e+'"]')).forEach((e=>{e.update()}))};function Em(e,t,i,n,a,o){return Im(this,void 0,void 0,(function*(){let r=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!r)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!==r.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,r)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new bm).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,o?i(o):void 0)}}if(r){!(0,Lm.Z)(n)&&n&&(r=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new Cm(t).openMedia(r.id,l(),void 0,a?e(a):void 0,o?e(o):void 0)}}))}s.Z.addEventListener("avatar_update",Mm),s.Z.addEventListener("peer_title_edit",(e=>Im(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e))||Mm(e)}))));const Pm=new Map,Tm=new Set;class km extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}disconnectedCallback(){const e=Pm.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||Pm.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>Im(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield Em(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(let t in e)this[t]=e[t]}updateWithOptions(e){const t=this.peerId;this.updateOptions(e);const i=this.peerId;if(t!==i){if(this.peerId=i,this.dataset.peerId=""+i,t){const e=Pm.get(t);e&&(e.delete(this),e.size||Pm.delete(t))}return this.update()}}r(e=!1){const t=Ts(this,this.peerId,this.isDialog,this.peerTitle,e,this.isBig);return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!Tm.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=Pm.get(this.peerId);return e||(e=new Set,Pm.set(this.peerId,e)),e.add(this),this.lazyLoadQueue.push({div:this,load:()=>(Tm.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}Tm.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=Pm.get(this.peerId);if(t){t.delete(this);const e=Array.from(t);Pm.delete(this.peerId);for(let t=0,i=e.length;txm(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.selectedId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.onPinClick=()=>{this.managers.appMessagesManager.toggleDialogPin(this.selectedId,this.filterId).catch((e=>xm(this,void 0,void 0,(function*(){if("PINNED_DIALOGS_TOO_MUCH"===e.type)if(this.filterId>=1)Ei({langPackKey:"PinFolderLimitReached"});else{const e=yield this.managers.apiManager.getConfig();new _i("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{Qo.createTab(Co)}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[(0,v.ag)("Chats",[e.pinned_dialogs_count_max])]}).show()}}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute(this.selectedId,!1)},this.onMuteClick=()=>{new _d(this.selectedId)},this.onUnreadClick=()=>xm(this,void 0,void 0,(function*(){const e=this.selectedId,t=yield this.managers.appMessagesManager.getDialogOnly(e);t&&(t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message),this.managers.appMessagesManager.markDialogUnread(e,!0)):this.managers.appMessagesManager.markDialogUnread(e))})),this.onDeleteClick=()=>{new as(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,l.Z)(e.target,jm)}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{xm(this,void 0,void 0,(function*(){this.filterId=Jm.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=yield this.managers.appMessagesManager.getDialogOnly(this.selectedId),yield Promise.all(this.buttons.map((e=>xm(this,void 0,void 0,(function*(){const t=yield e.verify();e.element.classList.toggle("hide",!t)}))))),this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,v.ag)(yield this.managers.appPeersManager.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),ua(e,this.element),xs.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>xm(this,void 0,void 0,(function*(){return!(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:()=>xm(this,void 0,void 0,(function*(){var e;return!(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:()=>xm(this,void 0,void 0,(function*(){var e;return 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:()=>xm(this,void 0,void 0,(function*(){return this.selectedId!==s.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>xm(this,void 0,void 0,(function*(){return this.selectedId!==s.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==s.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==s.Z.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=$n(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var Am,Zm=i(9174);class Dm{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{Promise.all([Ho.Z.get("dc"),s.Z.managers.rootScope.getConnectionStatus()]).then((([e,t])=>{e||(e=Oo.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const i=t["NET-"+e],s=i&&i.status===Zm.Q.Connected;this.connecting&&s&&this.managers.apiUpdatesManager.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=i&&i.status===Zm.Q.TimedOut,this.connecting=!s,this.retryAt=i&&i.retryAt,R.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,g.Z)(this.statusEl,(0,v.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(Au.Z.deactivatedReason)return;const e=Dm.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.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");R.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{Re(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,R.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,he.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,M.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new Ue({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),s.Z.addEventListener("connection_status_change",(e=>{console.log(e),this.setConnectionStatus()})),s.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,R.ZP&&this.log("updating",this.updating),this.setState())})),s.Z.addEventListener("state_synchronized",(e=>{R.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,R.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,Dm.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,v.ag)(e)),(0,n.fc)(i,(e=>{(0,a.Z)(e),t()})),i}}function Fm(e,t,i,s){return e>=s?t+i:-i/2*(Math.cos(Math.PI*e/s)-1)+t}function Rm(e,t,i,s,n,a,o,r){const l=e.canvas.dpr;if(l&&(t*=l,i*=l,s*=l,n*=l),"number"==typeof a)l&&(a*=l),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]?l?a[t]*l: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()}Dm.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(Am||(Am={}));const Bm=window.devicePixelRatio,Nm=20*Bm,Um=2.5*Bm,Om=2*Bm,Hm=1*Bm;var zm=i(3385),Gm=i(2554);class Vm{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,Me.Z)(this.lightSource,0,1),e=(0,Me.Z)(this.lightSource-this.lightSpread,0,1),t=(0,Me.Z)(this.lightSource+this.lightSpread,0,1);const a=Nu.getProperty("background-color-true"),o=Nu.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 Km{constructor(){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 Vm,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=54,this.marginVertical=9,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=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(),s.Z.settings.animationsEnabled||this.remove())}remove(){this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.onRemove&&(this.onRemove(),this.onRemove=void 0),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0))}updateCanvasSize(e=this.getRectFrom.getBoundingClientRect()){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:n,availableLength:a}=this;if(!i)return;if(!s.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let l=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){l=!1;continue}const s=Fm(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${s})`,t.fill(),s<1&&(l=!1)}t.globalCompositeOperation="source-over",l&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,n=this.createPattern();t.settings({canvas:e,fillStyle:n});const a=()=>this.tempId===i;this.renderFrame(),(0,ht.jt)((()=>!!a()&&(s.Z.settings.animationsEnabled&&this.renderFrame(),a()))),s.Z.addEventListener("theme_change",this.onThemeChange),d.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,s.Z.removeEventListener("theme_change",this.onThemeChange),d.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=Nu.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=(this.avatarSize+2*this.marginVertical)*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=Ir((()=>e[t]===s));return{deferred:s,middleware:n}}class qm extends Bn{constructor(e,t,i,s){super({getIndex:t=>e.dialogsStorage.getDialogIndex(t.id,this.indexKey),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;Fn(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const i=t?[]:void 0,{dom:s}=Ym.addListDialog({peerId:e.id,loadPromises:i,isBatch:t});return e.dom=s,(null==i?void 0:i.length)&&(e.loadPromises=i,Promise.all(i).finally((()=>{delete e.loadPromises}))),e},updateElementWith:Be.TR}),this.managers=e,this.list=t,this.indexKey=i,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class Qm{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=(0,he.kg)("DIALOGS",he.v9.Log|he.v9.Error|he.v9.Warn|he.v9.Debug),this.placeholders={},this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>(this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()),this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)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 Wo({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 Un({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=zi.height/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach((e=>{s.add(e)})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=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=>Wm(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isContact(e))&&!(yield this.managers.appMessagesManager.getDialogOnly(e))})),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&(0,Be.TR)((()=>{const e=performance.now(),t=this.scroll.scrollTop,i=this.chatList.firstElementChild,s=this.scroll.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)})),this.setOffsets(),this.scroll.scrollTop=d.offsetTop-u,this.log("slice time",performance.now()-e)}))}),200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>(this.scroll.loadedAll[e]&&this.loadContacts&&this.loadContacts(),this.log("onChatsScroll",e),this.loadDialogs(e));const e=this.managers=(0,Gm.Z)();this.contextMenu=new _m(e),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,Pi.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),mi.Z&&Wn({element:this.folders.container,onSwipe:e=>{const t=a.prevId();a(e>0?t+1:t-1)}}),this.allChatsIntlElement=new v.ZP.IntlElement({key:"FilterAllChatsShort"}),s.Z.addEventListener("state_cleared",(()=>{Ci.Z.getState().then((e=>Wm(this,void 0,void 0,(function*(){this.loadedDialogsAtLeastOnce=!1,this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)}))))})),this.setFilterId(0,0),this.addFilter({id:this.filterId,title:"",orderIndex:0});const i=new m.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const a=(0,ue.X)(this.folders.menu,this.folders.container,((e,t)=>{if(e=+t.dataset.filterId||0,Je.IS_MOBILE_SAFARI||(e?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{a(0),this.filtersNavigationItem=void 0}},C.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(C.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),this.filterId!==e)return this.sortedLists[e].clear(),this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}))}),(()=>{for(const e in this.sortedLists)if(+e!==this.filterId){this.sortedLists[e].clear();const t=this.placeholders[e];t&&t.remove()}}),void 0,i);Ci.Z.getState().then((e=>(vt.Z.setPlaybackParams(e.playbackParams),vt.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),d.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new Dm(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{ri.Z.loadLottieWorkers()}),200),A.Z.MANAGERS=s.Z.managers=e,u.Z.construct(e),Qo.construct(e),Ws.construct(e),fu.construct(e),Bp.construct(e),mm.construct(e),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],(0,n.tH)(this.folders.menu.firstElementChild)}get chatList(){return this.sortedList.list}setFilterId(e,t){this.indexKey=(0,zm.Z)(t),this.filterId=e}setFilterIdAndChangeTab(e){return Wm(this,void 0,void 0,(function*(){return this.indexKey=yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.filterId=e,this.onTabChange()}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),Re(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove(i)},t&&!s?2:0)}initListeners(){s.Z.addEventListener("user_update",(e=>Wm(this,void 0,void 0,(function*(){var t;const i=e.toPeerId(),n=this.getDialogDom(i);if(n&&i!==s.Z.myId&&!(yield this.managers.appUsersManager.isBot(e))){const i="userStatusOnline"===(null===(t=(yield this.managers.appUsersManager.getUser(e)).status)||void 0===t?void 0:t._);this.setOnlineStatus(n.avatarEl,i)}})))),s.Z.addEventListener("chat_update",(e=>Wm(this,void 0,void 0,(function*(){const t=e.toPeerId(!0),i=yield this.managers.appMessagesManager.getDialogOnly(t);i&&this.processDialogForCallStatus(i)})))),s.Z.addEventListener("folder_unread",(e=>{this.setFilterUnreadCount(e.id)})),s.Z.addEventListener("contacts_update",(e=>{this.processContact&&this.processContact(e.toPeerId())})),s.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&(this.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e),this.setFiltersUnreadCount())})),s.Z.addEventListener("dialogs_multiupdate",(e=>{for(const t in e){const i=e[t];this.updateDialog(i),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(i)}})),s.Z.addEventListener("dialog_drop",(({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)})),s.Z.addEventListener("dialog_unread",(({dialog:e})=>{e&&(this.setUnreadMessagesN({dialog:e}),this.validateDialogForFilter(e))})),s.Z.addEventListener("dialog_notify_settings",(e=>{this.validateDialogForFilter(e),this.setUnreadMessagesN({dialog:e})})),s.Z.addEventListener("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{t?this.sortedList.delete(i):this.updateDialog(e),this.processContact&&this.processContact(i)})),mm.addEventListener("peer_changed",(e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((e=>{this.setDialogActive(e,!0)}))})),s.Z.addEventListener("filter_update",(e=>Wm(this,void 0,void 0,(function*(){if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t{const t=this.filtersRendered[e.id];t&&((0,n.tH)(this.folders.menu.firstElementChild),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange())})),s.Z.addEventListener("filter_order",(e=>Wm(this,void 0,void 0,(function*(){const t=this.folders.menu,i=yield Promise.all(e.map((e=>Wm(this,void 0,void 0,(function*(){return{indexKey:yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),filter:yield this.managers.filtersStorage.getFilter(e)}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.sortedLists[e].indexKey=n,Fn(o.menu,t,a.orderIndex),Fn(o.container,this.folders.container,a.orderIndex)})),this.indexKey=yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(this.filterId)})))),s.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>Wm(this,void 0,void 0,(function*(){const i=yield this.managers.appMessagesManager.getDialogOnly(e);i&&(t.length?this.setTyping(i):this.unsetTyping(i))}))))}setDialogActive(e,t){const i=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==i?void 0:i.callIcon)&&i.callIcon.setActive(t)}onStateLoaded(e){return Wm(this,void 0,void 0,(function*(){const t=this.onChatsScroll();this.initedListeners||(this.initListeners(),this.initedListeners=!0);const i=!(!e.filters||!Object.keys(e.filters).length),s=(i?Promise.resolve(Object.values(e.filters).sort(((e,t)=>e.orderIndex-t.orderIndex))):this.managers.filtersStorage.getDialogFilters()).then((e=>{for(const t of e)this.addFilter(t)}));i&&(yield s,this.showFiltersPromise&&(yield this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield t).renderPromise,this.managers.appMessagesManager.fillConversations()}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Qi.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessageN({dialog:e,dom:t,setUnread:!0}),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;return Wm(this,void 0,void 0,(function*(){if(0===e)return;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),i.innerText=n?""+n:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}validateListForFilter(){return Wm(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>Wm(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(e.id)}))))}))}validateDialogForFilter(e){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e.peerId))}testDialogForFilter(e){return!(!e||(this.filterId>1?void 0===(0,Qi.Z)(e,this.indexKey):this.filterId!==e.folder_id))}generateScrollable(e,t){const i=t.id,s=new m.ZP(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+i,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new qm(this.managers,e,(0,zm.Z)(t.orderIndex),this.onListLengthChange);return this.scrollables[i]=s,this.sortedLists[i]=n,s}addFilter(e){if(1===e.id)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return Fn(i.menu,t,e.orderIndex),void Fn(i.container,this.folders.container,e.orderIndex);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"),0===e.id?a.append(this.allChatsIntlElement.element):(0,c.Z)(a,(0,Zt.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,we.Z)(s),s.append(n),Fn(s,t,e.orderIndex);const l=this.createChatList(),d=this.generateScrollable(l,e);d.container.classList.add("tabs-tab","chatlist-parts");const h=document.createElement("div");h.classList.add("chatlist-top");const u=document.createElement("div");u.classList.add("chatlist-bottom"),h.append(l),d.container.append(h,u);const p=d.container;Fn(d.container,this.folders.container,e.orderIndex),this.setListClickListener(l,null,!0),this.filtersRendered[e.id]={menu:s,container:p,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(){return this.showFiltersPromise||(this.showFiltersPromise=new Promise((e=>{window.setTimeout((()=>{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,e()}),0)}))),this.showFiltersPromise}loadDialogs(e){if(this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scroll.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});const t=(0,Oe.Z)(),i=new Promise(((s,n)=>Wm(this,void 0,void 0,(function*(){const{chatList:a,filterId:o,indexKey:r}=this;let l=zi.height/72*1.25|0,c=0;const{index:d}=this.getOffsetIndex(e);if(d)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(o,!0),t=e.findIndex((e=>(0,Qi.Z)(e,r)<=d)),i=Math.max(0,t-l);l=t-i,c=(0,Qi.Z)(e[i],r)+1}else c=d;let h=this.placeholders[o];try{const s=this.managers.acknowledged.appMessagesManager.getConversations("",c,l,o,!0);if(!(a.childElementCount||h||this.loadedDialogsAtLeastOnce&&(yield s).cached)){h=this.placeholders[o]=new Km;const e=1===o?this.chatsContainer:this.folders.container;h.attach({container:a.parentElement,getRectFrom:e,onRemove:()=>{delete this.placeholders[o]},blockScrollable:this.scroll}),t.resolve(!1)}const d=yield s,u=yield d.result;if(this.loadDialogsRenderPromise!==i)return n(),void t.reject();if(t.resolve(d.cached),"bottom"===e?u.isEnd&&(this.scroll.loadedAll[e]=!0):u.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,u.dialogs.length){const s="top"===e?u.dialogs.slice().reverse():u.dialogs,a=[],o=[],r=e=>{o.push(e)};if(s.forEach((e=>{const t=this.sortedList.add(e.peerId,!0,r,!1);t.loadPromises&&a.push(...t.loadPromises)})),a.push((0,Be.AD)()),yield Promise.all(a).finally(),this.loadDialogsRenderPromise!==i)return n(),void t.reject();o.forEach((e=>e()))}else this.onListLengthChange();const p=u.dialogs["top"===e?0:u.dialogs.length-1];p&&(this.offsets[e]=(0,Qi.Z)(p,r)),this.log.debug("getDialogs "+l+" dialogs by offset:",c,u,a.childElementCount),setTimeout((()=>{this.scroll.onScroll()}),0)}catch(e){this.log.error(e)}h&&h.detach(a.childElementCount),s()})))).finally((()=>{this.loadDialogsRenderPromise===i&&(this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0)}));return this.loadDialogsRenderPromise=i,this.loadDialogsPromise=t.then((e=>({cached:e,renderPromise:i})))}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,v.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,v.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.scroll.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let a,o;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:o="folder"}),i=a.container;const e=document.createElement("div"),t=128;La({div:e,emoji:"📂",width:t,height:t}),i.prepend(e);const s=(0,M.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,n.fc)(s,(()=>Wm(this,void 0,void 0,(function*(){Qo.createTab(wo).open(yield this.managers.filtersStorage.getFilter(this.filterId))})))),i.append(s)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:o="dialogs"}),i=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new v.ZP.IntlElement({element:a.subtitle}),Promise.all([this.updateContactsLength(!1),Ze(e,"assets/img/EmptyChats.svg"),(0,Be.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=o}updateContactsLength(e){return this.updateContactsLengthPromise?this.updateContactsLengthPromise: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,v.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.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){return Wm(this,void 0,void 0,(function*(){const e=this.chatList,t=yield this.getDialogFromElement(e.firstElementChild),i=yield this.getDialogFromElement(e.lastElementChild),s=this.indexKey;this.offsets.top=(0,Qi.Z)(t,s),this.offsets.bottom=(0,Qi.Z)(i,s)}))}getDialogFromElement(e){return this.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,i=!1,s=!1,n=!1){let o;const r=(n?mm.setInnerPeer:mm.setPeer).bind(mm);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(e=>{if(0!==e.button)return;this.log("dialogs click list");const i=e.target,n=(0,l.Z)(i,jm);if(!n)return;const c=n.dataset.peerId.toPeerId();if(e.ctrlKey||e.metaKey)return window.open(n.href||"#"+c,"_blank"),void(0,a.Z)(e);if(s){const e=o===n;o&&!e&&o.classList.remove("active"),n&&(n.classList.add("active"),o=n,this.lastActiveElements.add(n))}if(n){t&&t();const e=+n.dataset.mid||void 0;r({peerId:c,lastMsgId:e})}else r()}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,a.Z)(e)}),{capture:!0}),R.ZP&&e.addEventListener("dblclick",(e=>{const t=(0,l.Z)(e.target,jm);if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",this.managers.appMessagesManager.getDialogByPeerId(e))}})),i&&Gn(e,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.dialog,e.lastMessage,e.dom,e.highlightWord,e.isBatch,e.setUnread).catch(ft.Z)}setLastMessage(e,t,i,n,a=!1,o=!1){var r;return Wm(this,void 0,void 0,(function*(){if(!i&&!(i=this.getDialogDom(e.peerId)))return;const{deferred:l,middleware:c}=$m(i,"setLastMessagePromise");let d;if(!t&&("draftMessage"===(null===(r=e.draft)||void 0===r?void 0:r._)&&(d=e.draft),!(t=e.topMessage)||t.mid!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);t=yield c(i)}if(o&&this.setUnreadMessagesN({dialog:e,dom:i,isBatch:a,setLastMessagePromise:l}),!t)return i.lastMessageSpan.textContent="",i.lastTimeSpan.textContent="",delete i.listEl.dataset.mid,void l.resolve();const h=e.peerId,u=t&&un(t);{let e;const a=[];if(t&&!d&&!u){const i=(0,Se.Z)(t),s=new Set(["video","gif","round"]);if(i&&("photo"===i._||s.has(i.type))){const n=Le(i,20,20);if("photoSizeEmpty"!==n._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===i.type&&e.classList.add("is-round"),a.push(dt({photo:i,message:t,container:e,withoutPreloader:!0,size:n}).then((()=>e))),s.has(i.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(d){const e=document.createElement("b");e.classList.add("danger"),e.append((0,v.ag)("Draft"),": "),a.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("b");if(t.fromId===s.Z.myId)e.append((0,v.ag)("FromYou")),a.unshift(e);else{const i=c(Bs({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),ft.Z);a.unshift(i)}e.append(": ")}const o=!!e&&!!(null==t?void 0:t.message);let r;if(r=n&&t.message?yield c(In(t,void 0,void 0,!1,n,o)):d?yield c(In(d)):t?yield c(In(t,void 0,void 0,!1,void 0,o)):document.createDocumentFragment(),a.length){const e=yield c(Promise.all(a));r.prepend(...e)}(0,g.Z)(i.lastMessageSpan,r)}if(t||d){const e=d?Math.max(d.date,t.date||0):t.date;(0,g.Z)(i.lastTimeSpan,H(new Date(1e3*e)))}else i.lastTimeSpan.textContent="";null===o||o||(i.listEl.dataset.mid=""+t.mid),l.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e.dialog,e.dom,e.isBatch,e.setLastMessagePromise).catch((()=>{}))}setUnreadMessages(e,t=this.getDialogDom(e.peerId),i=!1,n){var a;return Wm(this,void 0,void 0,(function*(){if(!t)return;const{deferred:o,middleware:r}=$m(t,"setUnreadMessagePromise"),l=yield r(this.managers.appNotificationsManager.isPeerLocalMuted(e.peerId,!0)),c=t.listEl.classList.contains("is-muted");let d;if("draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)){const t=yield r(this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.top_message));t&&t.pFlags.out&&t.peerId!==s.Z.myId&&(d=t)}const h=yield r(this.managers.filtersStorage.getFilter(this.filterId));let u;u=h?-1!==h.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const p=yield r(this.managers.appMessagesManager.isDialogUnread(e)),m=u||p;if(n)try{yield r(n)}catch(e){}const g=i?0:200;l!==c&&Re(t.listEl,"is-muted",l,g),function(e,t,i){let s;if((null==t?void 0:t.pFlags.out)&&(s=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()}(t.statusSpan,d);const v=(0,Ne.Z)(t.unreadBadge);m&&!v&&t.subtitleEl.append(t.unreadBadge);const f=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),y=t.mentionsBadge&&(0,Ne.Z)(t.mentionsBadge);if(f&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling))),Re(t.unreadBadge,"is-visible",m,g,m?void 0:()=>{t.unreadBadge.remove()},v?0:2),t.mentionsBadge&&Re(t.mentionsBadge,"is-visible",f,g,f?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},y?0:2),!m)return void o.resolve();u?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let b=!0,w=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",w=!0):p?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",b=!1),t.unreadBadge.classList.toggle("unread",b),t.unreadBadge.classList.toggle("mention",w),o.resolve()}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){return Wm(this,void 0,void 0,(function*(){if("object"!=typeof e){const t=yield this.managers.appMessagesManager.getDialogOnly(e);if(!t){const t=e||le.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return t}return 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=Nm;const i=t.getContext("2d"),s=(Nm-(3*Om+2*Um))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=Fm((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,Nm,Nm),i.fillStyle=e&&!d.Z.isMobile?Nu.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*=Bm,Rm(i,s+e*Om+e*Um,(Nm-n)/2,Om,n,Hm,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,ht.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&Re(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){e.autonomous=!1;const t=this.addDialogNew(e);if(t){const i=this.getDialog(e.peerId).then((i=>{const{peerId:n}=i,a=[];return n.isUser()||a.push(this.processDialogForCallStatus(i,t.dom)),n!==s.Z.myId&&n.isUser()&&a.push(this.managers.appUsersManager.getUser(n).then((e=>{var i;"userStatusOnline"===(null===(i=e.status)||void 0===i?void 0:i._)&&this.setOnlineStatus(t.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:i,dom:t.dom,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));e.loadPromises&&e.loadPromises.push(i)}return t}processDialogForCallStatus(e,t){return Wm(this,void 0,void 0,(function*(){if(!kd.Z)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const i=yield this.managers.appChatsManager.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),Dt(i)),{peerId:t}));return this.setLastMessage({_:"dialog",peerId:t},i,n.dom,s),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){return this.addDialog(e.peerId,e.container,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises,e.fromName)}addDialog(e,t,i=!0,s=!1,n=!0,a=!0,o=54,r=!!t,l,c,d){var h;const u=new km;u.classList.add("dialog-avatar","avatar-"+o),u.updateWithOptions({loadPromises:c,lazyLoadQueue:l,isDialog:!!n,peerId:e,peerTitle:d});const p=document.createElement("div");p.classList.add("user-caption");const m=document.createElement("span");m.classList.add("user-title");const g=new Nt,v=g.update({peerId:e,fromName:d,dialog:n,onlyFirstName:s,plainText:!1});c&&c.push(v),m.append(g.element),m.classList.add("tgico");const f=fs(e).then((e=>{m.append(...e)}));c&&c.push(f);const y=document.createElement("span");y.classList.add("user-last-message"),y.setAttribute("dir","auto");const b=document.createElement(jm);b.classList.add("chatlist-chat"),r||(b.href="#"+e),i&&(0,we.Z)(b),b.append(u,p),b.dataset.peerId=""+e;const w=document.createElement("span");w.classList.add("message-status","sending-status");const S=document.createElement("span");S.classList.add("message-time");const C=document.createElement("div");C.className="dialog-subtitle-badge badge badge-24";const L=document.createElement("p");L.classList.add("dialog-title");const I=document.createElement("span");I.classList.add("dialog-title-details"),I.append(w,S),L.append(m,I);const M=document.createElement("p");M.classList.add("dialog-subtitle"),M.append(y),p.append(L,M);const E={avatarEl:u,captionDiv:p,titleSpan:g.element,titleSpanContainer:m,statusSpan:w,lastTimeSpan:S,unreadBadge:C,lastMessageSpan:y,containerEl:b,listEl:b,subtitleEl:M};return t&&t[a?"append":"prepend"](b),r||(b.dialogDom=E,(null===(h=mm.chat)||void 0===h?void 0:h.peerId)===e&&this.setDialogActive(b,!0)),{dom:E}}setTyping(e){return Wm(this,void 0,void 0,(function*(){const t=this.getDialogDom(e.peerId);if(!t)return;const i=t.lastMessageSpan.querySelector(".peer-typing-container"),s=yield mm.getPeerTyping(e.peerId,i);!i&&s&&((0,g.Z)(t.lastMessageSpan,s),t.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessageN({dialog:e,lastMessage:null,dom:t,setUnread:null}))}}const Ym=new Qm;R.GO.appDialogsManager=Ym;const Jm=Ym},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}])}}]); -//# sourceMappingURL=126.25016da268c3c399afac.chunk.js.map \ No newline at end of file diff --git a/public/126.25016da268c3c399afac.chunk.js.map b/public/126.25016da268c3c399afac.chunk.js.map deleted file mode 100644 index 9ed13aa13..000000000 --- a/public/126.25016da268c3c399afac.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"126.25016da268c3c399afac.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/codeInputField.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/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderImageWithFadeIn.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/preloader.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/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/popups/pickUser.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/popups/deleteDialog.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.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/lib/richTextProcessor/matchEmail.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/confirmationPopup.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/popups/stickers.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/editProfile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.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/helpers/number/formatNumber.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.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/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.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/middlewarePromise.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/components/emoticonsDropdown/index.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/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/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/helpers/dom/getViewportSlice.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/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/helpers/dom/getRichValueWithCaret.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/components/inputFieldAnimated.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/helpers/dom/setCaretAt.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.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/getStreamCached.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.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/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/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/groupCallState.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/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.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/helpers/dom/getSelectedNodes.ts","webpack://tweb/./src/helpers/generatePathData.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/helpers/dom/customProperties.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/helpers/dom/controlsHover.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/lib/calls/callState.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/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.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/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/components/connectionStatus.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/lib/appManagers/appDialogsManager.ts","webpack://tweb/./public/recorder.min.js"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(\r\n public name: LangPackKey | boolean, \r\n public type: string, \r\n private clearable = true, \r\n className?: string, \r\n clickable = true, \r\n public autonomous = true, \r\n public onFound?: () => void\r\n ) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then((res) => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n avatarSize: 54,\r\n meAsSaved: false,\r\n message,\r\n query\r\n });\r\n } catch(err) {\r\n console.error('[appSearch] render search result', err);\r\n }\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch((err) => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): T;\r\n}\r\n\r\nexport interface SliderSuperTabEventableConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n public managers: AppManagers;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n if(this.slider) {\r\n this.slider.addTab(this);\r\n }\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n this.scrollable.destroy();\r\n this.listenerSetter?.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type'];\r\n protected managers: AppManagers;\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME + 30);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n\r\n public createTab(ctor: SliderSuperTabConstructable, doNotAppend?: boolean) {\r\n const tab = new ctor(doNotAppend ? undefined : this, true);\r\n tab.managers = this.managers;\r\n return tab;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport type { InputFile } from \"../layer\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport PopupElement from \"./popups\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n attachClickEvent(this.container, () => {\r\n PopupElement.createPopup(PopupAvatar).open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport getUserStatusString from \"../../wrappers/getUserStatusString\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\ninterface OpenStreetMapInterface {\r\n place_id?: number;\r\n license?: string;\r\n osm_type?: string;\r\n osm_id?: number;\r\n lat?: string;\r\n lon?: string;\r\n display_name: string;\r\n address?: object;\r\n boundingbox?: object;\r\n}\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private isGeoChat: boolean = false;\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n private list: HTMLUListElement;\r\n private groupLocationInputField: InputField;\r\n private userLocationCoords: {lat: number, long: number};\r\n private userLocationAddress: string;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.groupNameInputField = new InputField({\r\n label: 'CreateGroup.NameHolder',\r\n maxLength: 128\r\n });\r\n\r\n this.groupLocationInputField = new InputField({\r\n label: 'ChatLocation',\r\n name: 'location',\r\n canBeEdited: false\r\n });\r\n\r\n inputWrapper.append(\r\n this.groupNameInputField.container,\r\n this.groupLocationInputField.container\r\n );\r\n\r\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\r\n const value = this.groupNameInputField.value;\r\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\r\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\r\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n attachClickEvent(this.nextBtn, () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n let promise: Promise;\r\n if(this.isGeoChat) {\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n promise = this.managers.appChatsManager.createChannel({\r\n title, \r\n about: '', \r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords, \r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length) {\r\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n\r\n return chatId;\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n return chatId;\r\n });\r\n }\r\n\r\n if(!promise) {\r\n return;\r\n }\r\n\r\n promise.then((chatId) => {\r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n\r\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const chatsSection = new SettingSection({\r\n name: 'Members',\r\n nameArgs: [this.peerIds.length]\r\n });\r\n\r\n const list = this.list = appDialogsManager.createChatList({\r\n new: true\r\n });\r\n\r\n chatsSection.content.append(list);\r\n\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(section.container, chatsSection.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.groupLocationInputField.container.classList.add('hide');\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[], isGeoChat: boolean = false) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n const result = super.open();\r\n result.then(() => {\r\n if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n return Promise.all(this.peerIds.map(async(userId) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: userId,\r\n container: this.list,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\r\n }));\r\n });\r\n \r\n return result;\r\n }\r\n\r\n private startLocating() {\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.userLocationCoords = {\r\n lat: location.coords.latitude,\r\n long: location.coords.longitude\r\n };\r\n\r\n let uri = \"https://nominatim.openstreetmap.org/reverse\";\r\n uri += \"?lat=\"+location.coords.latitude;\r\n uri += \"&lon=\"+location.coords.longitude;\r\n uri += \"&format=json\";\r\n uri += \"&addressdetails=1\";\r\n uri += \"&accept-language=en\";\r\n fetch(uri)\r\n .then((response) => response.json())\r\n .then((response: OpenStreetMapInterface) => {\r\n this.userLocationAddress = response.display_name;\r\n this.groupLocationInputField.setValueSilently(response.display_name);\r\n });\r\n }, (error) => {\r\n if(error instanceof GeolocationPositionError) {\r\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\r\n } else {\r\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry};\r\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: OnVisibilityChangeItem[] = [];\r\n\r\n entries.forEach((entry) => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry};\r\n\r\n // ! order will be incorrect so can't use it\r\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\r\n changed.push(change);\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach((item) => {\r\n onVisibilityChange(item);\r\n });\r\n }, options);\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\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\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};\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 if(!this.intersectorTimeout) {\n this.intersectorTimeout = window.setTimeout(() => {\n this.intersectorTimeout = 0;\n this.processQueue();\n }, 0);\n }\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 unobserve(el: HTMLElement) {\n findAndSpliceAll(this.queue, (i) => i.div === el);\n\n this.intersector.unobserve(el);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport VisibilityIntersector, { OnVisibilityChangeItem } from \"./visibilityIntersector\";\r\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\r\nimport findAndSplice from \"../helpers/array/findAndSplice\";\r\nimport LazyLoadQueueIntersector, { LazyLoadElement } from \"./lazyLoadQueueIntersector\";\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(parallelLimit?: number) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return findAndSplice(this.queue, item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MyDocument } from \"../../appDocsManager\";\nimport type { MyPhoto } from \"../../appPhotosManager\";\nimport type { PhotoSize, WebDocument } from \"../../../../layer\";\nimport calcImageInBox from \"../../../../helpers/calcImageInBox\";\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\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\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: undefined\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","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","/*\r\nThis file is part of Telegram Desktop,\r\nthe official desktop application for the Telegram messaging service.\r\nFor license and copyright information please follow this link:\r\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\r\n*/\r\n\r\nimport accumulate from \"../helpers/array/accumulate\";\r\nimport clamp from \"../helpers/number/clamp\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map((size) => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map((ratio) => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\r\n }\r\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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\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 && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\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 loader.addEventListener('load', () => {\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 && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', (err) => {\n console.error('Render image from url failed:', err, url, loader);\n callback();\n });\n }\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 renderImageFromUrl from \"./renderImageFromUrl\";\n\nexport default function renderImageWithFadeIn(\n container: HTMLElement, \n image: HTMLImageElement, \n url: string, \n needFadeIn: boolean, \n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n image.classList.add('fade-in');\n }\n\n const promise = new Promise((resolve) => {\n /* if(photo._ === 'document') {\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\n return resolve();\n } */\n\n renderImageFromUrl(image, url, () => {\n sequentialDom.mutateElement(container, () => {\n aspecter.append(image);\n\n resolve();\n /* fastRaf(() => {\n resolve();\n }); */\n\n if(needFadeIn) {\n image.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n image.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n // useRafs = undefined;\r\n // duration = 0;\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => any;\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n\r\n if(this.isUpload) {\r\n this.tryAgainOnFail = false;\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { ArgumentTypes } from \"../types\";\r\n\r\ntype HeavyQueue> = {\r\n items: ArgumentTypes[], \r\n process: (...args: any[]) => ReturnType,\r\n context: any,\r\n promise?: CancellablePromise[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]) as typeof promise;\r\n }\r\n \r\n const promise = queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk>(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([] as any);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: ReturnType[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: typeof results[0];\r\n // @ts-ignore\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!IS_CANVAS_FILTER_SUPPORTED) {\r\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(\r\n img: HTMLImageElement, \r\n radius: number, \r\n iterations: number, \r\n canvas: HTMLCanvasElement = document.createElement('canvas')\r\n) {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(IS_CANVAS_FILTER_SUPPORTED) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\r\nconst cache: Map = new Map();\r\nconst CACHE_SIZE = 150;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n throw 'no dataUri for blur: ' + dataUri;\r\n }\r\n\r\n if(cache.size > CACHE_SIZE) {\r\n cache.clear();\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.className = 'canvas-thumbnail';\r\n \r\n let cached = cache.get(dataUri);\r\n if(!cached) {\r\n const promise: CacheValue['promise'] = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n // if(IS_CANVAS_FILTER_SUPPORTED) {\r\n // resolve(processBlurNext(img, radius, iterations));\r\n // } else {\r\n const promise = addHeavyTask({\r\n items: [[img, radius, iterations, canvas]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift');\r\n \r\n promise.then(() => {\r\n resolve();\r\n });\r\n // }\r\n };\r\n img.src = dataUri;\r\n });\r\n });\r\n \r\n cache.set(dataUri, cached = {\r\n canvas,\r\n promise\r\n });\r\n } else {\r\n canvas.width = cached.canvas.width;\r\n canvas.height = cached.canvas.height;\r\n cached.promise.then(() => {\r\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\r\n });\r\n }\r\n\r\n return {\r\n ...cached,\r\n canvas\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport bytesFromHex from \"./bytesFromHex\";\nimport bytesToDataURL from \"./bytesToDataURL\";\n\nconst JPEG_HEADER = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\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 = bytes instanceof Uint8Array ? bytes : new Uint8Array(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 return bytesToDataURL(arr, mimeType);\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\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 { 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(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\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 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 if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\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 { 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 renderImageWithFadeIn from \"../../helpers/dom/renderImageWithFadeIn\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport { Message, PhotoSize, 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\";\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}: {\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?: () => boolean, \n size?: PhotoSize,\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}) {\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc) {\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return {\n loadPromises: {\n thumb: Promise.resolve(),\n full: Promise.resolve()\n },\n images: {\n thumb: null,\n full: null\n },\n preloader: null,\n aspecter: null\n };\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 const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n image = new Image();\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n 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 thumbImage = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n image.classList.add('media-photo');\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 = isGif && !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 renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\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(() => {});\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\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return {\n loadPromises: {\n thumb: loadThumbPromise,\n full: loadPromise || Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: image\n },\n preloader,\n aspecter\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","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","/*\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","/*\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { FontFamily, FontSize, FontWeight } from \"../config/font\";\r\nimport getTextWidth from \"../helpers/canvas/getTextWidth\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nconst fontSize = '16px';\r\nlet pendingTest = false;\r\n\r\nfunction setTestQueue() {\r\n if(pendingTest) {\r\n return;\r\n }\r\n\r\n pendingTest = true;\r\n fastRaf(() => {\r\n pendingTest = false;\r\n testQueueElements();\r\n });\r\n}\r\n\r\nfunction testQueueElements() {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n}\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n \r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nfunction getElementWidth(element: HTMLElement) {\r\n const type = element.dataset.sizeType;\r\n if(type) {\r\n const mediaSize = mediaSizes.active;\r\n // @ts-ignore\r\n const size: MediaSize = mediaSize[type];\r\n return size.width;\r\n } \r\n \r\n return element.getBoundingClientRect().width;\r\n}\r\n\r\nfunction testElement(element: HTMLElement) {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || FontWeight} ${FontSize} ${FontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = getElementWidth(element);\r\n //console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n //console.log('[MEE] testElement map set', element);\r\n }\r\n \r\n const newElementWidth = getElementWidth(element);\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = getElementWidth(element);\r\n //mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n //console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n connectedCallback() {\r\n //console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n if(this.dataset.sizeType) {\r\n testElement(this);\r\n } else {\r\n testQueue.add(this);\r\n setTestQueue();\r\n }\r\n //testElement(this);\r\n\r\n //console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n testQueue.delete(this);\r\n //console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define(\"middle-ellipsis-element\", MiddleEllipsisElement);\r\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 { i18n, LangPackKey } from \"../lib/langPack\";\n\nexport default function formatBytes(bytes: number, decimals = 2) {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return i18n(sizes[i], [parseFloat((bytes / Math.pow(k, i)).toFixed(dm))]);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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 let 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","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport limitSymbols from \"../helpers/string/limitSymbols\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport getPeerTitle from \"./wrappers/getPeerTitle\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean,\r\n limitSymbols?: number,\r\n managers?: AppManagers\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach((element) => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n private fromName: string;\r\n private plainText = false;\r\n private onlyFirstName = false;\r\n private dialog = false;\r\n private limitSymbols: number;\r\n private managers: AppManagers;\r\n\r\n constructor(options?: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n\r\n if(options) {\r\n this.update(options);\r\n }\r\n \r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public setOptions(options?: PeerTitleOptions) {\r\n if(!options) {\r\n return;\r\n }\r\n\r\n for(const i in options) {\r\n // @ts-ignore\r\n const value = options[i];\r\n\r\n if(typeof(value) !== 'object') {\r\n // @ts-ignore\r\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\r\n }\r\n\r\n // @ts-ignore\r\n this[i] = value;\r\n }\r\n }\r\n\r\n public async update(options?: PeerTitleOptions) {\r\n this.setOptions(options);\r\n\r\n let fromName = this.fromName;\r\n if(fromName !== undefined) {\r\n if(this.limitSymbols !== undefined) {\r\n fromName = limitSymbols(fromName, this.limitSymbols, this.limitSymbols);\r\n }\r\n\r\n setInnerHTML(this.element, wrapEmojiText(fromName));\r\n return;\r\n }\r\n\r\n if(this.peerId === undefined) {\r\n this.peerId = NULL_PEER_ID;\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n const managers = this.managers ?? rootScope.managers;\r\n setInnerHTML(this.element, await getPeerTitle(this.peerId, this.plainText, this.onlyFirstName, this.limitSymbols, managers));\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\nimport getMessageSenderPeerIdOrName from \"../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName\";\nimport { i18n } from \"../../lib/langPack\";\nimport rootScope from \"../../lib/rootScope\";\nimport PeerTitle 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 new PeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\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 type { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\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\";\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\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(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.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 { 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 mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\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 } 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 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, withoutPreloader, loadPromises, noPlayButton, size, searchContext, autoDownload, managers = rootScope.managers}: {\n doc: MyDocument, \n container?: HTMLElement, \n message?: Message.message, \n boxWidth?: number, \n boxHeight?: number, \n withTail?: boolean, \n isOut?: boolean,\n middleware?: () => boolean,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: true,\n noPlayButton?: boolean,\n group?: string,\n onlyPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n size?: PhotoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers\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 let 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,\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 {\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,\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 { // * gifs masonry\n // const gotThumb = managers.appDocsManager.getThumb(doc, false);\n // if(gotThumb) {\n // gotThumb.promise.then(() => {\n // video.poster = gotThumb.cacheContext.url;\n // });\n // }\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);\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 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 });\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 video.autoplay = true;\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 = managers.apiFileManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId, onlyCache: noAutoDownload});\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject();\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 renderImageFromUrl(video, cacheContext.url);\n }, () => {});\n\n return {download: loadPromise, render: 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 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 { ChatAutoDownloadSettings } from \"../../helpers/autoDownload\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport { Message, 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 Chat from \"../chat/chat\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport prepareAlbum from \"../prepareAlbum\";\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}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: () => boolean,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers\n}) {\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media = 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 items.forEach((item, idx) => {\n const {size, media, message} = item;\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: message.media.document,\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 });\n }\n\n if(thumbPromise && loadPromises) {\n loadPromises.push(thumbPromise);\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 MEDIA_MIME_TYPES_SUPPORTED from \"../../environment/mediaMimeTypesSupport\";\nimport { clearBadCharsAndTrim } from \"../../helpers/cleanSearchText\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport { simulateClickEvent, attachClickEvent } from \"../../helpers/dom/clickEvent\";\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 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 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}: {\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}): Promise {\n if(!fontWeight) fontWeight = 500;\n if(!sizeType) sizeType = '' as any;\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.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n let 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 let docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\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\n let imgs: (HTMLImageElement | HTMLCanvasElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type)) {\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 icoDiv.innerText = ext;\n }\n\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n let fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\n \n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid ? '' : `
`}\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.sizeType = sizeType;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\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 sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\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 if(downloadDiv) {\n downloadDiv.classList.add('downloaded');\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const load = async(e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: Promise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadMediaVoid({media: doc, queueId});\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 if(downloadDiv) {\n download.then(onLoad, noop);\n preloader.attach(downloadDiv, true, download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download');\n const promise = appDownloadManager.downloadMediaVoid({media: doc});\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download');\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 uploadPromise.then(onLoad, noop);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\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 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) {\n const key = doc.id + '-' + toneIndex;\n return !!savingLottiePreview[key];\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n let saving = savingLottiePreview[key];\n if(saving && saving.width >= width && saving.height >= height) {\n return;\n }\n\n 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","/*\n * 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 throttleWithRaf from \"../../helpers/schedulers/throttleWithRaf\";\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}: {\n size: number,\n doc: MyDocument,\n middleware?: () => boolean,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers\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 const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: false,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers\n }).then(({render}) => render).then((animation) => {\n assumeType(animation);\n animation.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === animation.maxFrame) {\n animation.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\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 = generateRandomSigned(16);\n const randomOffsetY = generateRandomSigned(4);\n const stableOffsetX = size / 8 * (side === 'right' ? 1 : -1);\n const setPosition = () => {\n if(!isInDOM(target)) {\n return;\n }\n \n const rect = target.getBoundingClientRect();\n /* const boxWidth = Math.max(rect.width, rect.height);\n const boxHeight = Math.max(rect.width, rect.height);\n const x = rect.left + ((boxWidth - size) / 2);\n const y = rect.top + ((boxHeight - size) / 2); */\n\n const rectX = side === 'right' ? rect.right : rect.left;\n\n const addOffsetX = side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0) + stableOffsetX + randomOffsetX;\n const x = rectX + addOffsetX;\n // const y = rect.bottom - size + size / 4;\n const y = rect.top + ((rect.height - size) / 2) + (side === 'center' ? 0 : randomOffsetY);\n // animationDiv.style.transform = `translate(${x}px, ${y}px)`;\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n };\n\n const onScroll = throttleWithRaf(setPosition);\n\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n appImManager.emojiAnimationContainer.append(animationDiv);\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 IS_WEBP_SUPPORTED from \"../../environment/webpSupport\";\nimport assumeType from \"../../helpers/assumeType\";\nimport getPathFromBytes from \"../../helpers/bytes/getPathFromBytes\";\nimport deferredPromise from \"../../helpers/cancellablePromise\";\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 from \"../../helpers/dom/renderImageFromUrl\";\nimport getImageFromStrippedThumb from \"../../helpers/getImageFromStrippedThumb\";\nimport getPreviewURLFromThumb from \"../../helpers/getPreviewURLFromThumb\";\nimport onMediaLoad from \"../../helpers/onMediaLoad\";\nimport { isSavingLottiePreview, saveLottiePreview } from \"../../helpers/saveLottiePreview\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { PhotoSize } 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 lottieLoader from \"../../lib/rlottie/lottieLoader\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport type { ThumbCache } from \"../../lib/storages/thumbs\";\nimport webpWorkerController from \"../../lib/webp/webpWorkerController\";\nimport { SendMessageEmojiInteractionData } from \"../../types\";\nimport { getEmojiToneIndex } from \"../../vendor/emoji\";\nimport animationIntersector from \"../animationIntersector\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport wrapStickerAnimation from \"./stickerAnimation\";\n\nexport default async function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers}: {\n doc: MyDocument, \n div: HTMLElement, \n middleware?: () => boolean, \n lazyLoadQueue?: LazyLoadQueue, \n group?: string, \n play?: boolean, \n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: boolean,\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers\n}) {\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width) {\n width = !emoji ? 200 : undefined;\n }\n\n if(!height) {\n height = !emoji ? 200 : undefined;\n }\n\n if(stickerType === 2) {\n //LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n \n if(!stickerType) {\n console.error('wrong doc for wrapSticker!', doc);\n throw new Error('wrong doc for wrapSticker!');\n }\n\n div.dataset.docId = '' + doc.id;\n div.classList.add('media-sticker-wrapper');\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 let getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\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();\n }\n\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n \n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length || \n lottieCachedThumb\n ) && \n !div.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 let thumbImage: HTMLImageElement | HTMLCanvasElement;\n const afterRender = () => {\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 }\n };\n\n if('url' in thumb) {\n thumbImage = new Image();\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\n haveThumbCached = true;\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(thumb.bytes.length) {\n const d = getPathFromBytes(thumb.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) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.append(svg);\n } else {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n } else if(toneIndex <= 0) {\n thumbImage = new Image();\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n renderImageFromUrl(thumbImage, getPreviewURLFromThumb(doc, thumb, true), afterRender);\n haveThumbCached = true;\n } else {\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()) return;\n \n if(!div.childElementCount) {\n renderImageFromUrl(thumbImage, getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\n }\n }).catch(() => {});\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if(div.childElementCount || (middleware && !middleware())) return;\n\n const r = () => {\n if(div.childElementCount || (middleware && !middleware())) return;\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\n };\n \n await getCacheContext();\n if(cacheContext.url) {\n r();\n return;\n } else {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n thumbImage = res.image;\n res.loadPromise.then(r);\n \n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n }\n };\n \n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div, load});\n return;\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;\n }\n \n const load = async() => {\n if(middleware && !middleware()) return;\n\n if(stickerType === 2 && !asStatic) {\n /* if(doc.id === '1860749763008266301') {\n console.log('loaded sticker:', doc, div);\n } */\n\n //await new Promise((resolve) => setTimeout(resolve, 500));\n //return;\n\n //console.time('download sticker' + doc.id);\n\n //appDocsManager.downloadDocNew(doc.id).promise.then((res) => res.json()).then(async(json) => {\n //fetch(doc.url).then((res) => res.json()).then(async(json) => {\n return await appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId})\n .then(async(blob) => {\n //console.timeEnd('download sticker' + doc.id);\n //console.log('loaded sticker:', doc, div/* , blob */);\n if(middleware && !middleware()) {\n throw new Error('wrapSticker 2 middleware');\n }\n\n let animation = await lottieLoader.loadAnimationWorker({\n container: div,\n loop: loop && !emoji,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex\n }, group, middleware);\n\n //const deferred = deferredPromise();\n \n animation.addEventListener('firstFrame', () => {\n const element = div.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== animation.canvas) {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n animation.canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n \n animation.canvas.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n animation.canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n\n if(withThumb !== false) {\n saveLottiePreview(doc, animation.canvas, toneIndex);\n }\n\n //deferred.resolve();\n }, {once: true});\n \n if(emoji) {\n const data: SendMessageEmojiInteractionData = {\n a: [],\n v: 1\n };\n\n let sendInteractionThrottled: () => void;\n\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n\n attachClickEvent(div, async(e) => {\n cancelEvent(e);\n const animation = lottieLoader.getAnimation(div);\n \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 div.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 const peerId = appImManager.chat.peerId;\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 bubble = findUpClassName(div, 'bubble');\n const isOut = bubble.classList.contains('is-out');\n\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 280,\n target: div,\n play: true\n });\n\n if(bubble) {\n if(isOut) {\n animationDiv.classList.add('is-out');\n } else {\n animationDiv.classList.add('is-in');\n }\n }\n\n if(!sendInteractionThrottled) {\n 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(div, '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);\n \n data.a.length = 0;\n }, 1000, false);\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(e.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n \n sendInteractionThrottled();\n }\n });\n }\n\n return animation;\n\n //return deferred;\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n\n //console.timeEnd('render sticker' + doc.id);\n } else if(asStatic || stickerType === 3) {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n media = createVideo();\n (media as HTMLVideoElement).muted = true;\n\n if(play) {\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).loop = true;\n }\n }\n\n const thumbImage = div.firstElementChild !== media && div.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage : (!thumbImage || thumbImage.tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n media.classList.add('media-sticker');\n\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n return new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) return resolve();\n \n const onLoad = () => {\n sequentialDom.mutateElement(div, () => {\n div.append(media);\n if(thumbImage) {\n thumbImage.classList.add('fade-out');\n }\n\n if(stickerType === 3 && !isSavingLottiePreview(doc, toneIndex)) {\n // const perf = performance.now();\n assumeType(media);\n const canvas = document.createElement('canvas');\n canvas.width = width * window.devicePixelRatio;\n canvas.height = height * window.devicePixelRatio;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n\n if(stickerType === 3 && group) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n\n resolve();\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n if(thumbImage) {\n thumbImage.remove();\n }\n }, {once: true});\n }\n });\n };\n\n await getCacheContext();\n if(asStatic) {\n renderImageFromUrl(media, cacheContext.url, onLoad);\n } else {\n (media as HTMLVideoElement).src = cacheContext.url;\n onMediaLoad(media as HTMLVideoElement).then(onLoad);\n }\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType === 2 && 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, resolve);\n }\n });\n }\n };\n\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || isAnimated) ? \n (lazyLoadQueue.push({div, 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 return {render: 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\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.updateWithOptions({peerId: this.peerId});\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach((inputField) => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach((inputField) => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach((r) => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport ripple from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public titleRight: HTMLElement;\r\n public subtitle: HTMLElement;\r\n public media: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string | HTMLElement | DocumentFragment,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n titleRightSecondary: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean,\r\n noWrap: boolean,\r\n listenerSetter: ListenerSetter\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\r\n havePadding = true;\r\n }\r\n\r\n if(options.checkboxField) {\r\n this.checkboxField = options.checkboxField;\r\n \r\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\r\n if(isToggle) {\r\n this.container.classList.add('row-with-toggle');\r\n options.titleRight = this.checkboxField.label;\r\n } else {\r\n havePadding = true;\r\n this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n const onChange = () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n };\r\n\r\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\r\n else this.checkboxField.input.addEventListener('change', onChange);\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n const titleRight = options.titleRight || options.titleRightSecondary;\r\n if(titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.noWrap) this.title.classList.add('no-wrap');\r\n if(options.title) {\r\n if(typeof(options.title) === 'string') {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(options.title);\r\n }\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(titleRight) {\r\n const titleRightEl = this.titleRight = document.createElement('div');\r\n titleRightEl.classList.add('row-title', 'row-title-right');\r\n\r\n if(options.titleRightSecondary) {\r\n titleRightEl.classList.add('row-title-right-secondary');\r\n }\r\n\r\n if(typeof(titleRight) === 'string') {\r\n titleRightEl.innerHTML = titleRight;\r\n } else {\r\n titleRightEl.append(titleRight);\r\n }\r\n\r\n c.append(titleRightEl);\r\n }\r\n }\r\n\r\n if(options.icon) {\r\n havePadding = true;\r\n this.title.classList.add('tgico', 'tgico-' + options.icon);\r\n this.container.classList.add('row-with-icon');\r\n }\r\n\r\n if(havePadding) {\r\n this.container.classList.add('row-with-padding');\r\n }\r\n\r\n if(options.navigationTab) {\r\n options.clickable = () => options.navigationTab.open();\r\n }\r\n\r\n if(options.clickable || options.radioField || options.checkboxField) {\r\n if(typeof(options.clickable) === 'function') {\r\n attachClickEvent(this.container, (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n }, {listenerSetter: options.listenerSetter});\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n public createMedia(size?: 'small') {\r\n this.container.classList.add('row-with-padding');\r\n \r\n const media = this.media = document.createElement('div');\r\n media.classList.add('row-media');\r\n\r\n if(size) {\r\n media.classList.add('row-media-' + size);\r\n }\r\n\r\n this.container.append(media);\r\n\r\n return media;\r\n }\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\r\n }); */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string,\r\n alignRight?: boolean\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n\r\n if(options.alignRight) {\r\n label.classList.add('radio-field-right');\r\n }\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n apiManagerProxy.getState().then((state) => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey,\r\n langPackArguments: FormatterArguments\r\n}>) {\r\n toast(i18n(options.langPackKey, options.langPackArguments));\r\n}\r\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\nimport isUsernameValid from \"../lib/richTextProcessor/isUsernameValid\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(\r\n options: UsernameInputField['options'], \r\n private managers: AppManagers\r\n ) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\r\n } else {\r\n this.checkUsernamePromise = this.managers.appUsersManager.checkUsername(username);\r\n }\r\n\r\n this.checkUsernamePromise.then((available) => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 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 });\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../putPreloader\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n }, this.managers);\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\r\n return this.managers.appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Scrollable from \"../components/scrollable\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then((done) => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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","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 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","/*\n * 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 let 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 type { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport type { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appDialogsManager 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 { generateDelimiter, SettingSection } from \"./sidebarLeft\";\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\";\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 = 48;\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 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 }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\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.deleted) {\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 let 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 let 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 = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\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 if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = this.managers.appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true);\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\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 }\n\n await this.renderSaved();\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\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.promise) return this.promise;\n\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 tempId = 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 this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\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 }\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 this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 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.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\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 const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\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 title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).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.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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence,\r\n managers: this.managers\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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 \"../../sidebarLeft\";\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 protected 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: 48\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, { 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 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 from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\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: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(options.chatId);\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 info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n if((\n options.participant && \n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n (chat as Chat.channel).username &&\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(info.checkboxField.label);\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 protected 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(li: Element, 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 = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...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: 48,\n append\n });\n\n setSubtitle(dom.listEl, 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(let 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 PopupElement from \".\";\nimport type { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../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 ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect} = this;\n const peerTitleElement = new PeerTitle({peerId}).element;\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.finally(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n 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 && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], 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 new PeerTitle({peerId}).element\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(/* 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 titleLangKey: title,\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 debounce from \"../../../helpers/schedulers/debounce\";\nimport CheckboxField from \"../../checkboxField\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected 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 let originalReactions = chatFull.available_reactions ?? [];\n const enabledReactions = new Set(originalReactions);\n\n const toggleSection = new SettingSection({\n caption: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'EnableReactionsChannelInfo' : 'EnableReactionsGroupInfo'\n });\n\n const toggleCheckboxField = new CheckboxField({toggle: true, checked: !!enabledReactions.size});\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 const reactionsSection = new SettingSection({\n name: 'AvailableReactions'\n });\n\n const checkboxFields = availableReactions.map((availableReaction) => {\n const checkboxField = new CheckboxField({\n toggle: true, \n checked: enabledReactions.has(availableReaction.reaction)\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n enabledReactions.add(availableReaction.reaction);\n\n if(!toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(true);\n }\n } else {\n enabledReactions.delete(availableReaction.reaction);\n\n if(!enabledReactions.size && toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(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 this.listenerSetter.add(toggleRow.checkboxField.input)('change', () => {\n if(!toggleCheckboxField.checked) {\n checkboxFields.forEach((checkboxField) => checkboxField.checked = false);\n saveReactionsDebounced();\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n checkboxFields.forEach((checkboxField) => checkboxField.checked = true);\n saveReactionsDebounced();\n }\n });\n\n const saveReactions = async() => {\n const newReactions = Array.from(enabledReactions);\n if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n return;\n }\n\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.chatId);\n if(chatFull) {\n chatFull.available_reactions = newReactions;\n }\n \n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, newReactions);\n originalReactions = newReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', saveReactions, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport AppChatReactionsTab from \"./chatReactions\";\r\nimport hasRights from \"../../../lib/appManagers/utils/chats/hasRights\";\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n private tempId: number;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n this.tempId ??= 0;\r\n const tempId = ++this.tempId;\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n let chatFull = await this.managers.appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(this.chatId);\r\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = await this.managers.appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach((callback) => callback());\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\r\n if(this.chatId === chatId) {\r\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n const canChangeType = await this.managers.appChatsManager.hasRights(this.chatId, 'change_type');\r\n const canChangePermissions = await this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n \r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n \r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n \r\n if(canChangeType) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppChatTypeTab);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(canChangeType || canChangePermissions) {\r\n const reactionsRow = new Row({\r\n titleLangKey: 'Reactions',\r\n icon: 'reactions',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppChatReactionsTab);\r\n tab.chatId = this.chatId;\r\n tab.open().then(() => {\r\n if(this.tempId !== tempId) {\r\n return;\r\n }\r\n \r\n this.listenerSetter.add(tab.eventListener)('destroy', setReactionsLength);\r\n });\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\r\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\r\n const setReactionsLength = () => {\r\n const reactions = chatFull.available_reactions ?? [];\r\n reactionsRow.subtitle.innerHTML = reactions.length + '/' + availableReactionsLength;\r\n };\r\n\r\n setReactionsLength();\r\n\r\n section.content.append(reactionsRow.container);\r\n }\r\n\r\n if(canChangePermissions && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppGroupPermissionsTab);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const setPermissionsLength = async() => {\r\n const chat = await this.managers.appChatsManager.getChatTyped(this.chatId);\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\r\n return this.managers.appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && canChangeType) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport getPeerId from \"../../../lib/appManagers/utils/peers/getPeerId\";\r\nimport formatUserPhone from \"../../wrappers/formatUserPhone\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !(await this.managers.appUsersManager.isContact(this.peerId.toUserId()));\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = await this.managers.appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField,\r\n listenerSetter: this.listenerSetter\r\n });\r\n \r\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false));\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = await this.managers.appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, async() => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n this.managers.appUsersManager.addContact(\r\n this.peerId, \r\n this.nameInputField.value, \r\n this.lastNameInputField.value, \r\n (await this.managers.appUsersManager.getUser(this.peerId)).phone\r\n ).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n this.managers.appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { setButtonLoader } from \"../../putPreloader\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.container.classList.add('add-members-container');\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\r\n managers: this.managers\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\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 * 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 rootScope from \"../lib/rootScope\";\nimport generateFakeIcon from \"./generateFakeIcon\";\n// import generatePremiumIcon from \"./generatePremiumIcon\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\n\nexport default async function generateTitleIcons(peerId: PeerId) {\n const elements: Element[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel)?.pFlags?.verified) {\n elements.push(generateVerifiedIcon());\n }\n\n if((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n // if((peer as User.user).pFlags.premium) {\n // elements.push(generatePremiumIcon());\n // }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\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","/*\n * 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\";\n\nexport default function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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 } from \"../layer\";\nimport type { PeerPhotoSize } from \"../lib/appManagers/appAvatarsManager\";\nimport getPeerColorById from \"../lib/appManagers/utils/peers/getPeerColorById\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport getAbbreviation from \"../lib/richTextProcessor/getAbbreviation\";\nimport rootScope from \"../lib/rootScope\";\nimport getPeerInitials from \"./wrappers/getPeerInitials\";\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.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 if(thumbImage) {\n thumbImage.remove();\n }\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 await (renderThumbPromise || renderPromise);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement, \n innerHTML: Parameters[1], \n color: string, \n icon: string\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n}\n\n// peerId === peerId || title\nexport default async function putPhoto(\n div: HTMLElement, \n peerId: PeerId, \n isDialog = false, \n title = '', \n onlyThumb = false, \n isBig?: boolean\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(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = await managers.appPeersManager.getPeerPhoto(peerId);\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 = await (title ? getAbbreviation(title) : getPeerInitials(peerId, managers));\n set(div, abbr, color, '');\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 getAbbreviation from \"../../lib/richTextProcessor/getAbbreviation\";\nimport rootScope from \"../../lib/rootScope\";\n\nexport default async function getPeerInitials(peerId: PeerId, managers = rootScope.managers) {\n const peer: Chat | User = await managers.appPeersManager.getPeer(peerId);\n return getAbbreviation(\n (peer as Chat.chat).title ?? [(peer as User.user).first_name, (peer as User.user).last_name].filter(Boolean).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 appNavigationController 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 EventListenerBase from \"./eventListenerBase\";\nimport mediaSizes from \"./mediaSizes\";\n\nclass ContextMenuController extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n private openedMenu: HTMLElement;\n private menuOverlay: HTMLElement;\n private openedMenuOnClose: () => void;\n\n constructor() {\n super();\n \n mediaSizes.addEventListener('resize', () => {\n if(this.openedMenu) {\n this.closeBtnMenu();\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.openedMenu;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n let rect = this.openedMenu.getBoundingClientRect();\n let {clientX, clientY} = e;\n\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.closeBtnMenu();\n //openedMenu.parentElement.click();\n }\n //console.log('mousemove', diffX, diffY);\n };\n\n private onClick = (e: MouseEvent | TouchEvent) => {\n //cancelEvent(e);\n this.closeBtnMenu();\n };\n\n // ! no need in this due to the same handler in appNavigationController\n /* const onKeyDown = (e: KeyboardEvent) => {\n if(e.key === 'Escape') {\n closeBtnMenu();\n cancelEvent(e);\n }\n }; */\n\n public closeBtnMenu = () => {\n if(this.openedMenu) {\n this.openedMenu.classList.remove('active');\n this.openedMenu.parentElement.classList.remove('menu-open');\n //openedMenu.previousElementSibling.remove(); // remove overlay\n if(this.menuOverlay) this.menuOverlay.remove();\n this.openedMenu = undefined;\n \n this.dispatchEvent('toggle', false);\n }\n \n if(this.openedMenuOnClose) {\n this.openedMenuOnClose();\n this.openedMenuOnClose = undefined;\n }\n \n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick);\n }\n \n document.removeEventListener(CLICK_EVENT_NAME, this.onClick);\n \n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType('menu');\n }\n };\n\n public openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\n this.closeBtnMenu();\n \n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'menu',\n onPop: (canAnimate) => {\n this.closeBtnMenu();\n }\n });\n }\n \n this.openedMenu = menuElement;\n this.openedMenu.classList.add('active');\n this.openedMenu.parentElement.classList.add('menu-open');\n \n if(!this.menuOverlay) {\n this.menuOverlay = document.createElement('div');\n this.menuOverlay.classList.add('btn-menu-overlay');\n \n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n \n this.openedMenu.parentElement.insertBefore(this.menuOverlay, this.openedMenu);\n \n //document.body.classList.add('disable-hover');\n \n this.openedMenuOnClose = onClose;\n \n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n //window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {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);\n \n this.dispatchEvent('toggle', true);\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport safeAssign from \"../helpers/object/safeAssign\";\r\nimport contextMenuController from \"../helpers/contextMenuController\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\ncontextMenuController.addEventListener('toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean | Promise;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\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' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n \r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n \r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = async(_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */ \r\n\r\n // } else { /* right swipe */\r\n\r\n // } \r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */ \r\n \r\n // } else { /* down swipe */\r\n \r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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\";\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 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);\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 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 IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Chat, ChatFull, User, UserFull } from \"../layer\";\nimport type { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport { AppManagers } from \"../lib/appManagers/managers\";\nimport I18n from \"../lib/langPack\";\nimport wrapRichText from \"../lib/richTextProcessor/wrapRichText\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateTitleIcons from \"./generateTitleIcons\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\nimport formatUserPhone from \"./wrappers/formatUserPhone\";\nimport wrapPeerTitle from \"./wrappers/peerTitle\";\n\nlet 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 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\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.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.isDialog = this.isDialog;\n this.avatar.attachClickEvent();\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 subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: async(e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n const full = await this.managers.appProfileManager.getProfileByPeerId(this.peerId);\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter\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: async() => {\n const peer: Channel | User.user = await this.managers.appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: async() => {\n const peer: User = await this.managers.appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n copyTextToClipboard(this.link.title.textContent);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n toast(I18n.format('LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter\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(this.peerId);\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(this.peerId, false);\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 listenerSetter.add(rootScope)('peer_title_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.fillUsername();\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', (peerId) => {\n if(this.peerId === peerId) {\n // const photo = appPeersManager.getPeerPhoto(peerId);\n // if(!photo && this.avatars) {\n this.setAvatar();\n // }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n private setPeerStatus = (needClear = false) => {\n const peerId = this.peerId;\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n if(!peerId || (rootScope.myId === peerId && this.isDialog)) return;\n\n return appImManager.setPeerStatus(\n peerId, \n this.subtitle, \n needClear, \n true, \n () => peerId === this.peerId, \n !this.isDialog\n ).then((callback) => {\n if(callback) {\n callback();\n }\n });\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 async setAvatar() {\n if(this.canBeDetailed()) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\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 return;\n }\n }\n\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 await this.avatar.updateWithOptions({peerId: this.peerId});\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n return setText(username, this.username);\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n return setText(user.phone ? formatUserPhone(user.phone) : undefined, this.phone);\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(this.peerId, false);\n notificationsRow.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n });\n }\n }\n\n private async fillRows() {\n const peerId = this.peerId;\n\n await Promise.all([\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(),\n (async() => {\n const [element, icons] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n }),\n\n generateTitleIcons(peerId)\n ]);\n replaceContent(this.name, element);\n this.name.append(...icons);\n })(),\n this.setPeerStatus(true)\n ]);\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n this.cleanupHTML();\n await Promise.all([\n this.setAvatar(),\n this.fillRows(),\n ]);\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull: ChatFull | UserFull) {\n // if(peerFull.about) {\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n // }\n\n if(!peerId.isUser()) {\n const chat: Chat.channel = await this.managers.appChatsManager.getChat(peerId.toChatId());\n if(chat.username) {\n setText('https://t.me/' + chat.username, this.link);\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n setText(exportedInvite.link, this.link);\n }\n }\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n setText(location.address, this.location);\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n }\n\n private async setMoreDetails(override?: true) {\n this.clearSetMoreDetailsTimeout();\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId || await this.managers.appPeersManager.isRestricted(peerId) || !this.canBeDetailed()) {\n return;\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override);\n const setPromise = result.result.then(async(peerFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId || await this.managers.appPeersManager.isRestricted(peerId)) {\n //this.log.warn('peer changed');\n return;\n }\n \n await this._setMoreDetails(peerId, peerFull);\n });\n\n if(result.cached) {\n await setPromise;\n }\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \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.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n }\n}\n","/*\n * 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, 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\";\n\nconst historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\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 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.title.append(i18n('Profile'));\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', 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(transitionContainer, 'slide-fade', 400, null, false);\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(this.closeBtn.firstElementChild.classList.contains('state-back')) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.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 AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\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.renderNewMessages(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.renderNewMessages(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 let 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 public async renderNewMessages(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n if(!historiesStorage[peerId]) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historiesStorage[peerId][inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter).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 === 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 public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historiesStorage[peerId][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 this.scrollable.onScroll();\n }\n\n public async cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', await this.searchSuper.canViewMembers() && await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\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 = 0) {\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] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n await this.cleanupHTML();\n await this.toggleEditBtn();\n await this.profile.fillProfileElements();\n }\n\n private async toggleEditBtn() {\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 show = await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n private isColumnProportionSet = false;\r\n private sharedMediaTab: AppSharedMediaTab;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n }\r\n\r\n construct(managers: AppManagers) {\r\n this.managers = managers;\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n }\r\n\r\n public createSharedMediaTab() {\r\n const tab = this.createTab(AppSharedMediaTab, true);\r\n tab.slider = this;\r\n // this.tabsContainer.prepend(tab.container);\r\n return tab;\r\n }\r\n\r\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\r\n let previousTab = this.sharedMediaTab;\r\n if(previousTab) {\r\n if(tab) {\r\n const wasActive = previousTab.container.classList.contains('active');\r\n if(wasActive) {\r\n tab.container.classList.add('active');\r\n }\r\n \r\n previousTab.container.replaceWith(tab.container);\r\n } else {\r\n previousTab.container.remove();\r\n }\r\n } else {\r\n this.tabsContainer.prepend(tab.container);\r\n }\r\n\r\n this.sharedMediaTab = tab;\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport ripple from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public async open(message: any) {\r\n const ret = super.open();\r\n const poll = await this.managers.appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\r\n\r\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\r\n votesList.votes.forEach((vote) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: vote.user_id.toPeerId(false),\r\n container: list,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then((votes) => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport ripple from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent, simulateClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Message, MessageMedia, Poll, PollResults } from \"../layer\";\r\nimport toHHMMSS from \"../helpers/string/toHHMMSS\";\r\nimport StackedAvatars from \"./stackedAvatars\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport wrapRichText from \"../lib/richTextProcessor/wrapRichText\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach((pollElement) => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nlet isListenerSet = false;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\r\n appImManager.chat.bubbles.container.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n\r\n if(!isListenerSet) {\r\n isListenerSet = true;\r\n appImManager.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: Message.message;\r\n public managers: AppManagers;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach((pollElement) => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public async render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\r\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n \r\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\r\n\r\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\r\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\r\n });\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n this.managers.appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach((el) => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find((r) => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n simulateClickEvent(toggleHint);\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach((target) => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach((target) => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\r\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\r\n stackedAvatars.render(peerIds);\r\n replaceContent(this.avatarsDiv, stackedAvatars.container);\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach((svg) => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map((p) => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach((svg) => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\r\n if(html instanceof DocumentFragment) return html;\r\n const template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\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","// 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","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\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\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\":\"3672990\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"؋\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8893\",\"max_amount\":\"88930176\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11408\",\"max_amount\":\"114088432\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"դր.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"41129\",\"max_amount\":\"411293180\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"12503\",\"max_amount\":\"125036607\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"145\",\"max_amount\":\"1451625\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ман.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"171\",\"max_amount\":\"1711164\"},\"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\":\"187\",\"max_amount\":\"1873042\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"৳\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"9415\",\"max_amount\":\"94154281\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"лв.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"186\",\"max_amount\":\"1869710\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"139\",\"max_amount\":\"1399458\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"692\",\"max_amount\":\"6926834\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"518\",\"max_amount\":\"5182986\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"129\",\"max_amount\":\"1290450\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"95\",\"max_amount\":\"954630\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"926\",\"max_amount\":\"9268013\"},\"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\":\"669\",\"max_amount\":\"6692902\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"410927\",\"max_amount\":\"4109270000\"},\"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\":\"69166\",\"max_amount\":\"691668622\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kč\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2367\",\"max_amount\":\"23674601\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"712\",\"max_amount\":\"7120540\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5497\",\"max_amount\":\"54971796\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"د.ج.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14655\",\"max_amount\":\"146557782\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ج.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1879\",\"max_amount\":\"18794601\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"€\",\"native\":\"€\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"95\",\"max_amount\":\"957150\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"£\",\"native\":\"£\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"82\",\"max_amount\":\"822531\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"293\",\"max_amount\":\"2939866\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"781\",\"max_amount\":\"7811180\"},\"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\":\"7845675\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2476\",\"max_amount\":\"24763692\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"721\",\"max_amount\":\"7210988\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"37819\",\"max_amount\":\"378197939\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1490695\",\"max_amount\":\"14906950000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"₪\",\"native\":\"₪\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"348\",\"max_amount\":\"3480155\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"₹\",\"native\":\"₹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"7894\",\"max_amount\":\"78945050\"},\"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\":\"133\",\"max_amount\":\"1336303\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15175\",\"max_amount\":\"151753529\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"¥\",\"native\":\"¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"136\",\"max_amount\":\"1362010\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"11787\",\"max_amount\":\"117879251\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7950\",\"max_amount\":\"79509472\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"₩\",\"native\":\"₩\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1297\",\"max_amount\":\"12971249\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"₸\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47177\",\"max_amount\":\"471777437\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ل.ل.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"152338\",\"max_amount\":\"1523381760\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"රු.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"36271\",\"max_amount\":\"362713465\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"د.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1018\",\"max_amount\":\"10188182\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1928\",\"max_amount\":\"19284237\"},\"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\":\"312408\",\"max_amount\":\"3124087599\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4614\",\"max_amount\":\"46144273\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1534\",\"max_amount\":\"15349670\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2015\",\"max_amount\":\"20158770\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"440\",\"max_amount\":\"4406499\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6383\",\"max_amount\":\"63830365\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"₦\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"41513\",\"max_amount\":\"415132815\"},\"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\":\"3612\",\"max_amount\":\"36125609\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"990\",\"max_amount\":\"9902585\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"नेरू\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12731\",\"max_amount\":\"127318435\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"160\",\"max_amount\":\"1603695\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":\"1007566\"},\"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\":\"381\",\"max_amount\":\"3818809\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"₱\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5499\",\"max_amount\":\"54994501\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"₨\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"20651\",\"max_amount\":\"206515440\"},\"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\":\"446\",\"max_amount\":\"4466920\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaraní\",\"symbol\":\"PYG\",\"native\":\"₲\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6909\",\"max_amount\":\"69095662\"},\"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\":\"3640988\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"473\",\"max_amount\":\"4736501\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"дин.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11252\",\"max_amount\":\"112520089\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"руб.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"5282\",\"max_amount\":\"52825030\"},\"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\":\"3752099\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1022\",\"max_amount\":\"10224070\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"139\",\"max_amount\":\"1390698\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"฿\",\"native\":\"฿\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3529\",\"max_amount\":\"35290499\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"977\",\"max_amount\":\"9773409\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1667\",\"max_amount\":\"16673549\"},\"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\":\"684\",\"max_amount\":\"6847347\"},\"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\":\"2973\",\"max_amount\":\"29735499\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233200\",\"max_amount\":\"2332000087\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"₴\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"2974\",\"max_amount\":\"29741945\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3788\",\"max_amount\":\"37883728\"},\"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\":\"3979\",\"max_amount\":\"39794286\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1094209\",\"max_amount\":\"10942099215\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese Đồng\",\"symbol\":\"₫\",\"native\":\"₫\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23270\",\"max_amount\":\"232700000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ر.ي.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25024\",\"max_amount\":\"250249914\"},\"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\":\"1624\",\"max_amount\":\"16246189\"}};\n\nexport default Currencies;\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 { 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 } 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 { Message, MessageAction } from \"../../layer\";\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\nimport I18n, { FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n } from \"../../lib/langPack\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport wrapPlainText from \"../../lib/richTextProcessor/wrapPlainText\";\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\nimport rootScope from \"../../lib/rootScope\";\nimport PeerTitle from \"../peerTitle\";\nimport getPeerTitle from \"./getPeerTitle\";\nimport wrapJoinVoiceChatAnchor from \"./joinVoiceChatAnchor\";\nimport wrapMessageForReply from \"./messageForReply\";\n\nasync function wrapLinkToMessage(message: Message.message | Message.messageService, plain?: boolean) {\n const a = document.createElement('i');\n a.dataset.savedFrom = message.peerId + '_' + message.mid;\n a.dir = 'auto';\n a.append(await wrapMessageForReply(message, undefined, undefined, plain as any));\n return a;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\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 = async(peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\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, _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(pinnedMessage, plain));\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(plain ? action.title : htmlToSpan(wrapEmojiText(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 langPackKey = 'PaymentSuccessfullyPaidNoItem';\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 = 'PaymentSuccessfullyPaid';\n args.push(wrapLinkToMessage(invoiceMessage, plain).then((el) => {\n el.classList.add('is-receipt-link');\n return el;\n }));\n }\n }\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 { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\nimport wrapMessageActionTextNewUnsafe from \"./messageActionTextNewUnsafe\";\n\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain: true): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain?: false): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain: boolean): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain?: boolean): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('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 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 } 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 wrapMessageActionTextNew from \"./messageActionTextNew\";\n\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\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('i');\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;\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] 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 addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\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 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 let 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('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport choosePhotoSize from \"../../lib/appManagers/utils/photos/choosePhotoSize\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\nimport wrapMessageForReply from \"../wrappers/messageForReply\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport async function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(await wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n await wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n await wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(await wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach((child) => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, async(title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = await wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { hexToRgb } from \"../../helpers/color\";\nimport { Message } from \"../../layer\";\nimport getPeerColorById from \"../../lib/appManagers/utils/peers/getPeerColorById\";\nimport ReplyContainer from \"../chat/replyContainer\";\n\nexport default function wrapReply(\n title: Parameters[0], \n subtitle: Parameters[1], \n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply');\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 createVideo from \"../../helpers/dom/createVideo\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport { 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 from \"../animationIntersector\";\nimport LazyLoadQueue from \"../lazyLoadQueue\";\nimport wrapSticker from \"./sticker\";\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: string,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\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 });\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 const promise = managers.appStickersManager.getStickerSet(set);\n const stickerSet = await promise;\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc: stickerSet.documents[0],\n div: container, \n group: group,\n lazyLoadQueue,\n managers,\n width,\n height\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport insertInDescendSortedArray from \"./array/insertInDescendSortedArray\";\nimport { getMiddleware } from \"./middleware\";\nimport safeAssign from \"./object/safeAssign\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\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, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\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 safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public 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, true);\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 return callback(false);\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 add(\n id: SortedElementId, \n batch = false, \n updateElementWith?: SortedList['updateElementWith'], \n updateBatch = batch\n ) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\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(\n id: SortedElementId, \n batch = false, \n element = this.get(id), \n updateElementWith?: SortedList['updateElementWith']\n ) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\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 appDialogsManager, { AppDialogsManager, DialogDom } 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 = 48;\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 lazyLoadQueue: this.lazyLoadQueue\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 { IS_APPLE } from \"../../environment/userAgent\";\nimport contextMenuController from \"../contextMenuController\";\nimport ListenerSetter 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(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\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 if(IS_APPLE && IS_TOUCH_SUPPORTED) {\n let timeout: number;\n\n const options: EventListenerOptions = {capture: true};\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.touches[0]);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n });\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 element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback);\n }\n}\n","/*\n * 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) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\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 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\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 ListenerSetter from \"../helpers/listenerSetter\";\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n textArgs?: FormatterArguments,\n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean | any, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n // ripple(el);\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) textElement.innerHTML = options.regularText;\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 ? */ (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 const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n contextMenuController.closeBtnMenu();\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 return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = 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\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer({peerId});\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 PeerTitle from \"../peerTitle\";\nimport hasRights from \"../../lib/appManagers/utils/chats/hasRights\";\nimport filterAsync from \"../../helpers/array/filterAsync\";\n\nexport default class PopupDeleteMessages {\n constructor(private peerId: PeerId, private mids: number[], private type: ChatType, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm} = this;\n\n const peerTitleElement = new PeerTitle({peerId}).element;\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 let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\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 buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\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 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 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}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { 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 { toast } from \"../toast\";\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 rootScope from \"../../lib/rootScope\";\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;\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(listenElement, (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 }, listenerSetter);\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(element, 'is-selected', false, 200);\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 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 && 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 this.onToggleSelection && 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 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(element, 'is-selected', isSelected, 200);\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(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\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 SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\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('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(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\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 //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.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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\n * 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({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\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 let {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 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 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 let top: number;\n\n 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","/*\n * 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, { DIALOG_LIST_ELEMENT_TAG } from \"../lib/appManagers/appDialogsManager\";\nimport type { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\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 { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport { ChannelParticipant, 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 ButtonMenu, { ButtonMenuItemOptions } 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 getAbbreviation from \"../lib/richTextProcessor/getAbbreviation\";\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\";\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 = (e: MouseEvent) => {\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(attachTo, onContextMenu as any, listenerSetter);\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 = ButtonMenu(this.buttons);\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: () => boolean, \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 public urlsToRevoke: string[] = [];\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 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 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 {dom} = appDialogsManager.addDialogNew({\n peerId: message.peerId, \n container: searchGroup.list, \n avatarSize: 54,\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any, \n lastMessage: message, \n dom, \n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises);\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 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 [wrapped.images.thumb, wrapped.images.full].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;\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 //this.log.error('NO ENTITY:', message);\n const match = matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\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 let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\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, getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true));\n }\n \n let 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 /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\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.filter(Boolean));\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 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 : messages.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(let 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: 48,\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && (peer.participants_count || peer.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.innerHTML = '' + 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)\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.appMessagesManager.getConversations(query, 0, 20, 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.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n let {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 48,\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 //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n peerId: peer.id, \n container: this.searchGroups.people.list, \n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\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 let 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] ?? (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 let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let 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 let 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 = this.searchContext.peerId;\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),\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 }\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 public 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 return Promise.all([\n this.searchContext.peerId.isAnyChat(),\n this.managers.appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()),\n this.managers.appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants')\n ]).then(([isAnyChat, isBroadcast, hasRights]) => {\n return isAnyChat && !isBroadcast && hasRights;\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 if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\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.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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport contextMenuController from \"../helpers/contextMenuController\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\n\r\nconst ButtonMenuToggle = (\r\n options: Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n listenerSetter: ListenerSetter, \r\n asDiv: boolean,\r\n container: HTMLElement\r\n }> = {}, \r\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', \r\n buttons: ButtonMenuItemOptions[], \r\n onOpen?: (e: Event) => void,\r\n onClose?: () => void\r\n) => {\r\n options.asDiv = true;\r\n const button = options.container ?? ButtonIcon('more', options);\r\n button.classList.add('btn-menu-toggle');\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options, onClose);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void | Promise, options?: AttachClickOptions, onClose?: () => void) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n contextMenuController.closeBtnMenu();\r\n } else {\r\n const result = onOpen && onOpen(e);\r\n const open = () => {\r\n contextMenuController.openBtnMenu(openedMenu, onClose);\r\n };\r\n\r\n if(result instanceof Promise) {\r\n result.then(open);\r\n } else {\r\n open();\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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 let 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","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport getPrivacyRulesDetails from \"../lib/appManagers/utils/privacy/getPrivacyRulesDetails\";\r\nimport PrivacyType from \"../lib/appManagers/utils/privacy/privacyType\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey],\r\n managers: AppManagers\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n const managers = options.managers;\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter((r) => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n options.tab.slider.createTab(AppAddMembersTab).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\r\n const details = getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach((k) => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map((id) => id.toPeerId()));\r\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', async() => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n const a = ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>);\r\n for(const [k, chatKey, usersKey] of a) {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({\r\n _: usersKey, \r\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\r\n });\r\n }\r\n }\r\n }\r\n }\r\n \r\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else if(caption instanceof HTMLElement) {\r\n replaceContent(captionElement, caption);\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach((peerId) => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { i18n, LangPackKey } from \"../../../../lib/langPack\";\r\nimport anchorCopy from \"../../../../helpers/dom/anchorCopy\";\r\nimport PrivacyType from \"../../../../lib/appManagers/utils/privacy/privacyType\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\r\n const captionEl = document.createElement('div');\r\n captionEl.append(\r\n i18n('PrivacyPhoneInfo'), \r\n document.createElement('br'), \r\n document.createElement('br'), \r\n i18n('PrivacyPhoneInfo4'),\r\n document.createElement('br'),\r\n anchorCopy({\r\n mePath: formatted\r\n })\r\n );\r\n\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [captionEl, captionEl, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n },\r\n managers: this.managers\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { toastNew } from \"../../components/toast\";\nimport { copyTextToClipboard } from \"../clipboard\";\nimport cancelEvent from \"./cancelEvent\";\nimport { attachClickEvent } from \"./clickEvent\";\n\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n if(options.mePath) {\n const href = 'https://t.me/' + options.mePath;\n anchor.href = anchor.innerText = href;\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(anchor.href);\n toastNew({langPackKey: 'LinkCopied'});\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 { AppManagers } from \"../../lib/appManagers/managers\";\nimport rootScope from \"../../lib/rootScope\";\nimport wrapSticker from \"./sticker\"\n\nexport default async function wrapStickerEmoji({emoji, div, width, height, managers = rootScope.managers}: {\n emoji: string,\n div: HTMLElement,\n managers?: AppManagers,\n width: number,\n height: number\n}) {\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 doc,\n div,\n emoji,\n width,\n height,\n loop: false,\n play: true\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n captionOld: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n emoji,\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../putPreloader\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n this.managers.passwordManager.confirmPasswordEmail('' + code)\r\n .then((value) => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch((err) => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","import { EMAIL_REG_EXP } from \".\";\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../putPreloader\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport matchEmail from \"../../../../lib/richTextProcessor/matchEmail\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n this.managers.passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n this.managers.passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const stickerContainer = document.createElement('div');\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport cancelEvent from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../../../helpers/dom/setInnerHTML\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport wrapEmojiText from \"../../../../lib/richTextProcessor/wrapEmojiText\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../putPreloader\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return this.managers.passwordManager.getState().then((_state) => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'PASSWORD_HASH_INVALID';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport wrapStickerEmoji from \"../../../wrappers/stickerEmoji\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport PrivacyType from \"../../../../lib/appManagers/utils/privacy/privacyType\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport PrivacyType from \"../../../../lib/appManagers/utils/privacy/privacyType\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport { toast } from \"../../toast\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport findAndSplice from \"../../../helpers/array/findAndSplice\";\r\nimport { attachContextMenuListener } from \"../../../helpers/dom/attachContextMenuListener\";\r\nimport positionMenu from \"../../../helpers/positionMenu\";\r\nimport contextMenuController from \"../../../helpers/contextMenuController\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n \r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach((auth) => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then((value) => {\r\n if(value) {\r\n target.remove();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n contextMenuController.openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager, { DIALOG_LIST_ELEMENT_TAG } from \"../../../lib/appManagers/appDialogsManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport formatUserPhone from \"../../wrappers/formatUserPhone\";\r\nimport getUserStatusString from \"../../wrappers/getUserStatusString\";\r\nimport { attachContextMenuListener } from \"../../../helpers/dom/attachContextMenuListener\";\r\nimport positionMenu from \"../../../helpers/positionMenu\";\r\nimport contextMenuController from \"../../../helpers/contextMenuController\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n section.caption.parentElement.prepend(section.caption);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n this.managers.appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n section.content.append(list);\r\n\r\n const add = async(peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: list,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = await this.managers.appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : getUserStatusString(user));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n this.managers.appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n contextMenuController.openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\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 { addCancelButton } from \"./popups\";\nimport PopupPeer, { 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(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\nimport getPrivacyRulesDetails from \"../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails\";\r\nimport PrivacyType from \"../../../lib/appManagers/utils/privacy/privacyType\";\r\nimport confirmationPopup, { PopupConfirmationOptions } from \"../../confirmationPopup\";\r\nimport noop from \"../../../helpers/noop\";\r\nimport { toastNew } from \"../../toast\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppBlockedUsersTab);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n this.managers.passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = this.slider.createTab(AppTwoStepVerificationTab);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppActiveSessionsTab);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.updateActiveSessions();\r\n }, {once: true});\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n this.managers.appUsersManager.getBlocked().then((res) => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n this.managers.passwordManager.getState().then((state) => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyLastSeenTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyCallsTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\r\n const details = getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(\r\n numberVisibilityRow.container, \r\n lastSeenTimeRow.container, \r\n photoVisibilityRow.container, \r\n callRow.container, \r\n linkAccountRow.container, \r\n groupChatsAddRow.container\r\n );\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(this.managers.apiManager.invokeApi('account.getContentSettings').then((settings) => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n this.managers.apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\r\n\r\n const onClearClick = () => {\r\n const options: PopupConfirmationOptions = {\r\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\r\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\r\n button: {\r\n langKey: 'Clear'\r\n },\r\n checkboxes: [{\r\n text: 'PrivacyClearShipping', \r\n checked: true\r\n }, {\r\n text: 'PrivacyClearPayment', \r\n checked: true\r\n }]\r\n };\r\n\r\n confirmationPopup(options).then(() => {\r\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\r\n const toggle = toggleDisability([clearButton], true);\r\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\r\n if(!info && !payment) {\r\n return;\r\n }\r\n\r\n toggle();\r\n toastNew({\r\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\r\n });\r\n });\r\n }, noop);\r\n };\r\n\r\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\r\n this.listenerSetter.add(clearButton)('click', onClearClick);\r\n section.content.append(clearButton);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\r\n const context = canvas.getContext('2d');\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n return outPixel;\r\n}\r\n\r\nexport function averageColor(imageUrl: string) {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n resolve(averageColorFromCanvas(canvas));\r\n });\r\n });\r\n};\r\n","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\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 { animate } from \"../../helpers/animation\";\nimport { hexToRgb } from \"../../helpers/color\";\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, 25, 50, 75, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, \n 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1830, 1860, 1890, 1920, \n 1950, 1980, 2010, 2040, 2070, 2100, 2130, 2160, 2190, 2220, 2250, 2280, 2310, \n 2340, 2370, 2400, 2430, 2460, 2490, 2520, 2550, 2580, 2610, 2630, 2640, 2650, \n 2660, 2670, 2680, 2690, 2700\n ]; */\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\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 while(shift > 0) {\n positions.push(positions.shift());\n --shift;\n }\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 drawOnWheel = () => {\n let diff = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n diff = diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n if(diff) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = () => {\n const frames = this._frames;\n const id = frames.shift();\n if(id) {\n this.drawImageData(id);\n }\n \n const leftLength = frames.length;\n if(!leftLength) {\n this._animatingToNextPosition = undefined;\n }\n\n return !!leftLength;\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() {\n if(this._colors.length < 2) {\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 animate(this.drawNextPositionAnimated);\n }\n\n public scrollAnimate(start?: boolean) {\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","import { ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla } from \"../helpers/color\";\r\nimport attachGrabListeners from \"../helpers/dom/attachGrabListeners\";\r\nimport clamp from \"../helpers/number/clamp\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\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])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { Theme } from \"../../../config/state\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport themeController from \"../../../helpers/themeController\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = themeController.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach((color) => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n \r\n background.id = '2';\r\n background.intensity = 0;\r\n background.slug = '';\r\n background.color = hex.toLowerCase();\r\n background.highlightningColor = hsla;\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n const color = (background.color || '').split(',')[0];\r\n const isColored = !!color && !background.slug;\r\n \r\n // * set active if type is color\r\n if(isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(color || '#cccccc');\r\n \r\n if(!isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","import type { MediaSize } from \"../mediaSize\";\n\nexport default function scaleMediaElement(options: {\n media: CanvasImageSource, \n mediaSize?: MediaSize, \n boxSize?: MediaSize, \n quality?: number,\n mimeType?: 'image/jpeg' | 'image/png',\n size?: MediaSize\n}): Promise<{blob: Blob, size: MediaSize}> {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n canvas.width = size.width * window.devicePixelRatio;\n canvas.height = size.height * window.devicePixelRatio;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\n canvas.toBlob((blob) => {\n resolve({blob, size});\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection } from \"..\";\r\nimport { averageColor, averageColorFromCanvas } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport deferredPromise, { CancellablePromise } from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport ChatBackgroundGradientRenderer from \"../../chat/gradientRenderer\";\r\nimport { Document, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager, { AppDownloadManager, DownloadBlob } from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\nimport choosePhotoSize from \"../../../lib/appManagers/utils/photos/choosePhotoSize\";\r\nimport { STATE_INIT, Theme } from \"../../../config/state\";\r\nimport themeController from \"../../../helpers/themeController\";\r\nimport requestFile from \"../../../helpers/files/requestFile\";\r\nimport { renderImageFromUrlPromise } from \"../../../helpers/dom/renderImageFromUrl\";\r\nimport scaleMediaElement from \"../../../helpers/canvas/scaleMediaElement\";\r\nimport { MediaSize } from \"../../../helpers/mediaSize\";\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n private wallPapersByElement: Map = new Map();\r\n private elementsByKey: Map = new Map();\r\n\r\n private get theme() {\r\n return themeController.getTheme();\r\n }\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n this.slider.createTab(AppBackgroundColorTab).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n const wallpaper = this.wallPapersByElement.get(active);\r\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\r\n return;\r\n }\r\n \r\n this.setBackgroundDocument(wallpaper);\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n this.managers.appDocsManager.getWallPapers().then((wallPapers) => {\r\n wallPapers.forEach((wallPaper) => {\r\n this.addWallPaper(wallPaper);\r\n });\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\r\n if(file.name.endsWith('.png')) {\r\n const img = document.createElement('img');\r\n const url = URL.createObjectURL(file);\r\n await renderImageFromUrlPromise(img, url, false);\r\n const mimeType = 'image/jpeg';\r\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\r\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\r\n }\r\n\r\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\r\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\r\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\r\n deferred.cancel = uploadDeferred.cancel;\r\n\r\n uploadDeferred.then((wallPaper) => {\r\n this.clicked.delete(key);\r\n this.elementsByKey.delete(key);\r\n this.wallPapersByElement.set(container, wallPaper);\r\n const newKey = this.getWallPaperKey(wallPaper);\r\n this.elementsByKey.set(newKey, container);\r\n\r\n this.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n\r\n const key = this.getWallPaperKey(wallPaper);\r\n deferred.catch(() => {\r\n container.remove();\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallPaper, false);\r\n this.clicked.add(key);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private getColorsFromWallPaper(wallPaper: WallPaper) {\r\n return wallPaper.settings ? [\r\n wallPaper.settings.background_color,\r\n wallPaper.settings.second_background_color,\r\n wallPaper.settings.third_background_color,\r\n wallPaper.settings.fourth_background_color\r\n ].filter(Boolean).map((color) => '#' + color.toString(16)).join(',') : '';\r\n }\r\n\r\n private getWallPaperKey(wallPaper: WallPaper) {\r\n return '' + wallPaper.id;\r\n }\r\n\r\n private getWallPaperKeyFromTheme(theme: Theme) {\r\n return '' + theme.background.id;\r\n }\r\n\r\n private addWallPaper(wallPaper: WallPaper, append = true) {\r\n const colors = this.getColorsFromWallPaper(wallPaper);\r\n const hasFile = wallPaper._ === 'wallPaper';\r\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\r\n return;\r\n }\r\n\r\n const isDark = !!wallPaper.pFlags.dark;\r\n\r\n const doc = hasFile ? wallPaper.document as Document.document : undefined;\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n container.dataset.id = '' + wallPaper.id;\r\n\r\n const key = this.getWallPaperKey(wallPaper);\r\n this.wallPapersByElement.set(container, wallPaper);\r\n this.elementsByKey.set(key, container);\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n let wrapped: ReturnType, size: PhotoSize;\r\n if(hasFile) {\r\n size = choosePhotoSize(doc, 200, 200);\r\n wrapped = wrapPhoto({\r\n photo: doc,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: size,\r\n noFadeIn: wallPaper.pFlags.pattern\r\n });\r\n\r\n if(wallPaper.pFlags.pattern) {\r\n media.classList.add('is-pattern');\r\n }\r\n\r\n wrapped.then(async({loadPromises, images}) => {\r\n await loadPromises.thumb || loadPromises.full;\r\n return images;\r\n }).then((images) => {\r\n if(wallPaper.pFlags.pattern) {\r\n if(isDark) {\r\n images.full.style.display = 'none';\r\n if(images.thumb) {\r\n images.thumb.style.display = 'none';\r\n }\r\n } else if(wallPaper.settings?.intensity) {\r\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\r\n }\r\n }\r\n\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n } else {\r\n container.append(media);\r\n }\r\n\r\n if(wallPaper.settings && wallPaper.settings.background_color !== undefined) {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\r\n canvas.classList.add('background-colors-canvas');\r\n \r\n if(isDark && hasFile) {\r\n wrapped.then(({loadPromises}) => {\r\n loadPromises.full.then(async() => {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\r\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\r\n canvas.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\r\n media.append(canvas);\r\n });\r\n });\r\n } else {\r\n media.append(canvas);\r\n }\r\n }\r\n\r\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\r\n container.classList.add('active');\r\n }\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const wallpaper = this.wallPapersByElement.get(target);\r\n if(wallpaper._ === 'wallPaperNoFile') {\r\n this.setBackgroundDocument(wallpaper);\r\n return;\r\n }\r\n \r\n const key = this.getWallPaperKey(wallpaper);\r\n if(this.clicked.has(key)) return;\r\n this.clicked.add(key);\r\n \r\n const doc = wallpaper.document as MyDocument;\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const load = async() => {\r\n const promise = this.setBackgroundDocument(wallpaper);\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then((response) => {\r\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (wallPaper: WallPaper) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\r\n const deferred = deferredPromise();\r\n let download: Promise | ReturnType;\r\n if(doc) {\r\n download = appDownloadManager.downloadMediaURL({media: doc, queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0});\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n } else {\r\n download = Promise.resolve();\r\n }\r\n\r\n download.then(async() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url?: string) => {\r\n //const perf = performance.now();\r\n let getPixelPromise: Promise;\r\n if(url && !this.theme.background.color) {\r\n getPixelPromise = averageColor(url);\r\n } else {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(this.getColorsFromWallPaper(wallPaper));\r\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\r\n }\r\n\r\n getPixelPromise.then((pixel) => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n \r\n const hsla = highlightningColor(Array.from(pixel) as any);\r\n // const hsla = 'rgba(0, 0, 0, 0.3)';\r\n //console.log(doc, hsla, performance.now() - perf);\r\n\r\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\r\n background.id = wallPaper.id;\r\n background.intensity = wallPaper.settings?.intensity ?? 0;\r\n background.color = this.getColorsFromWallPaper(wallPaper);\r\n background.slug = slug;\r\n background.highlightningColor = hsla;\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n if(slug) {\r\n this.saveToCache(slug, url);\r\n }\r\n\r\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\r\n });\r\n };\r\n\r\n if(!doc) {\r\n onReady();\r\n return;\r\n }\r\n\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n const {canvas, promise} = blur(cacheContext.url, 12, 4)\r\n promise.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(canvas.toDataURL());\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n };\r\n}\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement from \".\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../putPreloader\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { toastNew } from \"../toast\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\r\n\r\n this.title.append(i18n('Loading'));\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.scrollable.append(div);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return this.managers.appStickersManager.getStickerSet(this.stickerSetInput).then(async(set) => {\r\n if(!set) {\r\n toastNew({langPackKey: 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n let button: HTMLElement;\r\n const s = i18n('Stickers', [set.set.count]);\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [s]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [s]));\r\n }\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n this.managers.appStickersManager.toggleStickerSet(set.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const divs = await Promise.all(set.documents.map(async(doc) => {\r\n if(doc._ === 'documentEmpty') {\r\n return;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n await wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n return div;\r\n }));\r\n\r\n setInnerHTML(this.title, wrapEmojiText(set.set.title));\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n this.stickersDiv.append(...divs.filter(Boolean));\r\n\r\n this.scrollable.onAdditionalScroll();\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SettingSection } from \"..\";\nimport RadioField from \"../../radioField\";\nimport Row, { RadioFormFromRows } from \"../../row\";\nimport SliderSuperTab from \"../../sliderTab\";\nimport { wrapStickerToRow } from \"../../wrappers\";\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n protected init() {\n this.header.classList.add('with-border');\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.reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction(value);\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection, SettingSection } from \"..\";\r\nimport RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport { wrapStickerSetThumb, wrapStickerToRow } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport IS_GEOLOCATION_SUPPORTED from \"../../../environment/geolocationSupport\";\r\nimport AppQuickReactionTab from \"./quickReaction\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\nimport { State } from \"../../../config/state\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n public valueContainer: HTMLElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(\r\n name: LangPackKey, \r\n step: number, \r\n initialValue: number, \r\n minValue: number, \r\n maxValue: number,\r\n writeValue = true\r\n ) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = this.valueContainer = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n\r\n if(writeValue) {\r\n valueDiv.innerHTML = '' + initialValue;\r\n }\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step, \r\n min: minValue, \r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n if(writeValue) {\r\n //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n this.slider.createTab(AppBackgroundTab).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n if(IS_GEOLOCATION_SUPPORTED) {\r\n const container = section('DistanceUnitsTitle');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'distance-unit';\r\n const stateKey = 'settings.distanceUnit';\r\n\r\n const kilometersRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsKilometers', \r\n name, \r\n value: 'kilometers', \r\n stateKey\r\n })\r\n });\r\n\r\n const milesRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsMiles',\r\n name,\r\n value: 'miles', \r\n stateKey\r\n })\r\n });\r\n \r\n form.append(kilometersRow.container, milesRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('General.TimeFormat');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'time-format';\r\n const stateKey = 'settings.timeFormat';\r\n\r\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\r\n ['h12', 'General.TimeFormat.h12'], \r\n ['h23', 'General.TimeFormat.h23']\r\n ];\r\n\r\n const rows = formats.map(([format, langPackKey]) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey, \r\n name, \r\n value: format, \r\n stateKey\r\n })\r\n });\r\n\r\n return row;\r\n });\r\n\r\n const cancel = eachMinute(() => {\r\n const date = new Date();\r\n\r\n formats.forEach(([format], idx) => {\r\n const str = date.toLocaleTimeString(\"en-us-u-hc-\" + format, {\r\n hour: '2-digit', \r\n minute: '2-digit'\r\n });\r\n\r\n rows[idx].subtitle.textContent = str;\r\n });\r\n });\r\n\r\n this.eventListener.addEventListener('destroy', cancel);\r\n\r\n form.append(...rows.map((row) => row.container));\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\r\n\r\n const reactionsRow = new Row({\r\n titleLangKey: 'DoubleTapSetting',\r\n havePadding: true,\r\n clickable: () => {\r\n this.slider.createTab(AppQuickReactionTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const renderQuickReaction = () => {\r\n Promise.resolve(this.managers.appReactionsManager.getQuickReaction()).then((reaction) => {\r\n wrapStickerToRow({\r\n row: reactionsRow,\r\n doc: reaction.static_icon,\r\n size: 'small'\r\n });\r\n });\r\n };\r\n\r\n renderQuickReaction();\r\n\r\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const stickersContent = section.generateContentElement();\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n stickersContent[method](row.container);\r\n };\r\n\r\n this.managers.appStickersManager.getAllStickers().then((allStickers) => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n section.content.append(reactionsRow.container, suggestCheckboxField.label, loopCheckboxField.label);\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { generateSection, SettingSection } from \"..\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n const appConfig = await this.managers.apiManager.getAppConfig();\r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: rootScope.premium ? appConfig.about_length_limit_premium : appConfig.about_length_limit_default\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n }, this.managers);\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n section.content.append(inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(this.managers.appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\r\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = await this.managers.appUsersManager.getSelf();\r\n\r\n const userFull = await this.managers.appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n attachClickEvent(this.confirmBtn, async() => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.dialogsByFilters = new Map();\r\n return this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\r\n await Promise.all(filters.map(async(filter) => {\r\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\r\n const peerIds = dialogs.map((d) => d.peerId);\r\n this.dialogsByFilters.set(filter, new Set(peerIds));\r\n }));\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await this.managers.appUsersManager.getContacts();\r\n peerIds.forEach((peerId) => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: this.selector.scrollable,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n setInnerHTML(span, wrapEmojiText(filter.title));\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach((el) => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n /////////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container, \r\n onChange: this.onSelectChange, \r\n peerType: ['dialogs'], \r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats',\r\n managers: this.managers\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport InputField from \"../../inputField\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport deepEqual from \"../../../helpers/object/deepEqual\";\r\nimport documentFragmentToHTML from \"../../../helpers/dom/documentFragmentToHTML\";\r\nimport wrapDraftText from \"../../../lib/richTextProcessor/wrapDraftText\";\r\nimport filterAsync from \"../../../helpers/array/filterAsync\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputSection = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameHint',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\r\n inputSection.content.append(inputWrapper);\r\n\r\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\r\n const section = new SettingSection({\r\n name: h2Text,\r\n noDelimiter: true\r\n });\r\n\r\n section.container.classList.add('folder-list', className);\r\n\r\n const categories = section.generateContentElement();\r\n categories.classList.add('folder-categories');\r\n\r\n buttons.forEach((o) => {\r\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\r\n icon: o.icon,\r\n text: o.text,\r\n noRipple: o.withRipple ? undefined : true\r\n });\r\n\r\n if(o.name) {\r\n to[o.name] = button;\r\n }\r\n\r\n categories.append(button);\r\n });\r\n\r\n return section;\r\n };\r\n\r\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\r\n icon: 'add primary',\r\n text: 'ChatList.Filter.Include.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.Contacts',\r\n icon: 'newprivate',\r\n name: 'contacts'\r\n }, {\r\n text: 'ChatList.Filter.NonContacts',\r\n icon: 'noncontacts',\r\n name: 'non_contacts'\r\n }, {\r\n text: 'ChatList.Filter.Groups',\r\n icon: 'group',\r\n name: 'groups'\r\n }, {\r\n text: 'ChatList.Filter.Channels',\r\n icon: 'channel',\r\n name: 'broadcasts'\r\n }, {\r\n text: 'ChatList.Filter.Bots',\r\n icon: 'bots',\r\n name: 'bots'\r\n }], this.flags);\r\n\r\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\r\n icon: 'minus primary',\r\n text: 'ChatList.Filter.Exclude.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.MutedChats',\r\n icon: 'mute',\r\n name: 'exclude_muted'\r\n }, {\r\n text: 'ChatList.Filter.Archive',\r\n icon: 'archive',\r\n name: 'exclude_archived'\r\n }, {\r\n text: 'ChatList.Filter.ReadChats',\r\n icon: 'readchats',\r\n name: 'exclude_read'\r\n }], this.flags);\r\n\r\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\r\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\r\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(this.confirmBtn, () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then((bool) => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch((err) => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n \r\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then((player) => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = documentFragmentToHTML(wrapDraftText(filter.title));\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList({ignoreClick: true});\r\n\r\n let peers = filter[key];\r\n\r\n // filter peers where we're kicked\r\n const hasPeer = async(peerId: PeerId) => {\r\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\r\n };\r\n \r\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\r\n peers.length = 0;\r\n peers.push(...filtered);\r\n\r\n peers = peers.slice();\r\n\r\n const renderMore = async(_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\r\n continue;\r\n }\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: ul,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n if(this.container) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\r\n }\r\n\r\n if(firstTime) {\r\n this.originalFilter = filter;\r\n this.filter = copy(filter);\r\n } else {\r\n this.filter = filter;\r\n this.onEditOpen();\r\n this.editCheckForChange();\r\n }\r\n }\r\n\r\n public open(filter?: DialogFilter) {\r\n if(filter === undefined) {\r\n this.setFilter({\r\n _: 'dialogFilter',\r\n id: 0,\r\n title: '',\r\n pFlags: {},\r\n pinned_peers: [],\r\n include_peers: [],\r\n exclude_peers: [],\r\n pinnedPeerIds: [],\r\n includePeerIds: [],\r\n excludePeerIds: []\r\n }, true);\r\n this.type = 'create';\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n }\r\n\r\n return super.open().then(() => {\r\n if(this.type === 'edit') {\r\n this.setFilter(this.originalFilter, true);\r\n this.onEditOpen();\r\n } else {\r\n this.onCreateOpen();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport cancelEvent from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private async renderFolder(dialogFilter: DialogFilterSuggested | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter as MyDialogFilter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n await Promise.all(folder.map(async(dialog) => {\r\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }));\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach((el) => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, async() => {\r\n this.slider.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach((el) => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, async() => {\r\n const appConfig = await this.managers.apiManager.getAppConfig();\r\n if(Object.keys(this.filtersRendered).length >= (rootScope.premium ? appConfig.dialog_filters_limit_premium : appConfig.dialog_filters_limit_default)) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n this.slider.createTab(AppEditFolderTab).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\r\n for(const filter of filters) {\r\n await this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n await this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n await this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then((player) => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\r\n\r\n for(const filter of suggestedFilters) {\r\n const div = await this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n this.managers.filtersStorage.createDialogFilter(f, true).then((bool) => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport copy from \"../../../helpers/object/copy\";\r\nimport convertKeyToInputKey from \"../../../helpers/string/convertKeyToInputKey\";\r\nimport { MUTE_UNTIL } from \"../../../lib/mtproto/mtproto_config\";\r\nimport apiManagerProxy from \"../../../lib/mtproto/mtprotoworker\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('notifications-container', 'with-border');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = async() => {\r\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', async() => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = Promise.all([\r\n this.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'web'\r\n }),\r\n this.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }),\r\n ]).then(([languages1, languages2]) => {\r\n const rendered: Set = new Set();\r\n const webLangCodes = languages1.map((language) => language.lang_code);\r\n\r\n const random = randomLong();\r\n languages1.concat(languages2).forEach((language) => {\r\n if(rendered.has(language.lang_code)) return;\r\n rendered.add(language.lang_code);\r\n\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value, webLangCodes.includes(value));\r\n });\r\n \r\n I18n.getCacheLangPack().then((langPack) => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SettingSection } from \"../..\";\nimport ListenerSetter from \"../../../../helpers/listenerSetter\";\nimport { LangPackKey } from \"../../../../lib/langPack\";\nimport CheckboxField from \"../../../checkboxField\";\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\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 withRipple: true,\n listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats', \n name: 'private',\n stateKey: key + 'private',\n withRipple: true,\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats', \n name: 'groups',\n stateKey: key + 'groups',\n withRipple: true,\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels', \n name: 'channels',\n stateKey: key + 'channels',\n withRipple: true,\n listenerSetter\n });\n\n section.content.append(\n contactsCheckboxField.label, \n privateCheckboxField.label, \n groupsCheckboxField.label, \n channelsCheckboxField.label\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\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 protected init() {\n this.header.classList.add('with-border');\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 protected init() {\n this.header.classList.add('with-border');\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 { SettingSection } from \"..\";\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\";\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 protected async init() {\n this.header.classList.add('with-border');\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 withRipple: true\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 = new tabConstructor(this.slider, true);\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 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 autoCheckboxField.label,\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 const gifsCheckboxField = new CheckboxField({\n text: 'AutoplayGIF', \n name: 'gifs', \n stateKey: 'settings.autoPlay.gifs',\n withRipple: true,\n listenerSetter: this.listenerSetter\n });\n const videosCheckboxField = new CheckboxField({\n text: 'AutoplayVideo', \n name: 'videos', \n stateKey: 'settings.autoPlay.videos',\n withRipple: true,\n listenerSetter: this.listenerSetter\n });\n\n section.content.append(gifsCheckboxField.label, videosCheckboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey, 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport Button from \"../../button\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport AppGeneralSettingsTab from \"./generalSettings\";\r\nimport AppEditProfileTab from \"./editProfile\";\r\nimport AppChatFoldersTab from \"./chatFolders\";\r\nimport AppNotificationsTab from \"./notifications\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/rlottie/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport AppDataAndStorageTab from \"./dataAndStorage\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport PeerProfile from \"../../peerProfile\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SliderSuperTabConstructable } from \"../../sliderTab\";\r\nimport PopupAvatar from \"../../popups/avatar\";\r\nimport { AccountAuthorizations, Authorization } from \"../../../layer\";\r\nimport PopupElement from \"../../popups\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n storage: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n } = {} as any;\r\n private profile: PeerProfile;\r\n\r\n private languageRow: Row;\r\n private devicesRow: Row;\r\n\r\n private authorizations: Authorization.authorization[];\r\n private getAuthorizationsPromise: Promise;\r\n\r\n protected async init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n this.managers.apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.buttons.edit = ButtonIcon('edit');\r\n\r\n this.header.append(this.buttons.edit, btnMenu);\r\n\r\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\r\n this.profile.init();\r\n this.profile.setPeer(rootScope.myId);\r\n const fillPromise = this.profile.fillProfileElements();\r\n\r\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\r\n attachClickEvent(changeAvatarBtn, () => {\r\n const canvas = document.createElement('canvas');\r\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\r\n upload().then((inputFile) => {\r\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\r\n \r\n const updateChangeAvatarBtn = async() => {\r\n const user = await this.managers.appUsersManager.getSelf();\r\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\r\n };\r\n \r\n updateChangeAvatarBtn();\r\n this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\r\n if(rootScope.myId === peerId) {\r\n updateChangeAvatarBtn();\r\n }\r\n });\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n \r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n \r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const b: [string, LangPackKey, SliderSuperTabConstructable][] = [\r\n ['unmute', 'AccountSettings.Notifications', AppNotificationsTab],\r\n ['data', 'DataSettings', AppDataAndStorageTab],\r\n ['lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab],\r\n ['settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab],\r\n ['folder', 'AccountSettings.Filters', AppChatFoldersTab],\r\n ];\r\n\r\n const rows = b.map(([icon, langPackKey, tabConstructor]) => {\r\n return new Row({\r\n titleLangKey: langPackKey,\r\n icon,\r\n clickable: () => {\r\n this.slider.createTab(tabConstructor).open();\r\n // new tabConstructor(this.slider, true).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n });\r\n\r\n rows.push(\r\n this.devicesRow = new Row({\r\n titleLangKey: 'Devices',\r\n titleRightSecondary: ' ',\r\n icon: 'activesessions',\r\n clickable: async() => {\r\n if(!this.authorizations) {\r\n await this.updateActiveSessions();\r\n }\r\n\r\n const tab = this.slider.createTab(AppActiveSessionsTab);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.authorizations = undefined;\r\n this.updateActiveSessions(true);\r\n }, {once: true});\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n }),\r\n\r\n this.languageRow = new Row({\r\n titleLangKey: 'AccountSettings.Language',\r\n titleRightSecondary: i18n('LanguageName'),\r\n icon: 'language',\r\n clickable: () => {\r\n this.slider.createTab(AppLanguageTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n })\r\n );\r\n\r\n buttonsDiv.append(...rows.map((row) => row.container));\r\n\r\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\r\n // profileSection.content.append(this.profile.element);\r\n\r\n const buttonsSection = new SettingSection();\r\n buttonsSection.content.append(buttonsDiv);\r\n\r\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\r\n\r\n attachClickEvent(this.buttons.edit, () => {\r\n const tab = this.slider.createTab(AppEditProfileTab);\r\n tab.open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.updateActiveSessions();\r\n\r\n await fillPromise;\r\n }\r\n\r\n private getAuthorizations(overwrite?: boolean) {\r\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\r\n\r\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\r\n .finally(() => {\r\n if(this.getAuthorizationsPromise === promise) {\r\n this.getAuthorizationsPromise = undefined;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public updateActiveSessions(overwrite?: boolean) {\r\n return this.getAuthorizations(overwrite).then((auths) => {\r\n this.authorizations = auths.authorizations;\r\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\r\n });\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.profile.destroy();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({\r\n caption: 'Channel.DescriptionHolderDescrpiton'\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.channelNameInputField = new InputField({\r\n label: 'EnterChannelName',\r\n maxLength: 128\r\n });\r\n\r\n this.channelDescriptionInputField = new InputField({\r\n label: 'DescriptionOptionalPlaceholder',\r\n maxLength: 255\r\n });\r\n\r\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\r\n\r\n const onLengthChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length && \r\n !this.channelNameInputField.input.classList.contains('error') && \r\n !this.channelDescriptionInputField.input.classList.contains('error'));\r\n };\r\n\r\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\r\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n attachClickEvent(this.nextBtn, () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n this.managers.appChatsManager.createChannel({\r\n title, \r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n\r\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n this.slider.createTab(AppAddMembersTab).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 protected 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 // 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 / 72 * 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 if(this.init) {\n this.init();\n this.init = null;\n }\n\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 / 72 * 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 public open() {\n this.openContacts();\n return super.open();\n }\n}\n","/*\n * 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 type { LOCAL_FOLDER_ID } from \"../../../lib/storages/dialogs\";\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: LOCAL_FOLDER_ID = 1;\n private wasFilterId: number;\n\n protected init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, {id: AppArchivedTab.filterId, orderIndex: 1} as any as MyDialogFilter).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport AppNewGroupTab from \"./newGroup\";\r\nimport { toast } from \"../../toast\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport { i18n, join, _i18n } from \"../../../lib/langPack\";\r\nimport rootScope from '../../../lib/rootScope';\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport SortedUserList from \"../../sortedUserList\";\r\nimport { PeerLocated, Update, Updates } from \"../../../layer\";\r\nimport { SettingChatListSection } from \"..\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport confirmationPopup from \"../../confirmationPopup\";\r\nimport getPeerId from \"../../../lib/appManagers/utils/peers/getPeerId\";\r\nimport type LazyLoadQueue from \"../../lazyLoadQueue\";\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueue;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n // protected async init() {\r\n // this.container.classList.add('people-nearby-container');\r\n // this.setTitle('PeopleNearby');\r\n\r\n // this.errorCategory = document.createElement('div');\r\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n // this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n // const emoji = '🧭';\r\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\r\n // const stickerContainer = document.createElement('div');\r\n // stickerContainer.classList.add('sticker-container');\r\n\r\n // if(doc) {\r\n // wrapSticker({\r\n // doc,\r\n // div: stickerContainer,\r\n // loop: false,\r\n // play: true,\r\n // width: 86,\r\n // height: 86,\r\n // emoji,\r\n // needUpscale: true\r\n // }).then(() => {\r\n // // this.animation = player;\r\n // });\r\n // } else {\r\n // stickerContainer.classList.add('media-sticker-wrapper');\r\n // }\r\n\r\n // const caption = document.createElement('div');\r\n // caption.classList.add('caption');\r\n // _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n // this.locatedPeers = new Map();\r\n\r\n // const m = () => {\r\n // const sortedUserList = new SortedUserList({\r\n // avatarSize: 42, \r\n // createChatListOptions: {\r\n // dialogSize: 48,\r\n // new: true\r\n // },\r\n // autonomous: false,\r\n // onUpdate: (element) => {\r\n // const peer = this.locatedPeers.get(element.id);\r\n // const elements: HTMLElement[] = [\r\n // this.parseDistance(peer.distance)\r\n // ];\r\n\r\n // if(!element.id.isUser()) {\r\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\r\n // }\r\n\r\n // element.dom.lastMessageSpan.textContent = '';\r\n // element.dom.lastMessageSpan.append(...join(elements, false));\r\n // },\r\n // getIndex: (element) => {\r\n // const peer = this.locatedPeers.get(element.id);\r\n // return 0x7FFFFFFF - peer.distance;\r\n // },\r\n // appUsersManager: this.managers.appUsersManager\r\n // });\r\n\r\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n \r\n // return sortedUserList;\r\n // };\r\n \r\n // const peopleSection = this.peopleSection = new SettingChatListSection({\r\n // name: 'PeopleNearbyHeader',\r\n // sortedList: m()\r\n // });\r\n\r\n // const chatsSection = this.chatsSection = new SettingChatListSection({\r\n // name: 'ChatsNearbyHeader',\r\n // sortedList: m()\r\n // });\r\n\r\n // const btnMakeVisible = peopleSection.makeButton({\r\n // text: 'MakeMyselfVisible',\r\n // icon: 'location'\r\n // });\r\n\r\n // const btnMakeInvisible = peopleSection.makeButton({\r\n // text: 'StopShowingMe',\r\n // icon: 'location'\r\n // });\r\n\r\n // const btnCreateGroup = chatsSection.makeButton({\r\n // text: 'NearbyCreateGroup',\r\n // icon: 'newgroup'\r\n // });\r\n\r\n // attachClickEvent(btnMakeVisible, () => {\r\n // confirmationPopup({\r\n // titleLangKey: 'MakeMyselfVisibleTitle',\r\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n // button: {\r\n // langKey: 'OK'\r\n // }\r\n // }).then(() => {\r\n // this.startWatching();\r\n // });\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // attachClickEvent(btnMakeInvisible, () => {\r\n // this.stopWatching();\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // attachClickEvent(btnCreateGroup, () => {\r\n // this.slider.createTab(AppNewGroupTab).open([], true);\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // btnMakeVisible.classList.add('primary');\r\n // btnMakeInvisible.classList.add('danger');\r\n // btnCreateGroup.classList.add('primary');\r\n\r\n // this.content.append(this.retryBtn);\r\n // this.scrollable.append(\r\n // stickerContainer,\r\n // caption,\r\n // peopleSection.container,\r\n // chatsSection.container,\r\n // this.errorCategory\r\n // );\r\n // }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n public open() {\r\n const result = super.open();\r\n result.then(() => {\r\n this.retryBtn.classList.remove('is-visible');\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.latestLocationSaved = {\r\n latitude: location.coords.latitude,\r\n longitude: location.coords.longitude,\r\n accuracy: location.coords.accuracy\r\n };\r\n\r\n console.log(this.latestLocationSaved);\r\n\r\n this.managers.appUsersManager.getLocated(\r\n location.coords.latitude,\r\n location.coords.longitude,\r\n location.coords.accuracy\r\n ).then((response) => {\r\n const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n const peers = update.peers as PeerLocated.peerLocated[];\r\n const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n orderedPeers?.forEach((peer) => {\r\n const peerId = getPeerId(peer.peer);\r\n const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n this.locatedPeers.set(peerId, peer);\r\n section.sortedList.add(peerId);\r\n });\r\n\r\n this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n this.errorCategory.innerHTML = \"No groups or channels found around you.\";\r\n });\r\n }, (error) => {\r\n this.errorCategory.classList.remove('hide');\r\n this.retryBtn.classList.add('is-visible');\r\n this.retryBtn.addEventListener('click', this.open);\r\n if(error instanceof GeolocationPositionError) {\r\n this.errorCategory.innerHTML = \"Location permission denied. Click below to retry.\";\r\n } else {\r\n this.errorCategory.innerHTML = \"An error has occurred. Please retry later clicking the button below.\";\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n this.managers.appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n this.managers.appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n this.managers.appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p)\r\n * (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\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","/*\n * 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\";\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\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) => {\n this.createTab(AppNewGroupTab).open(peerIds);\n },\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(1, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(1));\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: 'saved',\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\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, async(e) => {\n await Promise.all(filteredButtons.map(async(button) => {\n if(button.verify) {\n button.element.classList.toggle('hide', !(await button.verify()));\n }\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 const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\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.closeBtnMenu();\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 this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\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 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.classList.add('btn-update');\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 // const weave = new TopbarWeave();\n // const weaveContainer = weave.render('btn-update-weave');\n // this.updateBtn.prepend(weaveContainer);\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 // setTimeout(() => {\n // weave.componentDidMount();\n // weave.setCurrentState(GROUP_CALL_STATE.MUTED, true);\n // weave.setAmplitude(0);\n // weave.handleBlur();\n // }, 1e3);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.innerText = '' + 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((state) => {\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\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),\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 let 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-30');\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.appMessagesManager.getConversations(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 let 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 let 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(searchContainer.parentElement, 'zoom-fade', 150, (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 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 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 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\nexport const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { Message } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { SERVICE_AS_REGULAR, STICKY_OFFSET } from \"./bubbles\";\r\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\r\nimport partition from \"../../helpers/array/partition\";\r\n\r\ntype GroupItem = {\r\n bubble: HTMLElement, \r\n fromId: PeerId, \r\n mid: number, \r\n groupMid?: number, \r\n timestamp: number, \r\n dateTimestamp: number, \r\n mounted: boolean, \r\n single: boolean, \r\n group?: BubbleGroup,\r\n message: Message.message | Message.messageService // use it only to set avatar\r\n};\r\n\r\nclass BubbleGroup {\r\n container: HTMLElement;\r\n chat: Chat;\r\n groups: BubbleGroups;\r\n items: GroupItem[]; // descend sorted\r\n avatarContainer: HTMLElement;\r\n avatarLoadPromise: ReturnType;\r\n avatar: AvatarElement;\r\n mounted: boolean;\r\n dateTimestamp: number;\r\n offset: number;\r\n\r\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('bubbles-group');\r\n this.chat = chat;\r\n this.groups = groups;\r\n this.items = [];\r\n this.dateTimestamp = dateTimestamp;\r\n this.offset = 0;\r\n }\r\n\r\n createAvatar(message: Message.message | Message.messageService) {\r\n if(this.avatarLoadPromise) {\r\n return this.avatarLoadPromise;\r\n } else if(message._ === 'messageService') {\r\n return;\r\n }\r\n\r\n this.avatarContainer = document.createElement('div');\r\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\r\n ++this.offset;\r\n\r\n const fwdFrom = message.fwd_from;\r\n const fwdFromId = message.fwdFromId;\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n const currentPeerId = this.chat.peerId;\r\n this.avatar = new AvatarElement();\r\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\r\n this.avatarLoadPromise = this.avatar.updateWithOptions({\r\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\r\n peerId: ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID,\r\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined,\r\n });\r\n\r\n this.avatarContainer.append(this.avatar);\r\n this.container.append(this.avatarContainer);\r\n\r\n return this.avatarLoadPromise;\r\n }\r\n\r\n get firstTimestamp() {\r\n return this.firstItem.timestamp;\r\n }\r\n\r\n get firstMid() {\r\n return this.firstItem.mid;\r\n }\r\n\r\n get firstItem() {\r\n return this.items[this.items.length - 1];\r\n }\r\n\r\n get lastTimestamp() {\r\n return this.lastItem.timestamp;\r\n }\r\n\r\n get lastMid() {\r\n return this.lastItem.mid;\r\n }\r\n\r\n get lastItem() {\r\n return this.items[0];\r\n }\r\n\r\n updateClassNames() {\r\n const items = this.items;\r\n const length = items.length;\r\n if(!length) {\r\n return;\r\n }\r\n \r\n // const elements = Array.from(this.container.children);\r\n // if(this.offset) elements.splice(0, this.offset);\r\n\r\n // const length = elements.length;\r\n // if(!length) {\r\n // return;\r\n // }\r\n\r\n const first = items[length - 1].bubble;\r\n\r\n if(items.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n for(let i = 1, _length = length - 1; i < _length; ++i) {\r\n const bubble = items[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = items[0].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n }\r\n\r\n insertItem(item: GroupItem) {\r\n const {items} = this;\r\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\r\n\r\n item.group = this;\r\n if(items.length === 1) {\r\n this.groups.insertGroup(this);\r\n }\r\n }\r\n\r\n removeItem(item: GroupItem) {\r\n indexOfAndSplice(this.items, item);\r\n\r\n if(!this.items.length) {\r\n indexOfAndSplice(this.groups.groups, this);\r\n }\r\n\r\n item.group = undefined;\r\n }\r\n\r\n mount(updateClassNames?: boolean) {\r\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\r\n debugger;\r\n\r\n if(this.mounted) {\r\n this.onItemUnmount();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const {offset, items} = this;\r\n const {length} = items;\r\n forEachReverse(items, (item, idx) => {\r\n this.mountItem(item, length - 1 - idx, offset);\r\n });\r\n \r\n if(updateClassNames) {\r\n this.updateClassNames();\r\n }\r\n\r\n this.onItemMount();\r\n }\r\n\r\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\r\n if(item.mounted) {\r\n return;\r\n }\r\n\r\n positionElementByIndex(item.bubble, this.container, offset + idx);\r\n item.mounted = true;\r\n }\r\n\r\n unmountItem(item: GroupItem) {\r\n if(!item.mounted) {\r\n return;\r\n }\r\n\r\n item.bubble.remove();\r\n item.mounted = false;\r\n this.onItemUnmount();\r\n }\r\n\r\n onItemMount() {\r\n if(this.mounted) {\r\n return;\r\n }\r\n\r\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\r\n // const idx = this.groups.indexOf(group);\r\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\r\n const dateGroupsLength = dateGroups.length;\r\n const idx = dateGroups.indexOf(this);\r\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\r\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\r\n this.mounted = true;\r\n }\r\n\r\n onItemUnmount() {\r\n if(!this.mounted) {\r\n return;\r\n }\r\n\r\n if(!this.items.length) {\r\n this.container.remove();\r\n this.chat.bubbles.deleteEmptyDateGroups();\r\n this.mounted = false;\r\n } else {\r\n this.updateClassNames();\r\n }\r\n }\r\n}\r\n\r\n// class BubbleGroupItem implements GroupItem {\r\n// bubble: HTMLElement;\r\n// fromId: PeerId;\r\n// mid: number;\r\n// timestamp: number;\r\n// dateTimestamp: number;\r\n// mounted: boolean;\r\n// single: boolean;\r\n// group: BubbleGroup;\r\n\r\n// constructor(details: GroupItem) {\r\n// Object.assign(this, details);\r\n// }\r\n// }\r\n\r\nexport default class BubbleGroups {\r\n public itemsArr: Array = []; // descend sorted\r\n private itemsMap: Map = new Map();\r\n public groups: Array = []; // descend sorted\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n private sortItemsKey: Extract;\r\n private sortGroupsKey: Extract;\r\n public sortGroupItemsKey: Extract;\r\n\r\n constructor(private chat: Chat) {\r\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\r\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\r\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\r\n }\r\n\r\n removeItem(item: GroupItem) {\r\n item.group.removeItem(item);\r\n this.removeItemFromCache(item);\r\n }\r\n\r\n removeAndUnmountBubble(bubble: HTMLElement) {\r\n const item = this.getItemByBubble(bubble);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n const items = this.itemsArr;\r\n const index = items.indexOf(item);\r\n const siblings = this.getSiblingsAtIndex(index, items);\r\n \r\n const group = item.group;\r\n this.removeItem(item);\r\n group.unmountItem(item);\r\n\r\n const modifiedGroups: Set = new Set();\r\n modifiedGroups.add(group);\r\n\r\n const [previousSibling, nextSibling] = siblings;\r\n if(\r\n previousSibling \r\n && nextSibling \r\n && this.canItemsBeGrouped(previousSibling, nextSibling) \r\n && previousSibling.group !== nextSibling.group\r\n ) {\r\n const group = nextSibling.group;\r\n this.f(nextSibling.group.items);\r\n group.onItemUnmount();\r\n modifiedGroups.add(previousSibling.group);\r\n this.groupUngrouped();\r\n }\r\n\r\n this.mountUnmountGroups(Array.from(modifiedGroups));\r\n }\r\n\r\n mountUnmountGroups(groups: BubbleGroup[]) {\r\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\r\n\r\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\r\n toUnmount.forEach((group) => {\r\n group.onItemUnmount();\r\n })\r\n\r\n toMount.forEach((group) => {\r\n group.mount(true);\r\n });\r\n\r\n // toMount.forEach((group) => {\r\n // group.updateClassNames();\r\n // });\r\n }\r\n\r\n f(items: GroupItem[], index: number = 0, length = items.length) {\r\n for(; index < length; ++index) {\r\n const item = items[index];\r\n item.mounted = false;\r\n item.group.removeItem(item);\r\n --length;\r\n --index;\r\n }\r\n }\r\n\r\n getItemByBubble(bubble: HTMLElement) {\r\n return this.itemsMap.get(bubble);\r\n }\r\n\r\n getLastGroup() {\r\n return this.groups[0];\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const item = this.getItemByBubble(bubble);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.mid = mid;\r\n \r\n // indexOfAndSplice(item.group.items, item);\r\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\r\n // // if(canChangeGroupMid) item.groupMid = mid;\r\n // item.group.insertItem(item);\r\n \r\n indexOfAndSplice(this.itemsArr, item);\r\n this.insertItemToArray(item, this.itemsArr);\r\n }\r\n\r\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\r\n this.itemsMap.delete(item.bubble);\r\n item.bubble = bubble;\r\n this.itemsMap.set(bubble, item);\r\n }\r\n \r\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\r\n const item = this.getItemByBubble(from);\r\n if(!item) {\r\n return;\r\n }\r\n \r\n this.changeItemBubble(item, to);\r\n }\r\n\r\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) { \r\n return item2.fromId === item1.fromId \r\n && Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff \r\n && item1.dateTimestamp === item2.dateTimestamp \r\n && !item1.single \r\n && !item2.single;\r\n }\r\n\r\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\r\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\r\n }\r\n\r\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\r\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\r\n // }\r\n\r\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\r\n items = items.slice();\r\n const idx = this.insertItemToArray(item, items);\r\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\r\n return this.findGroupSiblingInItems(item, items, idx);\r\n }\r\n\r\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\r\n const previousItem = items[index - 1];\r\n let siblingGroupedItem: GroupItem;\r\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\r\n siblingGroupedItem = previousItem;\r\n } else {\r\n for(let k = index + 1; k < length; ++k) {\r\n const nextItem = items[k];\r\n if(this.canItemsBeGrouped(item, nextItem)) {\r\n if(nextItem.group) {\r\n siblingGroupedItem = nextItem;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return siblingGroupedItem;\r\n }\r\n\r\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\r\n group.insertItem(item);\r\n this.addItemToCache(item);\r\n }\r\n\r\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\r\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\r\n }\r\n\r\n insertGroup(group: BubbleGroup) {\r\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\r\n }\r\n\r\n addItemToCache(item: GroupItem) {\r\n this.insertItemToArray(item, this.itemsArr);\r\n this.itemsMap.set(item.bubble, item);\r\n }\r\n\r\n removeItemFromCache(item: GroupItem) {\r\n indexOfAndSplice(this.itemsArr, item);\r\n this.itemsMap.delete(item.bubble);\r\n }\r\n\r\n getMessageFromId(message: MyMessage) {\r\n let fromId = message.viaBotId || message.fromId;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n\r\n return fromId;\r\n }\r\n\r\n createItem(bubble: HTMLElement, message: MyMessage) {\r\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\r\n const {mid, date: timestamp} = message;\r\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\r\n const item: GroupItem = {\r\n mid, \r\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid, \r\n fromId: this.getMessageFromId(message), \r\n bubble, \r\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp, \r\n timestamp,\r\n dateTimestamp, \r\n mounted: false, \r\n single,\r\n message\r\n };\r\n\r\n return item;\r\n }\r\n\r\n splitSiblingsOnGrouping(siblings: ReturnType) {\r\n const [previousSibling, nextSibling] = siblings;\r\n const previousGroup = previousSibling?.group;\r\n const nextGroup = nextSibling?.group;\r\n\r\n if(!previousGroup) {\r\n return;\r\n }\r\n\r\n // will refresh group\r\n // if(previousGroup === nextGroup) {\r\n const items = previousGroup.items;\r\n const index = items.indexOf(previousSibling) + 1;\r\n const length = items.length;\r\n if(index === length) {\r\n return;\r\n }\r\n\r\n const modifiedGroups: BubbleGroup[] = [previousGroup];\r\n // if(previousGroup !== nextGroup && nextGroup) {\r\n // modifiedGroups.push(nextGroup);\r\n // }\r\n\r\n this.f(items, index, length);\r\n return modifiedGroups;\r\n // }\r\n }\r\n\r\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\r\n const foundItem = this.getItemByBubble(bubble);\r\n if(foundItem) { // should happen only on edit\r\n // debugger;\r\n return;\r\n }\r\n\r\n const item = this.createItem(bubble, message);\r\n this.addItemToCache(item);\r\n }\r\n\r\n groupUngrouped() {\r\n const items = this.itemsArr;\r\n const length = items.length;\r\n const modifiedGroups: Set = new Set();\r\n // for(let i = length - 1; i >= 0; --i) {\r\n for(let i = 0; i < length; ++i) {\r\n const item = items[i];\r\n if(item.group) {\r\n continue;\r\n }\r\n\r\n let hadGroup = true;\r\n const siblings = this.getSiblingsAtIndex(i, items);\r\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\r\n\r\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\r\n const foundItem = siblingGroupedItem;\r\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\r\n\r\n modifiedGroups.add(group);\r\n group.insertItem(item);\r\n\r\n if(!hadGroup) {\r\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\r\n if(splittedGroups) {\r\n splittedGroups.forEach((group) => modifiedGroups.add(group));\r\n }\r\n }\r\n }\r\n\r\n return modifiedGroups;\r\n }\r\n\r\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\r\n // const oldItem = this.getItemByBubble(bubble);\r\n // if(unmountIfFound) { // updating position\r\n // this.removeAndUnmountBubble(bubble);\r\n // } else if(oldItem) { // editing\r\n // const group = oldItem.group;\r\n // this.changeItemBubble(oldItem, bubble);\r\n // oldItem.mounted = false;\r\n\r\n // return {item: oldItem, group};\r\n // }\r\n\r\n // const item = this.createItem(bubble, message);\r\n\r\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\r\n\r\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\r\n // this.addItemToGroup(item, group);\r\n \r\n // return {item, group};\r\n // }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach((object) => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n // updateGroupByMessageId(mid: number) {\r\n // const item = this.itemsArr.find((g) => g.mid === mid);\r\n // if(item) {\r\n // item.group.updateGroup();\r\n // }\r\n // }\r\n \r\n cleanup() {\r\n this.itemsArr = [];\r\n this.groups = [];\r\n this.itemsMap.clear();\r\n }\r\n\r\n // findIncorrentPositions() {\r\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\r\n // var items = this.itemsArr;\r\n // for(var i = 0, length = items.length; i < length; ++i) {\r\n // const item = items[i];\r\n // const foundBubble = bubbles[i];\r\n // if(item.bubble !== foundBubble) {\r\n // console.log('incorrect position', i, item, foundBubble);\r\n // // debugger;\r\n // // break;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', {\r\n body: true, \r\n overlayClosable: true, \r\n buttons: options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }],\r\n title: true,\r\n ...options\r\n });\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n const entry = entries\r\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\r\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n\r\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\r\n this.handler(true, container as HTMLElement);\r\n }, {root: this.container});\r\n }\r\n\r\n /**\r\n * @param {!Element} container\r\n * @param {string} className\r\n */\r\n private addSentinel(container: HTMLElement, className: string) {\r\n const sentinel = document.createElement('div');\r\n sentinel.classList.add('sticky_sentinel', className);\r\n return container.appendChild(sentinel);\r\n }\r\n\r\n /**\r\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\r\n * Note: the elements should be children of `container`.\r\n * @param {!Element} container\r\n */\r\n public observeStickyHeaderChanges(element: HTMLElement) {\r\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\r\n this.headersObserver.observe(headerSentinel);\r\n\r\n this.elementsObserver.observe(element);\r\n }\r\n\r\n public disconnect() {\r\n this.headersObserver.disconnect();\r\n this.elementsObserver.disconnect();\r\n }\r\n\r\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\r\n this.elementsObserver.unobserve(element);\r\n this.headersObserver.unobserve(headerSentinel);\r\n }\r\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from \"../../helpers/callbackify\";\nimport formatNumber from \"../../helpers/number/formatNumber\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport { MessagePeerReaction, ReactionCount } from \"../../layer\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport SetTransition from \"../singleTransition\";\nimport StackedAvatars from \"../stackedAvatars\";\nimport { wrapSticker, wrapStickerAnimation } from \"../wrappers\";\nimport { Awaited } from \"../../types\";\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\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) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\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 availableReaction = this.managers.appReactionsManager.getReaction(reactionCount.reaction);\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 const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc: availableReaction.center_icon ?? availableReaction.static_icon,\n width: size,\n height: size,\n static: true,\n managers: this.managers\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\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.pFlags.chosen) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition(this, 'is-chosen', isChosen, this.isConnected ? 300 : 0);\n }\n }\n\n public fireAroundAnimation() {\n callbackify(this.managers.appReactionsManager.getReaction(this.reactionCount.reaction), (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 }).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 }).stickerPromise\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n fastRaf(() => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n });\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(remove, 1e3);\n });\n } else {\n remove();\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 { Message, ReactionCount } from \"../../layer\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\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\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\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(message: Message.message, type: ReactionLayoutType, isPlaceholder?: boolean) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\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.isPlaceholder);\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 availableReactionsResult instanceof Promise ? \n reactions.results : \n reactions.results.filter((reactionCount) => {\n return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n })\n ) : [];\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionCount.reaction === reaction);\n if(!found) {\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 && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n const reactionElementIdx = this.sorted.findIndex((reactionElement) => reactionElement.reactionCount.reaction === reactionCount.reaction);\n let reactionElement = reactionElementIdx !== -1 && this.sorted[reactionElementIdx];\n if(!reactionElement) {\n reactionElement = new ReactionElement();\n reactionElement.init(this.type);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n \n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => 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) => reactionElement.reactionCount.reaction === reactionCount.reaction);\n if(reactionElement) {\n reactionElement.fireAroundAnimation();\n }\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Message } from \"../../layer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ripple from \"../ripple\";\r\nimport I18n from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\r\nimport type LazyLoadQueue from \"../lazyLoadQueue\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (message) => {\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueue;\r\n public stackedAvatars: StackedAvatars;\r\n public text: I18n.IntlElement;\r\n public managers: AppManagers;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n this.managers = rootScope.managers;\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!this.stackedAvatars) {\r\n this.stackedAvatars = new StackedAvatars({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n avatarSize: 30\r\n });\r\n\r\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\r\n }\r\n\r\n leftPart = this.stackedAvatars.container;\r\n\r\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.prepend(leftPart);\r\n }\r\n \r\n if(!this.text) {\r\n this.text = new I18n.IntlElement();\r\n }\r\n\r\n const text = this.text;\r\n if(replies) {\r\n if(replies.replies) {\r\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\r\n } else {\r\n text.compareAndUpdate({key: 'LeaveAComment'});\r\n }\r\n } else {\r\n text.compareAndUpdate({key: 'ViewInChat'});\r\n }\r\n\r\n if(replies) {\r\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n }/* else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n } */\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text.element);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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\";\nimport Chat, { ChatType } from \"./chat\";\nimport ReactionsElement from \"./reactions\";\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, sponsoredSpan: HTMLElement, reactionsElement: ReactionsElement, 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 let 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(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 if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\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 let 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, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getVisibleRect(\r\n element: HTMLElement, \r\n overflowElement: HTMLElement, \r\n lookForSticky?: boolean, \r\n rect = element.getBoundingClientRect(),\r\n overflowRect = overflowElement.getBoundingClientRect()\r\n) {\r\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\r\n\r\n // * respect sticky headers\r\n if(lookForSticky) {\r\n const sticky = overflowElement.querySelector('.sticky');\r\n if(sticky) {\r\n const stickyRect = sticky.getBoundingClientRect();\r\n overflowTop = stickyRect.bottom;\r\n }\r\n }\r\n\r\n if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowLeft\r\n || rect.left >= overflowRight) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\r\n },\r\n overflow\r\n };\r\n}\r\n\r\n(window as any).getVisibleRect = getVisibleRect;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n start?: string\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 }\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\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};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { addCancelButton } from \".\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport numberThousandSplitter from \"../../helpers/number/numberThousandSplitter\";\r\nimport { ChatInvite } from \"../../layer\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { i18n, _i18n } from \"../../lib/langPack\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport AvatarElement from \"../avatar\";\r\nimport putPhoto from \"../putPhoto\";\r\nimport { toastNew } from \"../toast\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(\r\n private hash: string, \r\n private chatInvite: ChatInvite.chatInvite, \r\n ) {\r\n super('popup-join-chat-invite', {\r\n closable: true, \r\n overlayClosable: true, \r\n body: true,\r\n buttons: addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n this.managers.appChatsManager.importChatInvite(hash)\r\n .then((chatId) => {\r\n const peerId = chatId.toPeerId(true);\r\n appImManager.setInnerPeer({peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }])\r\n });\r\n\r\n this.construct();\r\n }\r\n\r\n private async construct() {\r\n this.header.remove();\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n\r\n const {chatInvite, managers, hash} = this;\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.classList.add('avatar-100');\r\n avatarElem.isDialog = false;\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n\r\n this.show();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 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 debugger;\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","/*\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 middlewarePromise(middleware: () => boolean, throwWhat: any = '') {\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","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","/*\n * 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 } 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 { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../putPreloader\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\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 { AppManagers } from \"../../../lib/appManagers/managers\";\nimport fixEmoji from \"../../../lib/richTextProcessor/fixEmoji\";\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\nimport wrapSingleEmoji from \"../../../lib/richTextProcessor/wrapSingleEmoji\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\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(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = 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 //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach((c) => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let 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 appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n this.managers.appEmojiManager.getRecentEmojis().then((recent) => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map((category) => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n attachClickEvent(this.content, this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\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 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 findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\nimport LazyLoadQueueIntersector 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: HTMLElement) {\n this.intersector.observe(el);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport LazyLoadQueueRepeat2 from \"./lazyLoadQueueRepeat2\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n private managers: AppManagers;\r\n\r\n constructor(\r\n private element: HTMLElement, \r\n private group: string, \r\n private scrollable: Scrollable, \r\n attach = true\r\n ) {\r\n this.managers = rootScope.managers;\r\n\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\r\n const res = await wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach((item) => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach((item) => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n // const gotThumb = this.managers.appDocsManager.getThumb(doc, false);\r\n\r\n // const willBeAPoster = !!gotThumb;\r\n // let img: HTMLImageElement;\r\n // if(willBeAPoster) {\r\n // img = new Image();\r\n // img.classList.add('media-poster');\r\n\r\n // if(!gotThumb.cacheContext.url) {\r\n // gotThumb.promise.then(() => {\r\n // img.src = gotThumb.cacheContext.url;\r\n // });\r\n // }\r\n // }\r\n\r\n // const afterRender = () => {\r\n // if(img) {\r\n // div.append(img);\r\n // div.style.opacity = '';\r\n // }\r\n // };\r\n\r\n // (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../putPreloader\";\r\nimport { AppManagers } from \"../../../lib/appManagers/managers\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n constructor(private managers: AppManagers) {\r\n\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n this.managers.appDocsManager.getGifs().then((docs) => {\r\n docs.forEach((doc) => {\r\n masonry.add(doc);\r\n });\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from \"../helpers/array/findAndSpliceAll\";\nimport LazyLoadQueueIntersector, { LazyLoadElement } from \"./lazyLoadQueueIntersector\";\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private _queue: Map = new Map();\n\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange, options?: IntersectionObserverInit) {\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) {\n const items = spliced.length ? spliced : [this._queue.get(target)];\n items.forEach((item) => {\n this.queue.unshift(item || this._queue.get(target));\n });\n }\n \n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this._queue.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._queue.set(el.div, el);\n this.intersector.observe(el.div);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport { AppManagers } from \"../../../lib/appManagers/managers\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport LazyLoadQueueRepeat from \"../../lazyLoadQueueRepeat\";\r\nimport { putPreloader } from \"../../putPreloader\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"../../visibilityIntersector\";\r\nimport findAndSplice from \"../../../helpers/array/findAndSplice\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport confirmationPopup from \"../../confirmationPopup\";\r\nimport noop from \"../../../helpers/noop\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animated: Set = new Set();\r\n\r\n constructor(\r\n private regularLazyLoadQueue: LazyLoadQueue, \r\n private group: string,\r\n private managers: AppManagers,\r\n private options?: IntersectionObserverInit\r\n ) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\r\n if(!visible) {\r\n this.processInvisible(target);\r\n }\r\n }, options);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\r\n if(!element) {\r\n element = document.createElement('div');\r\n element.classList.add('grid-item', 'super-sticker');\r\n element.dataset.docId = '' + doc.id;\r\n\r\n if(doc.animated) {\r\n this.observeAnimated(element);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n /* !doc.animated && */wrapSticker({\r\n doc, \r\n div: element,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.animated,\r\n loadPromises\r\n });\r\n\r\n return element;\r\n }\r\n\r\n public observeAnimated(element: HTMLElement) {\r\n this.animated.add(element);\r\n this.lazyLoadQueue.observe({\r\n div: element, \r\n load: this.processVisible\r\n });\r\n }\r\n\r\n public unobserveAnimated(element: HTMLElement) {\r\n this.animated.delete(element);\r\n this.lazyLoadQueue.unobserve(element);\r\n }\r\n\r\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(element);\r\n players.forEach((player) => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisible = async(element: HTMLElement) => {\r\n const docId = element.dataset.docId;\r\n const doc = await this.managers.appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: element,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n }).then(({render}) => render);\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisible = async(element: HTMLElement) => {\r\n const docId = element.dataset.docId;\r\n const doc = await this.managers.appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(element, false);\r\n\r\n element.textContent = '';\r\n this.renderSticker(doc, element as HTMLDivElement);\r\n };\r\n}\r\n\r\ntype StickersTabCategory = {\r\n elements: {\r\n container: HTMLElement,\r\n title: HTMLElement,\r\n items: HTMLElement,\r\n menuTab: HTMLElement,\r\n menuTabPadding: HTMLElement\r\n },\r\n set: StickerSet.stickerSet,\r\n items: {\r\n document: MyDocument,\r\n element: HTMLElement\r\n }[]\r\n};\r\n\r\nconst RECENT_STICKERS_COUNT = 20;\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n private categories: {[id: string]: StickersTabCategory};\r\n private categoriesMap: Map;\r\n private categoriesIntersector: VisibilityIntersector;\r\n\r\n private scroll: Scrollable;\r\n private menu: HTMLElement;\r\n private mounted = false;\r\n private stickyIntersector: StickyIntersector;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n constructor(private managers: AppManagers) {\r\n this.categories = {};\r\n this.categoriesMap = new Map();\r\n }\r\n\r\n private createCategory(stickerSet: StickerSet.stickerSet, _title: HTMLElement | DocumentFragment) {\r\n const container = document.createElement('div');\r\n container.classList.add('emoji-category', 'hide');\r\n\r\n const items = document.createElement('div');\r\n items.classList.add('category-items', 'super-stickers');\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('category-title');\r\n title.append(_title);\r\n\r\n const menuTab = ButtonIcon(undefined, {noRipple: true});\r\n menuTab.classList.add('menu-horizontal-div-item');\r\n\r\n const menuTabPadding = document.createElement('div');\r\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\r\n\r\n menuTab.append(menuTabPadding);\r\n\r\n const category: StickersTabCategory = {\r\n elements: {\r\n container,\r\n title,\r\n items,\r\n menuTab,\r\n menuTabPadding\r\n },\r\n set: stickerSet,\r\n items: []\r\n };\r\n\r\n container.append(title, items);\r\n\r\n this.categories[stickerSet.id] = category;\r\n this.categoriesMap.set(container, category);\r\n\r\n this.categoriesIntersector.observe(container);\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n\r\n return category;\r\n }\r\n\r\n private categoryAppendStickers(\r\n category: StickersTabCategory, \r\n promise: Promise\r\n ) {\r\n const {container} = category.elements;\r\n\r\n promise.then((documents) => {\r\n const isVisible = this.isCategoryVisible(category);\r\n\r\n documents.forEach((document) => {\r\n const element = this.superStickerRenderer.renderSticker(document);\r\n category.items.push({document, element});\r\n\r\n if(isVisible) {\r\n category.elements.items.append(element);\r\n }\r\n });\r\n\r\n this.setCategoryItemsHeight(category);\r\n container.classList.remove('hide');\r\n });\r\n }\r\n\r\n private isCategoryVisible(category: StickersTabCategory) {\r\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\r\n }\r\n\r\n private setCategoryItemsHeight(category: StickersTabCategory) {\r\n const containerWidth = this.content.getBoundingClientRect().width - 10;\r\n const stickerSize = mediaSizes.active.esgSticker.width;\r\n\r\n const itemsPerRow = Math.floor(containerWidth / stickerSize);\r\n const rows = Math.ceil(category.items.length / itemsPerRow);\r\n const height = rows * stickerSize;\r\n \r\n category.elements.items.style.minHeight = height + 'px';\r\n }\r\n\r\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const category = this.createCategory(set, wrapEmojiText(set.title));\r\n const {menuTab, menuTabPadding, container} = category.elements;\r\n\r\n positionElementByIndex(menuTab, this.menu, prepend ? 1 : 0xFFFF);\r\n\r\n const promise = this.managers.appStickersManager.getStickerSet(set);\r\n this.categoryAppendStickers(\r\n category,\r\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\r\n );\r\n // const stickerSet = await promise;\r\n\r\n positionElementByIndex(container, this.scroll.container, prepend ? 1 : 0xFFFF, -1);\r\n\r\n wrapStickerSetThumb({\r\n set,\r\n container: menuTabPadding,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n public init() {\r\n this.content = document.getElementById('content-stickers');\r\n\r\n const menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n const menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n const onCategoryVisibility: OnVisibilityChange = ({target, visible, entry}) => {\r\n const category = this.categoriesMap.get(target);\r\n // console.log('roll the windows up', category, target, visible, entry);\r\n if(!visible) {\r\n category.elements.items.textContent = '';\r\n } else {\r\n category.elements.items.append(...category.items.map(({element}) => element));\r\n }\r\n };\r\n\r\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\r\n this.categoriesIntersector = new VisibilityIntersector(onCategoryVisibility, intersectionOptions);\r\n\r\n const clearCategoryItems = (category: StickersTabCategory) => {\r\n category.elements.items.textContent = '';\r\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\r\n category.items.length = 0;\r\n };\r\n\r\n this.scroll.container.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const container = findUpClassName(target, 'emoji-category');\r\n const category = this.categoriesMap.get(container);\r\n if(category.set.id === 'recent') {\r\n return;\r\n }\r\n\r\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n const {stickyIntersector, setActive} = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll);\r\n this.stickyIntersector = stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n const recentCategory = this.createCategory({id: 'recent'} as any, i18n('Stickers.Recent'));\r\n recentCategory.elements.title.classList.add('disable-hover');\r\n recentCategory.elements.menuTab.classList.add('tgico-recent', 'active');\r\n recentCategory.elements.menuTabPadding.remove();\r\n this.toggleRecentCategory(recentCategory, false);\r\n\r\n const clearButton = ButtonIcon('close', {noRipple: true});\r\n recentCategory.elements.title.append(clearButton);\r\n attachClickEvent(clearButton, () => {\r\n confirmationPopup({\r\n titleLangKey: 'ClearRecentStickersAlertTitle',\r\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\r\n button: {\r\n langKey: 'Clear'\r\n }\r\n }).then(() => {\r\n this.managers.appStickersManager.clearRecentStickers();\r\n }, noop);\r\n });\r\n\r\n const onRecentStickers = (stickers: MyDocument[]) => {\r\n const sliced = stickers.slice(0, RECENT_STICKERS_COUNT) as MyDocument[];\r\n\r\n clearCategoryItems(recentCategory);\r\n this.toggleRecentCategory(recentCategory, !!sliced.length);\r\n this.categoryAppendStickers(recentCategory, Promise.resolve(sliced));\r\n };\r\n\r\n Promise.all([\r\n this.managers.appStickersManager.getRecentStickers().then((stickers) => {\r\n preloader.remove();\r\n onRecentStickers(stickers.stickers as MyDocument[]);\r\n }),\r\n\r\n this.managers.appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n setActive(0);\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\r\n\r\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\r\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\r\n\r\n // emoticonsDropdown.addEventListener('close', () => {\r\n // this.categoriesIntersector.lock();\r\n // });\r\n\r\n // emoticonsDropdown.addEventListener('closed', () => {\r\n // for(const [container] of this.categoriesMap) {\r\n // onCategoryVisibility(container, false);\r\n // }\r\n // });\r\n\r\n // emoticonsDropdown.addEventListener('opened', () => {\r\n // this.categoriesIntersector.unlockAndRefresh();\r\n // });\r\n\r\n // setInterval(() => {\r\n // // @ts-ignore\r\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\r\n \r\n // console.log(\r\n // 'STICKERS RENDERED IN PANEL:', \r\n // players.length, \r\n // players.filter((p) => !p.paused).length, \r\n // rendererLazyLoadQueue.intersector.getVisible().length\r\n // );\r\n // }, .25e3);\r\n\r\n rootScope.addEventListener('stickers_installed', (set) => {\r\n if(!this.categories[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', ({id}) => {\r\n const category = this.categories[id];\r\n if(category && this.mounted) {\r\n category.elements.container.remove();\r\n category.elements.menuTab.remove();\r\n this.categoriesIntersector.unobserve(category.elements.container);\r\n clearCategoryItems(category);\r\n delete this.categories[id];\r\n this.categoriesMap.delete(category.elements.container);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_recent', (stickers) => {\r\n if(this.mounted) {\r\n onRecentStickers(stickers);\r\n }\r\n });\r\n\r\n const resizeCategories = () => {\r\n for(const [container, category] of this.categoriesMap) {\r\n this.setCategoryItemsHeight(category);\r\n }\r\n };\r\n\r\n mediaSizes.addEventListener('resize', resizeCategories);\r\n\r\n emoticonsDropdown.addEventListener('opened', resizeCategories);\r\n \r\n this.init = null;\r\n }\r\n\r\n private toggleRecentCategory(category: StickersTabCategory, visible: boolean) {\r\n if(!visible) {\r\n category.elements.menuTab.remove();\r\n category.elements.container.remove();\r\n } else {\r\n positionElementByIndex(category.elements.menuTab, this.menu, 0);\r\n positionElementByIndex(category.elements.container, this.scroll.container, 0);\r\n }\r\n \r\n // category.elements.container.classList.toggle('hide', !visible);\r\n }\r\n\r\n public pushRecentSticker(doc: MyDocument) {\r\n this.managers.appStickersManager.pushRecentSticker(doc.id);\r\n \r\n const category = this.categories['recent'];\r\n if(!category) {\r\n return;\r\n }\r\n\r\n const items = category.elements.items;\r\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\r\n if(!item) {\r\n item = {\r\n element: this.superStickerRenderer.renderSticker(doc),\r\n document: doc\r\n };\r\n }\r\n\r\n category.items.unshift(item);\r\n if(items.childElementCount) items.prepend(item.element);\r\n if(items.childElementCount > RECENT_STICKERS_COUNT) {\r\n (Array.from(items.children) as HTMLElement[]).slice(RECENT_STICKERS_COUNT).forEach((el) => el.remove());\r\n }\r\n\r\n this.setCategoryItemsHeight(category);\r\n this.toggleRecentCategory(category, true);\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport forEachReverse from \"../../../helpers/array/forEachReverse\";\r\nimport setInnerHTML from \"../../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../../lib/richTextProcessor/wrapEmojiText\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\r\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `
`;\r\n\r\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach((animation) => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach((set) => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach((set) => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport safeAssign from \"./object/safeAssign\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', (e) => {\r\n clearTimeout(this.displayTimeout);\r\n this.onMouseOut(e);\r\n });\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN || !this.isActive()) return;\r\n clearTimeout(this.displayTimeout);\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchResultableEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector 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 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 { simulateClickEvent } from \"../../helpers/dom/clickEvent\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public 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 });\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\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\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\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 }\n\n protected init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab(this.managers);\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\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 === 1) {\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 this.deleteBtn.addEventListener('click', (e) => {\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 cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\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); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\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 private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n menuScroll.scrollIntoViewNew({\n element: menu.children[which] as HTMLElement,\n position: 'center',\n axis: 'x'\n });\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\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:', fileId);\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","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 PopupElement from \".\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport { TelegramWebviewEventCallback } 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 function createVerificationIframe(url: string, callback: TelegramWebviewEventCallback) {\n const iframe = document.createElement('iframe');\n // iframe.title = 'Complete Payment';\n iframe.allow = 'payment';\n // iframe.setAttribute('sandbox', 'allow-forms allow-scripts allow-same-origin allow-top-navigation allow-modals');\n iframe.setAttribute('sandbox', 'allow-forms allow-scripts allow-same-origin allow-modals');\n iframe.classList.add('payment-verification');\n iframe.src = url;\n\n iframe.addEventListener('load', () => {\n weakMap.set(iframe.contentWindow, callback);\n }, {once: true});\n\n return iframe;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n constructor(private url: string) {\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 iframe = createVerificationIframe(this.url, (event) => {\n if(event.eventType !== 'web_app_open_tg_link') {\n return;\n }\n\n this.dispatchEvent('finish');\n this.hide();\n appImManager.openUrl('https://t.me' + event.eventData.path_full);\n });\n\n this.body.append(iframe);\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 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 { TelegramWebviewEvent } from \"../../types\";\nimport CheckboxField from \"../checkboxField\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport CountryInputField from \"../countryInputField\";\nimport InputField, { InputFieldOptions, InputState } from \"../inputField\";\nimport Row from \"../row\";\nimport { SettingSection } from \"../sidebarLeft\";\nimport { getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken } from \"./payment\";\nimport { createVerificationIframe } from \"./paymentVerification\";\n// import { putPreloader } from \"../putPreloader\";\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 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 iframe = createVerificationIframe(paymentForm.url, (event) => {\n if(event.eventType !== 'payment_form_submit') {\n return;\n }\n\n const data = event.eventData;\n\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(iframe);\n this.show();\n }\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 const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC', \n plainText: true, \n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value),\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\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 cardSection.content.append(...[\n cardInputField.container, \n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean));\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 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 noCheckboxSubtitle: true\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 { ApiError } from \"../../lib/mtproto/apiManager\";\nimport { InputState } from \"../inputField\";\nimport PasswordInputField from \"../passwordInputField\";\nimport { SettingSection } from \"../sidebarLeft\";\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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\nimport { Message, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo } from \"../../layer\";\nimport getServerMessageId from \"../../lib/appManagers/utils/messageId/getServerMessageId\";\nimport { ApiError } from \"../../lib/mtproto/apiManager\";\nimport matchEmail from \"../../lib/richTextProcessor/matchEmail\";\nimport Button from \"../button\";\nimport CheckboxField from \"../checkboxField\";\nimport CountryInputField from \"../countryInputField\";\nimport InputField from \"../inputField\";\nimport Row from \"../row\";\nimport { SettingSection } from \"../sidebarLeft\";\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 message: Message.message,\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 noCheckboxSubtitle: true\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.message.peerId, this.message.mid, 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 { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport paymentsWrapCurrencyAmount from \"../../helpers/paymentsWrapCurrencyAmount\";\nimport { PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption } from \"../../layer\";\nimport Button from \"../button\";\nimport RadioField from \"../radioField\";\nimport Row, { RadioFormFromRows } from \"../row\";\nimport { SettingSection } from \"../sidebarLeft\";\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 loadScript from \"../../helpers/dom/loadScript\";\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, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption } from \"../../layer\";\nimport I18n, { i18n, LangPackKey, _i18n } from \"../../lib/langPack\";\nimport { ApiError } from \"../../lib/mtproto/apiManager\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport PeerTitle from \"../peerTitle\";\nimport { putPreloader } from \"../putPreloader\";\nimport Row from \"../row\";\nimport { toastNew } from \"../toast\";\nimport { wrapPhoto } from \"../wrappers\";\nimport wrapPeerTitle from \"../wrappers/peerTitle\";\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 currency: string;\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private receiptPeerId?: PeerId,\n private receiptMsgId?: number\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();\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 this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(this.message.peerId === peerId && this.message.mid === mid) {\n onConfirmed();\n }\n });\n\n const {message} = this;\n const mediaInvoice = message.media as MessageMedia.messageMediaInvoice;\n\n const isReceipt = !!(this.receiptMsgId || mediaInvoice.receipt_msg_id);\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(mediaInvoice.pFlags.test) {\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(mediaInvoice.photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: mediaInvoice.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 lines = document.createElement('div');\n lines.classList.add(linesClassName);\n\n const title = document.createElement('div');\n title.classList.add(linesClassName + '-title');\n\n const description = document.createElement('div');\n description.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n lines.append(title, description, botName);\n\n setInnerHTML(title, wrapEmojiText(mediaInvoice.title));\n setInnerHTML(description, wrapEmojiText(mediaInvoice.description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n \n details.append(lines);\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 let paymentForm: PaymentsPaymentForm | PaymentsPaymentReceipt;\n \n this.receiptMsgId ??= mediaInvoice.receipt_msg_id;\n this.receiptPeerId ??= this.receiptMsgId && message.peerId;\n\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(this.receiptPeerId, this.receiptMsgId);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(message.peerId, message.mid);\n \n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials;\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(message.peerId, message.mid, savedInfo).catch(() => undefined),\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 = this.currency = invoice.currency;\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, 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\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 let 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\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, message, 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 this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container)\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 message.peerId, \n message.mid, \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);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n // setTimeout(() => {\n onConfirmed();\n // }, 0);\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 let payButton: HTMLElement;\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 this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager, ChatSavedPosition } from \"../../lib/appManagers/appImManager\";\r\nimport type { HistoryResult, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport ripple from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, User, WebPage } from \"../../layer\";\r\nimport { BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection, ScrollStartCallbackDimensions } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport deferredPromise from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast, toastNew } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport debounce, { DebounceReturnType } from \"../../helpers/schedulers/debounce\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport Button from \"../button\";\r\nimport { CallType } from \"../../lib/calls/types\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport PopupJoinChatInvite from \"../popups/joinChatInvite\";\r\nimport { InternalLink, INTERNAL_LINK_TYPE } from \"../../lib/appManagers/internalLink\";\r\nimport ReactionsElement, { REACTIONS_ELEMENTS } from \"./reactions\";\r\nimport type ReactionElement from \"./reaction\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport pause from \"../../helpers/schedulers/pause\";\r\nimport ScrollSaver from \"../../helpers/scrollSaver\";\r\nimport getObjectKeysAndSort from \"../../helpers/object/getObjectKeysAndSort\";\r\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\r\nimport formatNumber from \"../../helpers/number/formatNumber\";\r\nimport getViewportSlice from \"../../helpers/dom/getViewportSlice\";\r\nimport SuperIntersectionObserver from \"../../helpers/dom/superIntersectionObserver\";\r\nimport generateFakeIcon from \"../generateFakeIcon\";\r\nimport copyFromElement from \"../../helpers/dom/copyFromElement\";\r\nimport PopupElement from \"../popups\";\r\nimport setAttachmentSize from \"../../helpers/setAttachmentSize\";\r\nimport wrapWebPageDescription from \"../wrappers/webPageDescription\";\r\nimport wrapWebPageTitle from \"../wrappers/webPageTitle\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\r\nimport wrapMessageActionTextNew from \"../wrappers/messageActionTextNew\";\r\nimport isMentionUnread from \"../../lib/appManagers/utils/messages/isMentionUnread\";\r\nimport getMediaFromMessage from \"../../lib/appManagers/utils/messages/getMediaFromMessage\";\r\nimport getPeerColorById from \"../../lib/appManagers/utils/peers/getPeerColorById\";\r\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\r\nimport getServerMessageId from \"../../lib/appManagers/utils/messageId/getServerMessageId\";\r\nimport generateMessageId from \"../../lib/appManagers/utils/messageId/generateMessageId\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport { Awaited } from \"../../types\";\r\nimport idleController from \"../../helpers/idleController\";\r\nimport overlayCounter from \"../../helpers/overlayCounter\";\r\nimport { cancelContextMenuOpening } from \"../../helpers/dom/attachContextMenuListener\";\r\nimport contextMenuController from \"../../helpers/contextMenuController\";\r\nimport { AckedResult } from \"../../lib/mtproto/superMessagePort\";\r\nimport middlewarePromise from \"../../helpers/middlewarePromise\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport noop from \"../../helpers/noop\";\r\nimport getAlbumText from \"../../lib/appManagers/utils/messages/getAlbumText\";\r\nimport paymentsWrapCurrencyAmount from \"../../helpers/paymentsWrapCurrencyAmount\";\r\nimport PopupPayment from \"../popups/payment\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nexport const SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\nexport const STICKY_OFFSET = 3;\r\nconst SCROLLED_DOWN_THRESHOLD = 300;\r\nconst PEER_CHANGED_ERROR = new Error('peer changed');\r\n\r\nconst DO_NOT_SLICE_VIEWPORT = false;\r\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\r\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\r\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\r\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\r\n\r\ntype Bubble = {\r\n bubble: HTMLElement, \r\n mids: Set, \r\n groupedId?: string\r\n};\r\n\r\ntype MyHistoryResult = HistoryResult | {history: number[]};\r\n\r\nfunction getMainMidForGrouped(mids: number[]) {\r\n return Math.max(...mids);\r\n}\r\n\r\nexport default class ChatBubbles {\r\n public container: HTMLDivElement;\r\n public chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\r\n public bubblesNew: {[mid: string]: Bubble} = {};\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLElement, \r\n firstTimestamp: number, \r\n container: HTMLElement,\r\n timeout?: number \r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: ReturnType[] = [];\r\n // private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderBubble: HTMLElement;\r\n\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n \r\n private hoverBubble: HTMLElement;\r\n private hoverReaction: HTMLElement;\r\n private sliceViewportDebounced: DebounceReturnType;\r\n private resizeObserver: ResizeObserver;\r\n private willScrollOnLoad: boolean;\r\n private observer: SuperIntersectionObserver;\r\n\r\n private renderingMessages: Set = new Set();\r\n private setPeerCached: boolean;\r\n private attachPlaceholderOnRender: () => void;\r\n\r\n private bubblesToEject: Set = new Set();\r\n private bubblesToReplace: Map = new Map(); // TO -> FROM\r\n private updatePlaceholderPosition: () => void;\r\n private setPeerOptions: {lastMsgId: number; topMessage: number;};\r\n\r\n private setPeerTempId: number = 0;\r\n\r\n private renderNewPromises: Set> = new Set();\r\n\r\n // private reactions: Map;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private managers: AppManagers\r\n ) {\r\n this.log = this.chat.log;\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.constructBubbles();\r\n\r\n // * constructor end\r\n\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // this.reactions = new Map();\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\r\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\r\n return;\r\n }\r\n\r\n const {mid} = message;\r\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\r\n log && log('start');\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n if(this.renderNewPromises.size) {\r\n log && log.error('will await new messages render');\r\n await Promise.all(Array.from(this.renderNewPromises));\r\n }\r\n\r\n if(this.messagesQueuePromise) {\r\n log && log.error('messages render in process');\r\n await this.messagesQueuePromise;\r\n }\r\n\r\n if(this.bubbles[mid] !== bubble) return;\r\n\r\n // await getHeavyAnimationPromise();\r\n \r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(!item) { // probably a group item\r\n log && log.error('no item by bubble', bubble);\r\n return;\r\n } else if(item.mid === mid) {\r\n log && log.warn('wow what', item, mid);\r\n return;\r\n }\r\n\r\n if(sequential) {\r\n const group = item.group;\r\n const newItem = this.bubbleGroups.createItem(bubble, message);\r\n // newItem.mid = item.mid;\r\n const _items = this.bubbleGroups.itemsArr.slice();\r\n indexOfAndSplice(_items, item);\r\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\r\n if(\r\n group === foundItem?.group \r\n || (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) \r\n || (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\r\n ) {\r\n log && log('item has correct position', item);\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n }\r\n\r\n // return;\r\n\r\n // await fastRafPromise();\r\n // if(this.bubbles[mid] !== bubble) return;\r\n\r\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\r\n this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\r\n // log && log('group has collapsed', item);\r\n\r\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\r\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\r\n // const siblingGroup = siblingGroups[i];\r\n // const siblingItems = siblingGroup.items;\r\n // const nextGroup = siblingGroups[i + 1];\r\n // const nextItems = nextGroup.items;\r\n\r\n // let _break = false, moved = false;\r\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\r\n // const siblingItem = siblingItems[j];\r\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\r\n // if(!foundItem) {\r\n // _break = true;\r\n // break;\r\n // }\r\n\r\n // log('will move item', siblingItem, nextGroup);\r\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\r\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\r\n // moved = true;\r\n // }\r\n\r\n // if(moved) {\r\n // nextGroup.mount();\r\n // }\r\n\r\n // if(_break) {\r\n // break;\r\n // }\r\n // }\r\n // }\r\n\r\n const {groups} = this.groupBubbles([{bubble, message}]);\r\n this.bubbleGroups.mountUnmountGroups(groups);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n log && log('end');\r\n\r\n // this.bubbleGroups.findIncorrentPositions();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\r\n const {storageKey, tempId, tempMessage, mid, message} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.messagesStorageKey !== storageKey) {\r\n return;\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n const _bubble = bubbles[tempId];\r\n if(_bubble) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n bubble.dataset.mid = '' + mid;\r\n delete bubbles[tempId];\r\n\r\n fastRaf(() => {\r\n const mid = +bubble.dataset.mid;\r\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\r\n bubble.classList.remove('is-sending', 'is-outgoing');\r\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n\r\n if(!_bubble) {\r\n return;\r\n }\r\n\r\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\r\n const mids = messages.map(({mid}) => mid);\r\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\r\n return;\r\n }\r\n \r\n if(bubbles[mid] !== _bubble) {\r\n return;\r\n }\r\n\r\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\r\n } else {\r\n messages = [message];\r\n tempIds = [tempId];\r\n }\r\n\r\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\r\n if(reactionsElements.length) {\r\n reactionsElements.forEach((reactionsElement) => {\r\n reactionsElement.changeMessage(message as Message.message);\r\n });\r\n }\r\n\r\n (messages as Message.message[]).forEach((message, idx) => {\r\n if(!message) {\r\n return;\r\n }\r\n\r\n const tempId = tempIds[idx];\r\n const mid = message.mid;\r\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\r\n\r\n if(message._ !== 'message') {\r\n return;\r\n }\r\n\r\n if(message.replies) {\r\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\r\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\r\n const poll = (media as MessageMedia.messageMediaPoll).poll;\r\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\r\n if(doc) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\r\n getHeavyAnimationPromise().then(async() => {\r\n const timeSpan = div.querySelector('.time');\r\n const newDiv = await wrapDocument({message});\r\n div.replaceWith(newDiv);\r\n \r\n if(timeSpan) {\r\n newDiv.querySelector('.document-size').append(timeSpan);\r\n }\r\n });\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = '' + doc.id;\r\n }\r\n }\r\n } else if(poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', '' + poll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n } else if(webPage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, bubble);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n }\r\n \r\n // set new mids to album items for mediaViewer\r\n if(groupedId) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n const bubble = this.bubbles[message.mid];\r\n if(!bubble) return;\r\n\r\n await getHeavyAnimationPromise();\r\n if(this.bubbles[message.mid] !== bubble) return;\r\n\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\r\n if(peerId !== this.peerId) return;\r\n \r\n const mids = messages.map(({mid}) => mid);\r\n const oldMids = mids.concat(Array.from(deletedMids));\r\n const wasMainMid = getMainMidForGrouped(oldMids);\r\n const bubble = this.bubbles[wasMainMid];\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n const mainMid = getMainMidForGrouped(mids);\r\n const message = messages.find((message) => message.mid === mainMid);\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n\r\n if(this.chat.type !== 'scheduled' && !DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\r\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\r\n let scrollSaver: ScrollSaver;\r\n\r\n const a = arr.map(async({message, changedResults}) => {\r\n if(this.peerId !== message.peerId) {\r\n return;\r\n }\r\n\r\n const result = await this.getMountedBubble(message.mid, message);\r\n if(!result) {\r\n return;\r\n }\r\n\r\n return {bubble: result.bubble, message, changedResults};\r\n });\r\n\r\n let top: number;\r\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\r\n if(!scrollSaver) {\r\n scrollSaver = this.createScrollSaver(false);\r\n scrollSaver.save();\r\n }\r\n \r\n const key = message.peerId + '_' + message.mid;\r\n const set = REACTIONS_ELEMENTS.get(key);\r\n if(set) {\r\n for(const element of set) {\r\n element.update(message, changedResults);\r\n }\r\n } else if(!message.reactions || !message.reactions.results.length) {\r\n return;\r\n } else {\r\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\r\n }\r\n });\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n }\r\n\r\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n await getHeavyAnimationPromise();\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach((mid) => {\r\n const needUpdate = this.needUpdate;\r\n const filtered: typeof needUpdate[0][] = [];\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n this.needUpdate.splice(idx, 1)[0];\r\n filtered.push(obj);\r\n }\r\n });\r\n\r\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n });\r\n });\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\r\n if(e.button !== 0) return;\r\n \r\n const code: HTMLElement = findUpTag(e.target, 'CODE');\r\n if(code) {\r\n cancelEvent(e);\r\n copyFromElement(code);\r\n toastNew({langPackKey: 'TextCopied'});\r\n return;\r\n }\r\n });\r\n\r\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n const dateBubble = dateMessage.div;\r\n\r\n // dateMessage.container.classList.add('has-sticky-dates');\r\n\r\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\r\n // if(this.previousStickyDate) {\r\n // dateBubble.classList.add('kek');\r\n // }\r\n\r\n dateBubble.classList.toggle('is-sticky', stuck);\r\n if(stuck) {\r\n this.previousStickyDate = dateBubble;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(this.previousStickyDate) {\r\n // fastRaf(() => {\r\n // this.bubblesContainer.classList.add('has-sticky-dates');\r\n // });\r\n }\r\n });\r\n\r\n if(!IS_SAFARI) {\r\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\r\n }\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced.clearTimeout();\r\n // }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced();\r\n // }\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n private constructBubbles() {\r\n const container = this.container = document.createElement('div');\r\n container.classList.add('bubbles', 'scrolled-down');\r\n\r\n const chatInner = this.chatInner = document.createElement('div');\r\n chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n container.append(this.scrollable.container);\r\n }\r\n\r\n public attachContainerListeners() {\r\n const container = this.container;\r\n\r\n this.chat.contextMenu.attachTo(container);\r\n this.chat.selection.attachListeners(container, new ListenerSetter());\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(container)('dblclick', async(e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', await this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(this.chat.type !== 'pinned' && this.chat.type !== 'scheduled') {\r\n if(!IS_MOBILE) {\r\n this.listenerSetter.add(container)('dblclick', async(e) => {\r\n if(this.chat.selection.isSelecting || \r\n !(await this.chat.canSend())) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = await this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n } else if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: container,\r\n verifyTouchTarget: async(e) => {\r\n if(this.chat.selection.isSelecting || !(await this.chat.canSend())) {\r\n return false;\r\n }\r\n \r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n \r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n \r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n \r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n \r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n \r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n \r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n \r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n }\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessage(message, true);\r\n }\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n const gradientRenderer = this.chat.gradientRenderer;\r\n if(gradientRenderer) {\r\n gradientRenderer.toNextPosition();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\r\n if(this.peerId !== message.peerId) return;\r\n this.renderNewMessage(message);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.updateUnreadByDialog();\r\n });\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = await this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n const callbacks = await Promise.all([\r\n this.finishPeerChange(),\r\n this.chat.input.finishPeerChange(),\r\n ]);\r\n\r\n callbacks.forEach((callback) => callback());\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\r\n if(key === 'settings.emoji.big') {\r\n const middleware = this.getMiddleware();\r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n const m = mids.map(async(mid) => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n return {bubble, message: await this.chat.getMessage(mid)};\r\n }\r\n });\r\n\r\n const awaited = await Promise.all(m);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n awaited.forEach(({bubble, message}) => {\r\n if(this.bubbles[message.mid] !== bubble) {\r\n return;\r\n }\r\n \r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n }\r\n });\r\n\r\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\r\n fastRaf(() => {\r\n let scrollSaver: ScrollSaver;\r\n for(const {peerId, views, mid} of arr) {\r\n if(this.peerId !== peerId) continue;\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) continue;\r\n \r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(!postViewsElements.length) continue;\r\n\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach((postViews) => {\r\n if(different || postViews.textContent !== str) {\r\n if(!scrollSaver) {\r\n scrollSaver = this.createScrollSaver(true);\r\n scrollSaver.save();\r\n }\r\n\r\n different = true;\r\n postViews.textContent = str;\r\n }\r\n });\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n });\r\n\r\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\r\n\r\n this.listenerSetter.add(this.chat.appImManager)('chat_changing', ({to}) => {\r\n const freeze = to !== this.chat;\r\n\r\n const cb = () => {\r\n this.observer.toggleObservingNew(freeze);\r\n };\r\n\r\n if(!freeze) {\r\n setTimeout(() => {\r\n cb();\r\n }, 400);\r\n } else {\r\n cb();\r\n }\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n }\r\n\r\n private get peerId() {\r\n return this.chat.peerId;\r\n }\r\n\r\n private createScrollSaver(reverse = true) {\r\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\r\n return scrollSaver;\r\n }\r\n\r\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n };\r\n\r\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), sponsoredMessage.random_id);\r\n }\r\n }\r\n }\r\n };\r\n\r\n private createResizeObserver() {\r\n if(!('ResizeObserver' in window) || this.resizeObserver) {\r\n return;\r\n }\r\n\r\n const container = this.scrollable.container;\r\n let wasHeight = 0/* container.offsetHeight */;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n // let skipNext = true;\r\n\r\n const onResizeEnd = () => {\r\n const height = container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n //this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries: ResizeObserverCallback = (entries) => {\r\n /* if(skipNext) {\r\n skipNext = false;\r\n return;\r\n } */\r\n\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n \r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n\r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n //if(isSafari) { // * fix opening keyboard while ESG is active \r\n part = -realDiff;\r\n //}\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.setScrollTopSilently(needScrollTop);\r\n }\r\n \r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(container);\r\n }\r\n\r\n private destroyResizeObserver() {\r\n const resizeObserver = this.resizeObserver;\r\n if(!resizeObserver) {\r\n return;\r\n }\r\n\r\n resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n private onBubblesMouseMove = async(e: MouseEvent) => {\r\n const content = findUpClassName(e.target, 'bubble-content');\r\n if(content && !this.chat.selection.isSelecting) {\r\n const bubble = findUpClassName(content, 'bubble');\r\n if(!this.chat.selection.canSelectBubble(bubble)) {\r\n this.unhoverPrevious();\r\n return;\r\n }\r\n\r\n let {hoverBubble, hoverReaction} = this;\r\n if(bubble === hoverBubble) {\r\n return;\r\n }\r\n\r\n this.unhoverPrevious();\r\n\r\n hoverBubble = this.hoverBubble = bubble;\r\n hoverReaction = this.hoverReaction;\r\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\r\n if(!hoverReaction) {\r\n hoverReaction = this.hoverReaction = document.createElement('div');\r\n hoverReaction.classList.add('bubble-hover-reaction');\r\n\r\n const stickerWrapper = document.createElement('div');\r\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\r\n hoverReaction.append(stickerWrapper);\r\n\r\n content.append(hoverReaction);\r\n\r\n let message = (await this.chat.getMessage(+bubble.dataset.mid)) as Message.message;\r\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\r\n\r\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\r\n Promise.all([\r\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\r\n pause(400)\r\n ]).then(([availableReactions]) => {\r\n const availableReaction = availableReactions[0];\r\n if(!availableReaction) {\r\n hoverReaction.remove();\r\n return;\r\n }\r\n\r\n wrapSticker({\r\n div: stickerWrapper,\r\n doc: availableReaction.select_animation,\r\n width: 18,\r\n height: 18,\r\n needUpscale: true,\r\n middleware,\r\n group: CHAT_ANIMATION_GROUP,\r\n withThumb: false,\r\n needFadeIn: false\r\n }).then(({render}) => render).then((player) => {\r\n assumeType(player);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n player.addEventListener('firstFrame', () => {\r\n if(!middleware()) {\r\n // debugger;\r\n return;\r\n }\r\n\r\n hoverReaction.dataset.loaded = '1';\r\n this.setHoverVisible(hoverReaction, true);\r\n }, {once: true});\r\n\r\n attachClickEvent(hoverReaction, (e) => {\r\n cancelEvent(e); // cancel triggering selection\r\n\r\n this.managers.appReactionsManager.sendReaction(message, availableReaction.reaction);\r\n this.unhoverPrevious();\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n } else if(hoverReaction.dataset.loaded) {\r\n this.setHoverVisible(hoverReaction, true);\r\n }\r\n } else {\r\n this.unhoverPrevious();\r\n }\r\n };\r\n\r\n public setReactionsHoverListeners() {\r\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\r\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\r\n }\r\n\r\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\r\n SetTransition(hoverReaction, 'is-visible', visible, 200, visible ? undefined : () => {\r\n hoverReaction.remove();\r\n }, 2);\r\n }\r\n\r\n private unhoverPrevious = () => {\r\n const {hoverBubble, hoverReaction} = this;\r\n if(hoverBubble) {\r\n this.setHoverVisible(hoverReaction, false);\r\n this.hoverBubble = undefined;\r\n this.hoverReaction = undefined;\r\n }\r\n };\r\n\r\n public setStickyDateManually() {\r\n return;\r\n\r\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.observer.unobserve(target, this.unreadedObserverCallback);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = idleController.getFocusPromise().then(async() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = await this.chat.getMessage(mid);\r\n if(isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = async() => {\r\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\r\n if(message.peerId !== this.peerId) return;\r\n\r\n this.renderNewMessage(message);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = async(e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble && !this.chat.selection.isSelecting) {\r\n const avatar = findUpClassName(target, 'user-avatar');\r\n if(!avatar) {\r\n return;\r\n }\r\n\r\n const peerId = avatar.dataset.peerId.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n return;\r\n }\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\r\n if(buyButton) {\r\n cancelEvent(e);\r\n \r\n const message = await this.chat.getMessage(+bubble.dataset.mid);\r\n if(!message) {\r\n return;\r\n }\r\n\r\n new PopupPayment(message as Message.message);\r\n return;\r\n }\r\n\r\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\r\n if(reactionElement) {\r\n cancelEvent(e);\r\n if(reactionElement.classList.contains('is-inactive')) {\r\n return;\r\n }\r\n\r\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\r\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\r\n\r\n const message = reactionsElement.getMessage();\r\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message1 = await this.chat.getMessage(bubbleMid);\r\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\r\n const replies = message.replies;\r\n if(replies) {\r\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion', \r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n if(target.classList.contains('is-receipt-link')) {\r\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\r\n if(message) {\r\n new PopupPayment(message as Message.message, this.peerId, +bubble.dataset.mid);\r\n }\r\n } else {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n }\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = await this.chat.getMessage(messageId);\r\n\r\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))\r\n || target.classList.contains('canvas-thumbnail')) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\r\n if(preloader) {\r\n simulateClickEvent(preloader);\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = await this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\r\n\r\n const message = await this.chat.getMessage(mid);\r\n const media = getMediaFromMessage(message);\r\n \r\n return media && f(media) && mid;\r\n }))).filter(Boolean).sort((a, b) => a - b);\r\n\r\n ids.forEach((id) => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex((t) => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId, \r\n lastMsgId: replyToMid, \r\n type: this.chat.type, \r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public async onGoDownClick() {\r\n if(!this.replyFollowHistory.length) {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n\r\n return;\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const slice = this.replyFollowHistory.slice();\r\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\r\n if(!middleware()) return;\r\n\r\n slice.forEach((mid, idx) => {\r\n const message = messages[idx];\r\n\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else if(message) {\r\n bad = false;\r\n }\r\n\r\n if(bad) {\r\n this.replyFollowHistory.splice(this.replyFollowHistory.indexOf(mid), 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public async getGroupedBubble(groupId: string) {\r\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of mids) {\r\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\r\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: mid,\r\n // message: await this.chat.getMessage(maxId) as Message.message\r\n };\r\n }\r\n }\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\r\n if(message === undefined) {\r\n message = await this.chat.getMessage(mid);\r\n }\r\n\r\n if(!message) {\r\n return;\r\n }\r\n\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n const a = await this.getGroupedBubble(groupedId);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\r\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\r\n\r\n let filterCallback: (_mid: number) => boolean;\r\n if(prev) filterCallback = (_mid) => _mid < mid;\r\n else filterCallback = (_mid) => mid < _mid;\r\n\r\n const foundMid = mids.find((_mid) => {\r\n if(!filterCallback(_mid)) return false;\r\n return !!this.bubbles[_mid]?.parentElement;\r\n });\r\n\r\n return this.bubbles[foundMid];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n //this.log('loadMoreHistory', top);\r\n if(\r\n !this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n // some messages can have negative id (such as sponsored message)\r\n const history = Object.keys(this.bubbles)\r\n .map((id) => +id)\r\n .filter((id) => id > 0 && !this.skippedMids.has(id))\r\n .sort((a, b) => a - b);\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n // const historyMaxId = await this.chat.getHistoryMaxId();\r\n \r\n // // if scroll down after search\r\n // if(history.indexOf(historyMaxId) !== -1) {\r\n // this.setLoaded('bottom', true);\r\n // return;\r\n // }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions) => {\r\n // return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.sliceViewportDebounced) {\r\n this.sliceViewportDebounced.clearTimeout();\r\n }\r\n\r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.scrolledDown && !ignoreHeavyAnimation) {\r\n return;\r\n }\r\n } else {\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\r\n }\r\n \r\n if(this.sliceViewportDebounced) {\r\n this.sliceViewportDebounced();\r\n }\r\n \r\n this.setStickyDateManually();\r\n }\r\n \r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\r\n return;\r\n }\r\n\r\n const distanceToEnd = scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\r\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions) {\r\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n \r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350 + (scrollDimensions?.duration ?? 0));\r\n }\r\n \r\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.container.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.container.classList.contains('scrolled-down')) {\r\n this.container.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n };\r\n\r\n public setScroll() {\r\n if(this.scrollable) {\r\n this.destroyScrollable();\r\n }\r\n\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false, false);\r\n this.setLoaded('bottom', false, false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED && false) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public async updateUnreadByDialog() {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n this.unreadOut.delete(msgId);\r\n\r\n if(bubble.classList.contains('is-outgoing')) {\r\n continue;\r\n }\r\n \r\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)\r\n bubble.classList.add('is-read');\r\n }\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\r\n let deleted = false;\r\n mids.forEach((mid) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n deleted = true;\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n if(this.observer) {\r\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\r\n this.unreaded.delete(bubble);\r\n\r\n this.observer.unobserve(bubble, this.viewsObserverCallback);\r\n this.viewsMids.delete(mid);\r\n }\r\n\r\n if(this.emptyPlaceholderBubble === bubble) {\r\n this.emptyPlaceholderBubble = undefined;\r\n }\r\n\r\n // this.reactions.delete(mid);\r\n });\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.scrollable.ignoreNextScrollEvent();\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n\r\n if(!ignoreOnScroll) {\r\n this.scrollable.onScroll();\r\n // this.onScroll();\r\n }\r\n }\r\n\r\n private setTopPadding(middleware = this.getMiddleware()) {\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.setScrollTopSilently(scrollHeight);\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n return {\r\n isPaddingNeeded,\r\n unsetPadding: isPaddingNeeded ? () => {\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n } : undefined\r\n };\r\n }\r\n\r\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\r\n const promise = this._renderNewMessage(message, scrolledDown);\r\n this.renderNewPromises.add(promise);\r\n promise.catch(noop).finally(() => {\r\n this.renderNewPromises.delete(promise);\r\n });\r\n return promise;\r\n }\r\n \r\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise) {\r\n const middleware = this.getMiddleware();\r\n setPeerPromise.then(async() => {\r\n if(!middleware()) return;\r\n const newMessage = await this.chat.getMessage(message.mid);\r\n if(!middleware()) return;\r\n this.renderNewMessage(newMessage);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n const replyTo = message?.reply_to as MessageReplyHeader;\r\n if(!(replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId)) {\r\n return;\r\n }\r\n }\r\n\r\n if(this.bubbles[message.mid]) {\r\n return;\r\n }\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble || \r\n this.scrollingToBubble === this.getLastBubble() || \r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\r\n\r\n const promise = this.performHistoryResult({history: [message]}, false);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[message.mid];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n // it will be called only once even if was set multiple times (that won't happen)\r\n promise.then(unsetPadding);\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public getLastBubble() {\r\n const group = this.bubbleGroups.getLastGroup();\r\n return group?.lastItem?.bubble;\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n if(!element.parentElement) {\r\n this.log.error('element is not connected', bubble);\r\n }\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end') {\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\r\n const dateGroup = item.group.container.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n let margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n const promise = this.scrollable.scrollIntoViewNew({\r\n element, \r\n position, \r\n margin, \r\n forceDirection, \r\n forceDuration, \r\n axis: 'y', \r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.container.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering,\r\n startCallback: (dimensions) => {\r\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\r\n this.onScroll(true, dimensions);\r\n }\r\n });\r\n\r\n // fix flickering date when opening unread chat and focusing message\r\n if(forceDirection === FocusDirection.Static) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n // private getLastDateGroup() {\r\n // let lastTime = 0, lastElem: HTMLElement;\r\n // for(const i in this.dateMessages) {\r\n // const dateMessage = this.dateMessages[i];\r\n // if(dateMessage.firstTimestamp > lastTime) {\r\n // lastElem = dateMessage.container;\r\n // lastTime = dateMessage.firstTimestamp;\r\n // }\r\n // }\r\n\r\n // return lastElem;\r\n // }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\r\n let dateElement: HTMLElement;\r\n \r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n \r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n \r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n\r\n return bubble;\r\n }\r\n\r\n public getDateForDateContainer(timestamp: number) {\r\n const date = new Date(timestamp * 1000);\r\n date.setHours(0, 0, 0);\r\n return {date, dateTimestamp: date.getTime()};\r\n }\r\n\r\n public getDateContainerByTimestamp(timestamp: number) {\r\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\r\n if(!this.dateMessages[dateTimestamp]) {\r\n const bubble = this.createDateBubble(timestamp, date);\r\n // bubble.classList.add('is-sticky');\r\n const fakeBubble = this.createDateBubble(timestamp, date);\r\n fakeBubble.classList.add('is-fake');\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble, fakeBubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n\r\n if(this.chatInner.parentElement) {\r\n this.container.classList.add('has-groups');\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n private destroyScrollable() {\r\n this.scrollable.destroy();\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.destroyScrollable();\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.observer && this.observer.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.observer && delete this.observer;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false, false);\r\n this.setLoaded('bottom', false, false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n this.renderNewPromises.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n this.chatInner.textContent = '';\r\n this.cleanupPlaceholders();\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.observer) {\r\n this.observer.disconnect();\r\n\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n\r\n this.viewsMids.clear();\r\n }\r\n\r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.attachPlaceholderOnRender = undefined;\r\n this.emptyPlaceholderBubble = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n this.renderingMessages.clear();\r\n this.bubblesToEject.clear();\r\n this.bubblesToReplace.clear();\r\n\r\n // this.reactions.clear();\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n\r\n this.container.classList.remove('has-sticky-dates');\r\n this.scrollable.cancelMeasure();\r\n }\r\n\r\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\r\n if(bubble) {\r\n bubble.remove();\r\n\r\n if(this.emptyPlaceholderBubble === bubble) {\r\n this.emptyPlaceholderBubble = undefined;\r\n }\r\n }\r\n }\r\n\r\n public async setPeer(samePeer: boolean, peerId: PeerId, lastMsgId?: number, startParam?: string): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\r\n const tempId = ++this.setPeerTempId;\r\n\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.preloader.detach();\r\n return null;\r\n }\r\n\r\n const perf = performance.now();\r\n const log = this.log.bindPrefix('setPeer');\r\n log.warn('start');\r\n\r\n const middleware = () => {\r\n return this.setPeerTempId === tempId;\r\n };\r\n\r\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\r\n\r\n if(!samePeer) {\r\n await m(this.chat.onChangePeer(m));\r\n }\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled' || this.chat.isRestricted) {\r\n lastMsgId = 0;\r\n }\r\n\r\n const historyStorage = await m(this.chat.getHistoryStorage());\r\n let topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId)) : historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let followingUnread: boolean;\r\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\r\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\r\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\r\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\r\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\r\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\r\n }\r\n\r\n followingUnread = !isTarget;\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n //lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\r\n\r\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\r\n startParam = BOT_START_PARAM;\r\n }\r\n\r\n if(samePeer) {\r\n const mounted = await m(this.getMountedBubble(lastMsgId));\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\r\n this.scrollToEnd();\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || await m(this.managers.appUsersManager.isBot(peerId))\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n this.destroyResizeObserver();\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\r\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\r\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const scrollFromDown = !fromUp && samePeer;\r\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\r\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\r\n\r\n this.setPeerOptions = {\r\n lastMsgId,\r\n topMessage\r\n };\r\n\r\n let result: Awaited>;\r\n if(!savedPosition) {\r\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult({history: savedPosition.mids}, true);\r\n }) as any,\r\n cached: true,\r\n waitPromise: Promise.resolve()\r\n };\r\n }\r\n\r\n this.setPeerCached = result.cached;\r\n\r\n log.warn('got history');// warning\r\n\r\n const {promise, cached} = result;\r\n\r\n if(!cached && !samePeer) {\r\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\r\n this.scrollable.container.textContent = '';\r\n // oldContainer.textContent = '';\r\n //oldChatInner.remove();\r\n this.preloader.attach(this.container);\r\n }\r\n\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n\r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = m(promise).then(async() => {\r\n log.warn('promise fulfilled');\r\n\r\n let mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\r\n if(cached && !samePeer) {\r\n log.warn('finishing peer change');\r\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\r\n log.warn('finished peer change');\r\n }\r\n\r\n this.preloader.detach();\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n this.setPeerCached = undefined;\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n const scrollable = this.scrollable;\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollPosition = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\r\n\r\n if(oldPlaceholderBubble) {\r\n this.cleanupPlaceholders(oldPlaceholderBubble);\r\n }\r\n\r\n if(this.attachPlaceholderOnRender) {\r\n this.attachPlaceholderOnRender();\r\n }\r\n\r\n if(!isTarget && this.chat.type === 'chat' && this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(0);\r\n }\r\n\r\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\r\n\r\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.setScrollTopSilently(savedPosition.top);\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if(haveToScrollToBubble) {\r\n let unsetPadding: () => void;\r\n if(scrollFromDown) {\r\n scrollable.setScrollTopSilently(99999);\r\n } else if(scrollFromUp) {\r\n const set = this.setTopPadding();\r\n if(set.isPaddingNeeded) {\r\n unsetPadding = set.unsetPadding;\r\n }\r\n\r\n scrollable.setScrollTopSilently(0);\r\n }\r\n\r\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\r\n }\r\n \r\n let promise: Promise;\r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n const lastBubble = this.getLastBubble();\r\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\r\n\r\n if(position === 'end' && lastBubble === bubble && samePeer) {\r\n promise = this.scrollToEnd();\r\n } else {\r\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\r\n }\r\n\r\n if(!followingUnread && isTarget) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n\r\n if(unsetPadding) {\r\n (promise || Promise.resolve()).then(() => {\r\n unsetPadding();\r\n });\r\n }\r\n } else {\r\n scrollable.setScrollTopSilently(99999);\r\n }\r\n\r\n // if(!cached) {\r\n this.onRenderScrollSet();\r\n // }\r\n\r\n this.onScroll();\r\n\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n\r\n // if(cached) {\r\n // this.onRenderScrollSet();\r\n // }\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n Promise.all([\r\n this.setFetchReactionsInterval(afterSetPromise),\r\n this.setFetchHistoryInterval({\r\n afterSetPromise,\r\n lastMsgId,\r\n samePeer,\r\n savedPosition,\r\n topMessage\r\n }),\r\n ]).then(() => {\r\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n });\r\n\r\n if(chatType === 'chat') {\r\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\r\n if(dialog?.pFlags.unread_mark) {\r\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n }).catch((err) => {\r\n log.error('getHistory promise error:', err);\r\n if(!middleware()) {\r\n this.preloader.detach();\r\n }\r\n\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\r\n const middleware = this.getMiddleware();\r\n const needReactionsInterval = await this.managers.appPeersManager.isChannel(this.peerId);\r\n if(needReactionsInterval) {\r\n const fetchReactions = async() => {\r\n if(!middleware()) return;\r\n\r\n const mids: number[] = [];\r\n for(const mid in this.bubbles) {\r\n let message = await this.chat.getMessage(+mid);\r\n if(message?._ !== 'message') {\r\n continue;\r\n }\r\n\r\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\r\n mids.push(message.mid);\r\n }\r\n\r\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\r\n promise.then(() => {\r\n setTimeout(fetchReactions, 10e3);\r\n });\r\n };\r\n\r\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\r\n fetchReactions();\r\n });\r\n }\r\n }\r\n\r\n private async setFetchHistoryInterval({\r\n lastMsgId,\r\n topMessage,\r\n afterSetPromise,\r\n savedPosition,\r\n samePeer\r\n }: {\r\n lastMsgId: number,\r\n topMessage: number,\r\n afterSetPromise: Promise,\r\n savedPosition: ChatSavedPosition,\r\n samePeer: boolean\r\n }) {\r\n const middleware = this.getMiddleware();\r\n const peerId = this.peerId;\r\n\r\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n return;\r\n }\r\n\r\n await afterSetPromise;\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.setLoaded('bottom', false);\r\n this.scrollable.checkForTriggers();\r\n\r\n if(!needFetchInterval) {\r\n return;\r\n }\r\n\r\n const f = () => {\r\n this.fetchNewPromise = new Promise(async(resolve) => {\r\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\r\n resolve();\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\r\n if(!middleware() || !result) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const {isBottomEnd} = result;\r\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n\r\n public async onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const historyMaxId = await this.chat.getHistoryMaxId();\r\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public async finishPeerChange() {\r\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\r\n this.managers.appPeersManager.isChannel(this.peerId),\r\n this.chat.canSend(),\r\n this.chat.isAnyGroup\r\n ]);\r\n\r\n return () => {\r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\r\n \r\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n \r\n this.createResizeObserver();\r\n };\r\n }\r\n\r\n public renderMessagesQueue(options: ChatBubbles['messagesQueue'][0]) {\r\n this.messagesQueue.push(options);\r\n return this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(!this.messagesQueue.length) return Promise.resolve();\r\n\r\n if(this.messagesQueuePromise) {\r\n return this.messagesQueuePromise;\r\n }\r\n \r\n const middleware = this.getMiddleware();\r\n const log = this.log.bindPrefix('queue');\r\n const possibleError = PEER_CHANGED_ERROR;\r\n const m = middlewarePromise(middleware, possibleError);\r\n\r\n const processQueue = async(): Promise => {\r\n log('start');\r\n\r\n // if(!this.chat.setPeerPromise) {\r\n // await pause(10000000);\r\n // }\r\n\r\n const renderQueue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const renderQueuePromises = renderQueue.map((promise) => {\r\n const perf = performance.now();\r\n promise.then((details) => {\r\n log('render message time', performance.now() - perf, details);\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n let loadQueue = await m(Promise.all(renderQueuePromises));\r\n const filterQueue = (queue: typeof loadQueue) => {\r\n return queue.filter((details) => {\r\n // message can be deleted during rendering\r\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\r\n });\r\n };\r\n\r\n loadQueue = filterQueue(loadQueue);\r\n\r\n log('messages rendered');\r\n\r\n const reverse = loadQueue[0]?.reverse;\r\n\r\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\r\n\r\n // if(groups.length > 2 && loadQueue.length === 1) {\r\n // debugger;\r\n // }\r\n \r\n const promises = loadQueue.reduce((acc, details) => {\r\n const perf = performance.now();\r\n\r\n const promises = details.promises.slice();\r\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\r\n Promise.all(timePromises).then((times) => {\r\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\r\n times.forEach((time, idx) => {\r\n log('media message time', time, idx, promises[idx]);\r\n });\r\n log.groupEnd();\r\n });\r\n\r\n // if(details.updatePosition) {\r\n // if(res) {\r\n // groups.add(res.group);\r\n // if(details.needAvatar) {\r\n // details.promises.push(res.group.createAvatar(details.message));\r\n // }\r\n // }\r\n // }\r\n\r\n acc.push(...details.promises);\r\n return acc;\r\n }, [] as Promise[]);\r\n\r\n promises.push(...avatarPromises);\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\r\n await m(Promise.all([...promises, this.setUnreadDelimiter()])); // не нашёл места лучше\r\n await m(fastRafPromise()); // have to be the last\r\n log('media promises end');\r\n\r\n loadQueue = filterQueue(loadQueue);\r\n\r\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\r\n // if(this.messagesQueueOnRender) {\r\n // this.messagesQueueOnRender();\r\n // }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n this.ejectBubbles();\r\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\r\n if(scrollSaver) {\r\n scrollSaver.replaceSaved(oldBubble, bubble);\r\n }\r\n \r\n if(!loadQueue.find((details) => details.bubble === bubble)) {\r\n continue;\r\n }\r\n\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n item.mounted = false;\r\n if(!groups.includes(item.group)) {\r\n groups.push(item.group);\r\n }\r\n\r\n this.bubblesToReplace.delete(bubble);\r\n }\r\n \r\n if(this.chat.selection.isSelecting) {\r\n loadQueue.forEach(({bubble}) => {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n });\r\n }\r\n\r\n loadQueue.forEach(({message, bubble, updatePosition}) => {\r\n if(message.pFlags.local && updatePosition) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n });\r\n\r\n this.bubbleGroups.mountUnmountGroups(groups);\r\n // this.bubbleGroups.findIncorrentPositions();\r\n\r\n if(this.updatePlaceholderPosition) {\r\n this.updatePlaceholderPosition();\r\n }\r\n\r\n if(restoreScroll) {\r\n restoreScroll();\r\n }\r\n\r\n // this.setStickyDateManually();\r\n \r\n if(this.messagesQueue.length) {\r\n log('have new messages to render');\r\n return processQueue();\r\n } else {\r\n log('end');\r\n }\r\n };\r\n\r\n log('setting pause');\r\n const promise = this.messagesQueuePromise = m(pause(0)).then(processQueue).finally(() => {\r\n if(this.messagesQueuePromise === promise) {\r\n this.messagesQueuePromise = null;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n private ejectBubbles() {\r\n for(const bubble of this.bubblesToEject) {\r\n bubble.remove();\r\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n }\r\n\r\n this.bubblesToEject.clear();\r\n }\r\n\r\n public groupBubbles(items: Array<{\r\n // Awaited> & \r\n bubble: HTMLElement, \r\n message: Message.message | Message.messageService\r\n }/* & {\r\n unmountIfFound?: boolean\r\n } */>) {\r\n let modifiedGroups: typeof groups;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n modifiedGroups = new Set();\r\n items.forEach(({bubble, message}) => {\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n const group = item?.group;\r\n if(group && item.message.date !== message.date) {\r\n this.bubbleGroups.removeItem(item);\r\n modifiedGroups.add(group);\r\n }\r\n });\r\n }\r\n \r\n items.forEach(({bubble, message}) => {\r\n this.bubbleGroups.prepareForGrouping(bubble, message);\r\n });\r\n\r\n const groups = this.bubbleGroups.groupUngrouped();\r\n\r\n const avatarPromises = Array.from(groups).map((group) => {\r\n if(group.avatar) return;\r\n const firstItem = group.firstItem;\r\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\r\n return group.createAvatar(firstItem.message);\r\n }\r\n }).filter(Boolean);\r\n\r\n if(modifiedGroups) {\r\n for(const group of modifiedGroups) {\r\n groups.add(group);\r\n }\r\n }\r\n\r\n return {\r\n groups: [...groups], \r\n avatarPromises\r\n };\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middleware.get(additionalCallback);\r\n }\r\n\r\n private async safeRenderMessage(\r\n message: Message.message | Message.messageService, \r\n reverse?: boolean, \r\n bubble?: HTMLElement, \r\n updatePosition = true,\r\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\r\n ) {\r\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\r\n return;\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n\r\n let result: Awaited> & {updatePosition: typeof updatePosition};\r\n try {\r\n this.renderingMessages.add(message.mid);\r\n\r\n // const groupedId = (message as Message.message).grouped_id;\r\n const newBubble = document.createElement('div');\r\n newBubble.dataset.mid = '' + message.mid;\r\n newBubble.dataset.peerId = '' + message.peerId;\r\n newBubble.dataset.timestamp = '' + message.date;\r\n\r\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\r\n // bubble: newBubble, \r\n // mids: new Set(), \r\n // groupedId\r\n // };\r\n\r\n // bubbleNew.mids.add(message.mid);\r\n\r\n if(bubble) {\r\n this.skippedMids.delete(message.mid);\r\n\r\n this.bubblesToEject.add(bubble);\r\n this.bubblesToReplace.delete(bubble);\r\n this.bubblesToReplace.set(newBubble, bubble);\r\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\r\n }\r\n\r\n bubble = this.bubbles[message.mid] = newBubble;\r\n let originalPromise = this.renderMessage(message, reverse, bubble);\r\n if(processResult) {\r\n originalPromise = processResult(originalPromise, bubble);\r\n }\r\n \r\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\r\n\r\n this.renderMessagesQueue(promise.catch(() => undefined));\r\n\r\n result = await promise;\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!result) {\r\n this.skippedMids.add(+message.mid);\r\n }\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.renderingMessages.delete(message.mid);\r\n return result;\r\n }\r\n \r\n // reverse means top\r\n private async renderMessage(\r\n message: Message.message | Message.messageService, \r\n reverse = false, \r\n bubble: HTMLElement\r\n ) {\r\n // if(DEBUG) {\r\n // this.log('message to render:', message);\r\n // }\r\n\r\n // if(!bubble && this.bubbles[message.mid]) {\r\n // return;\r\n // }\r\n\r\n // await pause(1000);\r\n\r\n const isMessage = message._ === 'message';\r\n const groupedId = isMessage && message.grouped_id;\r\n let albumMids: number[], reactionsMessage: Message.message;\r\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\r\n\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n\r\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\r\n albumMids = albumMessages.map((message) => message.mid);\r\n const mainMid = getMainMidForGrouped(albumMids);\r\n if(message.mid !== mainMid) {\r\n return;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n reactionsMessage = groupedId ? albumMessages[0] : message;\r\n }\r\n \r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = this.chat.isOurMessage(message);\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble.classList.add('bubble');\r\n contentWrapper.append(bubbleContainer);\r\n bubble.append(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.observer) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n isMentionUnread(message)/* || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid) */;\r\n if(isUnread) {\r\n this.observer.observe(bubble, this.unreadedObserverCallback);\r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n\r\n const loadPromises: Promise[] = [];\r\n const ret = {\r\n bubble,\r\n promises: loadPromises,\r\n message,\r\n reverse\r\n };\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n return;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n let promise: Promise;\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n const peerTitle = new PeerTitle();\r\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true)});\r\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n const peerTitle = new PeerTitle();\r\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true)});\r\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\r\n } else {\r\n s.append(await wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if((messageMedia as MessageMedia.messageMediaDocument)?.document && \r\n !['video', 'gif'].includes(((messageMedia as MessageMedia.messageMediaDocument).document as MyDocument).type)) {\r\n // * just filter these cases for documents caption\r\n } else if(groupedId && albumMustBeRenderedFull) {\r\n const t = getAlbumText(albumMessages);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(((messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument)?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n } else {\r\n if(message.action._ === 'messageActionPhoneCall') {\r\n messageMedia = {\r\n _: 'messageMediaCall',\r\n action: message.action\r\n };\r\n }\r\n }\r\n \r\n /* let richText = wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3 && totalEntities.length === emojiEntities.length) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n setInnerHTML(attachmentDiv, richText);\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n\r\n const timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type, \r\n message,\r\n reactionsMessage\r\n });\r\n messageDiv.append(timeSpan);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(isMessage && message.views) {\r\n bubble.classList.add('channel-post');\r\n\r\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\r\n const forward = document.createElement('div');\r\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\r\n bubbleContainer.prepend(forward);\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n if(!message.pFlags.is_outgoing && this.observer) {\r\n this.observer.observe(bubble, this.viewsObserverCallback);\r\n }\r\n }\r\n\r\n const replyMarkup = isMessage && message.reply_markup;\r\n if(replyMarkup && replyMarkup._ === 'replyInlineMarkup' && replyMarkup.rows && replyMarkup.rows.length) {\r\n const rows = replyMarkup.rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then((peerId) => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n case 'keyboardButtonBuy': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-buy');\r\n\r\n if(messageMedia?._ === 'messageMediaInvoice') {\r\n if(messageMedia.receipt_msg_id) {\r\n text = i18n('Message.ReplyActionButtonShowReceipt');\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\r\n if(typeof(text) === 'string') {\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n } else {\r\n buttonEl.append(text);\r\n }\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(\r\n !target \r\n || target.classList.contains('is-link') \r\n || target.classList.contains('is-switch-inline')\r\n || target.classList.contains('is-buy')\r\n ) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n if(isOutgoing) {\r\n bubble.classList.add('is-outgoing');\r\n }\r\n\r\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = this.chat.isOutMessage(message);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n \r\n let processingWebPage = false;\r\n \r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n ////////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n \r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n messages: albumMessages,\r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n\r\n break;\r\n }\r\n \r\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapPhoto({\r\n photo: photo as Photo.photo, \r\n message,\r\n container: attachmentDiv,\r\n withTail, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webPage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webPage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webPage.photo as any;\r\n if(photo || webPage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n\r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n \r\n const doc = webPage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message: message as Message.message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n //}\r\n } else {\r\n const docDiv = await wrapDocument({\r\n message: message as Message.message,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises,\r\n sizeType: 'documentName',\r\n searchContext: {\r\n useSearch: false,\r\n peerId: this.peerId,\r\n inputFilter: {\r\n _: 'inputMessagesFilterEmpty'\r\n }\r\n }\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n quoteTextDiv.classList.add('has-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webPage.site_name) {\r\n const html = wrapRichText(webPage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n const title = wrapWebPageTitle(webPage);\r\n if(title.textContent) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, title);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n const description = wrapWebPageDescription(webPage);\r\n if(description.textContent) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, description);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n autoDownloadSize: this.chat.autoDownload.photo,\r\n });\r\n }\r\n \r\n box.append(quote);\r\n \r\n //bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n \r\n //this.log('night running', bubble.scrollHeight);\r\n \r\n break;\r\n }\r\n \r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\r\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n wrapAlbum({\r\n messages: albumMessages,\r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n });\r\n } else {\r\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapVideo({\r\n doc, \r\n container: attachmentDiv, \r\n message: message as Message.message, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n const newNameContainer = await wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n sizeType: 'documentName'\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n lastContainer && lastContainer.append(timeSpan);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ? \r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') : \r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const contactDetails = document.createElement('div');\r\n contactDetails.className = 'contact-details';\r\n const contactNameDiv = document.createElement('div');\r\n contactNameDiv.className = 'contact-name';\r\n contactNameDiv.append(\r\n wrapEmojiText([\r\n contact.first_name,\r\n contact.last_name\r\n ].filter(Boolean).join(' '))\r\n );\r\n\r\n const contactNumberDiv = document.createElement('div');\r\n contactNumberDiv.className = 'contact-number';\r\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\r\n\r\n contactDiv.append(contactDetails);\r\n contactDetails.append(contactNameDiv, contactNumberDiv);\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.updateWithOptions({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n peerId: contact.user_id.toPeerId()\r\n });\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaInvoice': {\r\n const isTest = messageMedia.pFlags.test;\r\n const photo = messageMedia.photo;\r\n\r\n const priceEl = document.createElement(photo ? 'span' : 'div');\r\n const f = document.createDocumentFragment();\r\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\r\n l.classList.add('text-uppercase');\r\n const joiner = ' ‎';\r\n const p = document.createElement('span');\r\n p.classList.add('text-bold');\r\n p.textContent = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency) + joiner;\r\n f.append(p, l);\r\n if(isTest && messageMedia.receipt_msg_id) {\r\n const a = document.createElement('span');\r\n a.classList.add('text-uppercase', 'pre-wrap');\r\n a.append(joiner + '(Test)');\r\n f.append(a);\r\n }\r\n setInnerHTML(priceEl, f);\r\n\r\n if(photo) {\r\n const mediaSize = mediaSizes.active.invoice;\r\n wrapPhoto({\r\n photo, \r\n container: attachmentDiv,\r\n withTail: false, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height\r\n });\r\n\r\n bubble.classList.add('photo');\r\n\r\n priceEl.classList.add('video-time');\r\n attachmentDiv.append(priceEl);\r\n } else {\r\n attachmentDiv = undefined;\r\n }\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('bubble-primary-color');\r\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\r\n \r\n const richText = wrapEmojiText(messageMedia.description);\r\n messageDiv.prepend(...[titleDiv, !photo && priceEl, richText].filter(Boolean));\r\n\r\n bubble.classList.remove('is-message-empty');\r\n bubble.classList.add('is-invoice');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n attachmentDiv = undefined;\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\r\n this.log.warn('unrecognized media type:', messageMedia._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage && attachmentDiv) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n \r\n let isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + (await this.managers.appUsersManager.getUser(message.viaBotId)).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\r\n title.classList.add('peer-title');\r\n //title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n await MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((fwdFromId || fwdFrom)) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n \r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n \r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\r\n const pFlags = (peer as User.user)?.pFlags;\r\n if(pFlags && (pFlags.scam || pFlags.fake)) {\r\n nameDiv.append(generateFakeIcon(pFlags.scam));\r\n }\r\n\r\n if(!our) {\r\n nameDiv.style.color = getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = '' + message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\r\n }\r\n\r\n /* if(isMessage) {\r\n const reactionHover = document.createElement('div');\r\n reactionHover.classList.add('bubble-reaction-hover');\r\n contentWrapper.append(reactionHover);\r\n } */\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n private appendReactionsElementToBubble(bubble: HTMLElement, message: Message.message, reactionsMessage: Message.message, changedResults?: ReactionCount[]) {\r\n if(this.peerId.isUser()/* || true */) {\r\n return;\r\n }\r\n\r\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\r\n return;\r\n }\r\n\r\n // message = this.appMessagesManager.getMessageWithReactions(message);\r\n\r\n const reactionsElement = new ReactionsElement();\r\n reactionsElement.init(reactionsMessage, 'block');\r\n reactionsElement.render(changedResults);\r\n\r\n if(bubble.classList.contains('is-message-empty')) {\r\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\r\n } else {\r\n const messageDiv = bubble.querySelector('.message');\r\n if(bubble.classList.contains('is-multiple-documents')) {\r\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\r\n let documentMessageDiv = documentContainer.querySelector('.document-message');\r\n\r\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\r\n if(!timeSpan) {\r\n timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message,\r\n reactionsMessage\r\n });\r\n }\r\n \r\n reactionsElement.append(timeSpan);\r\n\r\n if(!documentMessageDiv) {\r\n documentMessageDiv = document.createElement('div');\r\n documentMessageDiv.classList.add('document-message');\r\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\r\n }\r\n\r\n documentMessageDiv.append(reactionsElement);\r\n } else {\r\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\r\n reactionsElement.append(timeSpan);\r\n \r\n messageDiv.append(reactionsElement);\r\n }\r\n }\r\n }\r\n\r\n private prepareToSaveScroll(reverse?: boolean) {\r\n const isMounted = !!this.chatInner.parentElement;\r\n if(!isMounted) {\r\n return {};\r\n }\r\n\r\n const log = this.log.bindPrefix('prepareToSaveScroll');\r\n log('save');\r\n const scrollSaver = this.createScrollSaver(reverse);\r\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\r\n \r\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\r\n const viewportSlice = this.getViewportSlice();\r\n this.deleteViewportSlice(viewportSlice, true);\r\n }\r\n \r\n // scrollSaver.save(); // ! slicing will corrupt scroll position\r\n // const saved = scrollSaver.getSaved();\r\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\r\n\r\n return {\r\n restoreScroll: () => {\r\n log('restore');\r\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\r\n scrollSaver.restore(reverse);\r\n this.onRenderScrollSet(scrollSaver.getSaved());\r\n },\r\n scrollSaver\r\n };\r\n }\r\n\r\n public async performHistoryResult(historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]}, reverse: boolean) {\r\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\r\n log && log('start', this.chatInner.parentElement);\r\n\r\n let history = historyResult.history;\r\n history = history.slice(); // need\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (message: Message.message | Message.messageService) => {\r\n if(!message) {\r\n return;\r\n } else if(message.pFlags.local) {\r\n return this.processLocalMessageRender(message);\r\n } else {\r\n return this.safeRenderMessage(message, reverse);\r\n }\r\n };\r\n\r\n const messages = await Promise.all(history.map((mid) => {\r\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n }));\r\n\r\n const setLoadedPromises: Promise[] = [];\r\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\r\n let isEnd = (historyResult as HistoryResult).isEnd;\r\n if(!isEnd) {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n isEnd = {top: false, bottom: false, both: false};\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n isEnd.bottom = true;\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n isEnd.top = true;\r\n }\r\n }\r\n\r\n if(!isEnd.bottom && this.setPeerOptions) {\r\n const {lastMsgId, topMessage} = this.setPeerOptions;\r\n this.setPeerOptions = undefined;\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n isEnd.bottom = true;\r\n }\r\n }\r\n\r\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\r\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\r\n }\r\n\r\n await Promise.all(setLoadedPromises);\r\n\r\n // ! it is important to insert bubbles to group reversed way\r\n // const length = history.length, promises: Promise[] = [];\r\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\r\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\r\n const promises = messages.map(cb);\r\n\r\n // cannot combine them into one promise\r\n await Promise.all(promises);\r\n await this.messagesQueuePromise;\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n log && log('performHistoryResult end');\r\n }\r\n\r\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\r\n const className = 'has-sticky-dates';\r\n if(!this.container.classList.contains(className)) {\r\n const isLoading = !this.preloader.detached;\r\n\r\n if(isLoading || \r\n (\r\n state ??= {\r\n scrollHeight: this.scrollable.scrollHeight,\r\n clientHeight: this.scrollable.container.clientHeight\r\n }, \r\n state.scrollHeight !== state.clientHeight\r\n )\r\n ) {\r\n /* for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n dateMessage.div.classList.add('is-sticky');\r\n } */\r\n \r\n const middleware = this.getMiddleware();\r\n const callback = () => {\r\n if(!middleware()) return;\r\n this.container.classList.add(className);\r\n };\r\n\r\n if(this.willScrollOnLoad) {\r\n callback();\r\n } else {\r\n setTimeout(callback, 600);\r\n }\r\n\r\n return;\r\n }\r\n }\r\n \r\n this.willScrollOnLoad = undefined;\r\n }\r\n\r\n public onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n return this.managers.acknowledged.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n }).then((ackedResult) => {\r\n return {\r\n cached: ackedResult.cached,\r\n result: Promise.resolve(ackedResult.result).then((value) => {\r\n return {history: value.history.map((m) => m.mid)};\r\n })\r\n };\r\n });\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {\r\n cached: ackedResult.cached,\r\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\r\n };\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n const log = this.log.bindPrefix('ladder');\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n log.warn('will be delayed');\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n log.warn('no bubbles');\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n log('targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map((m) => getServerMessageId(m)), \r\n bottomIds.map((m) => getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble || this.skippedMids.has(mid)) {\r\n log.warn('no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n\r\n const contentWrapper = bubble.lastElementChild as HTMLElement;\r\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(item && item.group.avatar && item.group.lastItem === item) {\r\n elementsToAnimate.push(item.group.avatar);\r\n }\r\n\r\n elementsToAnimate.forEach((element) => {\r\n element.classList.add('zoom-fade', 'can-zoom-fade');\r\n element.style.transitionDelay = lastMsDelay + 'ms';\r\n });\r\n \r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n\r\n setBubbles.push(...elementsToAnimate);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach((element) => {\r\n element.classList.remove('zoom-fade');\r\n });\r\n });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach((element) => {\r\n element.style.transitionDelay = '';\r\n element.classList.remove('can-zoom-fade');\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n // if(!IS_SAFARI) {\r\n // this.needReflowScroll = true;\r\n // }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private async renderEmptyPlaceholder(\r\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted', \r\n bubble: HTMLElement, \r\n message: any, \r\n elements: (Node | string)[]\r\n ) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n else if(type === 'restricted') {\r\n title = document.createElement('span');\r\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\r\n }\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n await wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n // this.renderMessagesQueue({\r\n // message, \r\n // bubble, \r\n // reverse: false, \r\n // promises: [loadPromise]\r\n // });\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map((elem) => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach((elem) => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach((elem) => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private async processLocalMessageRender(message: Message.message | Message.messageService, animate?: boolean) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const middleware = this.getMiddleware();\r\n const m = middlewarePromise(middleware);\r\n return this.safeRenderMessage(message, isSponsored ? false : true, undefined, isSponsored, async(result) => {\r\n const {bubble} = await m(result);\r\n if(!bubble) {\r\n return result;\r\n }\r\n\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n const updatePosition = () => {\r\n if(this.updatePlaceholderPosition === updatePosition) {\r\n this.updatePlaceholderPosition = undefined;\r\n }\r\n\r\n appendTo[method](bubble);\r\n };\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = await m(this.managers.appPeersManager.isBot(this.peerId));\r\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\r\n if(this.chat.isRestricted) {\r\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\r\n } else if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param || isBot) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n \r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId,\r\n lastMsgId: mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.observer.observe(button, this.viewsObserverCallback);\r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n return result;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n appendTo = this.chatInner;\r\n method = 'prepend';\r\n } else if(await m(this.managers.appPeersManager.isAnyGroup(this.peerId)) && (await m(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator) {\r\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\r\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n if(renderPromise) {\r\n await renderPromise;\r\n }\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\r\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\r\n if(noTransition) {\r\n const setOn = bubble.firstElementChild;\r\n setOn.classList.add('no-transition');\r\n \r\n if(this.chat.setPeerPromise) {\r\n this.chat.setPeerPromise.catch(noop).finally(() => {\r\n setOn.classList.remove('no-transition');\r\n });\r\n }\r\n }\r\n\r\n if(animate === undefined && !noTransition) {\r\n animate = true;\r\n }\r\n\r\n if(isWaitingForAnimation || animate) {\r\n this.updatePlaceholderPosition = updatePosition;\r\n\r\n this.onAnimateLadder = () => {\r\n // appendTo[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else if(this.chat.setPeerPromise) {\r\n this.attachPlaceholderOnRender = () => {\r\n this.attachPlaceholderOnRender = undefined;\r\n updatePosition();\r\n // appendTo[method](bubble);\r\n };\r\n } else {\r\n this.updatePlaceholderPosition = updatePosition;\r\n // appendTo[method](bubble);\r\n }\r\n\r\n if(!isWaitingForAnimation && animate) {\r\n await m(getHeavyAnimationPromise());\r\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\r\n indexOfAndSplice(additionMsgIds, message.mid);\r\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\r\n }\r\n\r\n // if(!isSponsored) {\r\n this.emptyPlaceholderBubble = bubble;\r\n // }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n let offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n let message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\r\n message = savedMessages[0];\r\n message.mid = mid;\r\n return message as any;\r\n }\r\n\r\n public getViewportSlice() {\r\n // this.log.trace('viewport slice');\r\n return getViewportSlice({\r\n overflowElement: this.scrollable.container, \r\n selector: '.bubbles-date-group .bubble:not(.is-date)',\r\n extraSize: Math.max(700, windowSize.height) * 2\r\n });\r\n }\r\n\r\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\r\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\r\n return;\r\n }\r\n\r\n const {invisibleTop, invisibleBottom} = slice;\r\n const invisible = invisibleTop.concat(invisibleBottom);\r\n if(!invisible.length) {\r\n return;\r\n }\r\n\r\n if(invisibleTop.length) {\r\n this.setLoaded('top', false);\r\n this.getHistoryTopPromise = undefined;\r\n }\r\n\r\n if(invisibleBottom.length) {\r\n this.setLoaded('bottom', false);\r\n this.getHistoryBottomPromise = undefined;\r\n }\r\n\r\n const mids = invisible.map(({element}) => +element.dataset.mid);\r\n\r\n let scrollSaver: ScrollSaver;\r\n if(!!invisibleTop.length !== !!invisibleBottom.length && !ignoreScrollSaving) {\r\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\r\n scrollSaver.save();\r\n }\r\n \r\n this.deleteMessagesByIds(mids, false, true);\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n } else if(invisibleTop.length) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n }\r\n\r\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\r\n // Safari cannot reset the scroll.\r\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\r\n return;\r\n }\r\n\r\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\r\n // scrollSaver.save();\r\n const slice = this.getViewportSlice();\r\n // if(IS_SAFARI) slice.invisibleTop = [];\r\n this.deleteViewportSlice(slice);\r\n // scrollSaver.restore();\r\n }\r\n\r\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n const log = this.log.bindPrefix('setLoaded');\r\n log('change', side, value);\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n // return;\r\n\r\n if(!checkPlaceholders) {\r\n return;\r\n }\r\n\r\n if(!this.chat.isRestricted) {\r\n if(side === 'bottom' && await this.managers.appPeersManager.isBroadcast(this.peerId)/* && false */) {\r\n this.toggleSponsoredMessage(value);\r\n }\r\n \r\n if(side === 'top' && value && await this.managers.appPeersManager.isBot(this.peerId)) {\r\n return this.renderBotPlaceholder();\r\n }\r\n }\r\n\r\n return this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n private async toggleSponsoredMessage(value: boolean) {\r\n const _log = this.log.bindPrefix('sponsored');\r\n _log('checking');\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && !this.bubbles[mid] && this.getSponsoredMessagePromise === promise;\r\n });\r\n\r\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\r\n .then(async(sponsoredMessages) => {\r\n const sponsoredMessage = sponsoredMessages.messages[0];\r\n if(!sponsoredMessage) {\r\n _log('no message');\r\n return;\r\n }\r\n\r\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n \r\n return Promise.all([\r\n messagePromise,\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(([message]) => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n _log('rendering', message);\r\n const promise = this.performHistoryResult({history: [message]}, false);\r\n });\r\n }).finally(() => {\r\n this.getSponsoredMessagePromise = undefined;\r\n });\r\n } else {\r\n _log('clearing rendered', mid);\r\n this.deleteMessagesByIds([mid]);\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n }\r\n\r\n private async renderBotPlaceholder() {\r\n const _log = this.log.bindPrefix('bot placeholder');\r\n \r\n const middleware = this.getMiddleware();\r\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\r\n _log('getting profile, cached:', result.cached);\r\n const processPromise = result.result.then(async(userFull) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n _log.warn('no description');\r\n return this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n const message = await this.generateLocalFirstMessage(false, (message) => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n _log('rendering');\r\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\r\n _log('done');\r\n });\r\n\r\n return {renderPromise};\r\n });\r\n\r\n if(!result.cached) {\r\n return;\r\n }\r\n\r\n return processPromise;\r\n }\r\n\r\n public async checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderBubble === undefined && \r\n (\r\n this.chat.isRestricted || \r\n !(await this.chat.getHistoryStorage()).count || \r\n (\r\n !Object.keys(this.bubbles).length || \r\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = await this.generateLocalFirstMessage(true);\r\n return {renderPromise: this.processLocalMessageRender(message)};\r\n }\r\n }\r\n\r\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\r\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\r\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\r\n });\r\n\r\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\r\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n\r\n if(!justLoad) {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public async getHistory(\r\n maxId = 0, \r\n reverse = false, \r\n isBackLimit = false, \r\n additionMsgId = 0, \r\n justLoad = false,\r\n middleware?: () => boolean\r\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\r\n const peerId = this.peerId;\r\n\r\n const isBroadcast = await this.managers.appPeersManager.isBroadcast(peerId);\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = await this.chat.getMessage(additionMsgIds[i]);\r\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: typeof result['result'];\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && !result.cached;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result.result;\r\n\r\n result = {\r\n cached: true,\r\n result: Promise.resolve({history: additionMsgIds})\r\n };\r\n\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: Awaited) => {\r\n if((historyResult as HistoryResult).isEnd?.top) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\r\n historyResult.history.push(...mids.reverse());\r\n }\r\n\r\n // synchronize bot placeholder appearance\r\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\r\n\r\n // await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (historyResult: Awaited) => {\r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(historyResult);\r\n }).then(() => {\r\n if(!isAdditionRender && additionMsgId) {\r\n historyResult.history.unshift(additionMsgId);\r\n }\r\n\r\n return this.performHistoryResult(historyResult, reverse);\r\n });\r\n };\r\n\r\n const processPromise = (_promise: typeof result['result']) => {\r\n const promise = Promise.resolve(_promise).then((result) => {\r\n if(middleware && !middleware()) {\r\n throw PEER_CHANGED_ERROR;\r\n }\r\n\r\n if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n // fastRaf(() => {\r\n // this.scrollable.checkForTriggers();\r\n // });\r\n return;\r\n }\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(!result.cached) {\r\n cached = false;\r\n promise = processPromise(result.result);\r\n } else if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n return null;\r\n } else {\r\n cached = true;\r\n promise = sup(await result.result);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('messagesQueueOnRenderAdditional');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n return {cached, promise, waitPromise};\r\n }\r\n\r\n public async setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyMaxId = await this.chat.getHistoryMaxId();\r\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\r\n .map((i) => +i)\r\n .sort((a, b) => a - b)\r\n .find((i) => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyMaxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n if(!Object.keys(this.dateMessages).length) {\r\n this.container.classList.remove('has-groups');\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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 wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\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}: {\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}) {\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 });\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 const richText = wrapRichText(message.message, {\n entities: message.totalEntities\n });\n\n setInnerHTML(messageDiv, richText);\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 getVisibleRect from \"./getVisibleRect\";\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, selector, extraSize}: {\n overflowElement: HTMLElement,\n selector: string,\n extraSize?: number\n}) {\n // const perf = performance.now();\n const overflowRect = overflowElement.getBoundingClientRect();\n const elements = Array.from(overflowElement.querySelectorAll(selector));\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 PopupElement, { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../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 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: [new PeerTitle({peerId}).element],\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas, 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.append(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 } from \"../../layer\";\nimport { SettingSection } from \"../sidebarLeft\";\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\";\nimport ReactionElement from \"../chat/reaction\";\nimport getUserStatusString from \"../wrappers/getUserStatusString\";\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 message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n\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 pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block');\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(!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 !== 'checks';\n const skipReactionsList = reactionCount.reaction === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction)) {\n reactionCount.reaction = undefined;\n }\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: 54,\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 const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24\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');\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon\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 } 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 from \"../animationIntersector\";\nimport Scrollable, { ScrollableBase, ScrollableX } from \"../scrollable\";\nimport { wrapSticker } from \"../wrappers\";\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: string\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: string;\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 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: 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type Chat from \"./chat\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport PopupSponsored from \"../popups/sponsored\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport StackedAvatars from \"../stackedAvatars\";\r\nimport { IS_APPLE } from \"../../environment/userAgent\";\r\nimport PopupReactedList from \"../popups/reactedList\";\r\nimport { ChatReactionsMenu, REACTION_CONTAINER_SIZE } from \"./reactionsMenu\";\r\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\r\nimport getServerMessageId from \"../../lib/appManagers/utils/messageId/getServerMessageId\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport positionMenu, { MenuPositionPadding } from \"../../helpers/positionMenu\";\r\nimport contextMenuController from \"../../helpers/contextMenuController\";\r\nimport { attachContextMenuListener } from \"../../helpers/dom/attachContextMenuListener\";\r\nimport filterAsync from \"../../helpers/array/filterAsync\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport { SERVICE_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { MessagesStorageKey } from \"../../lib/appManagers/appMessagesManager\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private isSponsored: boolean;\r\n private isOverBubble: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n private reactionsMenu: ChatReactionsMenu;\r\n private listenerSetter: ListenerSetter;\r\n private attachListenerSetter: ListenerSetter;\r\n\r\n private viewerPeerId: PeerId;\r\n private middleware: ReturnType;\r\n private canOpenReactedList: boolean;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private managers: AppManagers\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.attachListenerSetter = new ListenerSetter();\r\n this.middleware = getMiddleware();\r\n }\r\n\r\n public attachTo(element: HTMLElement) {\r\n this.attachListenerSetter.removeAll();\r\n \r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(element, (e) => {\r\n if(this.chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n this.chat.log('touchend', e);\r\n\r\n const badSelectors = [\r\n '.name',\r\n '.peer-title',\r\n '.reply',\r\n '.document',\r\n 'audio-element',\r\n 'avatar-element',\r\n 'a',\r\n '.bubble-beside-button',\r\n 'replies-element',\r\n '[data-saved-from]:not(.bubble)',\r\n 'poll-element',\r\n '.attachment',\r\n '.reply-markup-button'\r\n ];\r\n let good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\r\n if(good) {\r\n cancelEvent(e);\r\n //onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n this.onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.attachListenerSetter});\r\n } else attachContextMenuListener(element, this.onContextMenu, this.attachListenerSetter);\r\n }\r\n\r\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n let element = this.element;\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(element && element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n \r\n const r = async() => {\r\n const isSponsored = this.isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n //this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' || \r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(this.chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = await this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n this.isOverBubble = !!contentWrapper;\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = await this.chat.getMessage(this.mid);\r\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n\r\n const initResult = await this.init();\r\n if(!initResult) {\r\n return;\r\n }\r\n \r\n element = initResult.element;\r\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\r\n let isReactionsMenuVisible = false;\r\n if(reactionsMenu) {\r\n const className = 'is-visible';\r\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\r\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\r\n\r\n if(reactionsMenuPosition === 'horizontal') {\r\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\r\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\r\n const INNER_CONTAINER_PADDING = 8;\r\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\r\n const nextVisiblePart = visibleLength % 1;\r\n const MIN_NEXT_VISIBLE_PART = 0.65;\r\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\r\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\r\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\r\n }\r\n // }\r\n }\r\n }\r\n \r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\r\n\r\n if(reactionsMenu) {\r\n reactionsMenu.widthContainer.style.top = element.style.top;\r\n reactionsMenu.widthContainer.style.left = element.style.left;\r\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\r\n element.parentElement.append(reactionsMenu.widthContainer);\r\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\r\n }\r\n\r\n contextMenuController.openBtnMenu(element, () => {\r\n if(reactionsMenu) {\r\n reactionsMenu.container.classList.remove('is-visible');\r\n }\r\n\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n cleanup();\r\n\r\n setTimeout(() => {\r\n destroy();\r\n }, 300);\r\n });\r\n\r\n if(isReactionsMenuVisible) {\r\n reactionsMenu.container.classList.add('is-visible');\r\n }\r\n };\r\n \r\n r();\r\n };\r\n\r\n public cleanup() {\r\n this.listenerSetter.removeAll();\r\n this.reactionsMenu && this.reactionsMenu.cleanup();\r\n this.middleware.clean();\r\n }\r\n\r\n public destroy() {\r\n this.cleanup();\r\n this.attachListenerSetter.removeAll();\r\n }\r\n\r\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\r\n if(this.isSponsored) {\r\n return buttons.filter((button) => {\r\n return button.isSponsored;\r\n });\r\n } else {\r\n return filterAsync(buttons, async(button) => {\r\n let good: boolean;\r\n\r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(this.chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ? \r\n await button.verify() : \r\n button.notDirect && await button.verify() && button.notDirect();\r\n }\r\n\r\n return !!good;\r\n });\r\n }\r\n }\r\n\r\n private setButtons() {\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: async() => await this.chat.canSend() && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: async() => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\r\n for(const mid of mids) {\r\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\r\n if(!!message.message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: async() => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n await this.managers.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n appDownloadManager.downloadToDisc({media: (this.message as any).media.document});\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: async() => {\r\n const poll = (this.message as any).media?.poll;\r\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n onClick: () => {\r\n if(this.viewerPeerId) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: this.viewerPeerId\r\n });\r\n } else if(this.canOpenReactedList) {\r\n new PopupReactedList(this.message as Message.message);\r\n } else {\r\n return false;\r\n }\r\n },\r\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\r\n notDirect: () => true\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }];\r\n }\r\n\r\n private async init() {\r\n this.cleanup();\r\n this.setButtons();\r\n \r\n const filteredButtons = await this.filterButtons(this.buttons);\r\n if(!filteredButtons.length) {\r\n return;\r\n }\r\n\r\n const element = this.element = ButtonMenu(filteredButtons, this.listenerSetter);\r\n element.id = 'bubble-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n const viewsButton = filteredButtons.find((button) => !button.icon);\r\n if(viewsButton) {\r\n const reactions = (this.message as Message.message).reactions;\r\n const recentReactions = reactions?.recent_reactions;\r\n const isViewingReactions = !!recentReactions?.length;\r\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ? ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count : undefined;\r\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\r\n\r\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\r\n const i18nElem = new I18n.IntlElement({\r\n key: isViewingReactions ? (\r\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\r\n ) : 'NobodyViewed',\r\n args: isViewingReactions ? (\r\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\r\n ) : undefined,\r\n element: viewsButton.textElement\r\n });\r\n\r\n let fakeText: HTMLElement;\r\n if(isViewingReactions) {\r\n if(participantsCount === undefined) {\r\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\r\n } else {\r\n fakeText = i18n(\r\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n [recentReactions.length, participantsCount]\r\n );\r\n }\r\n } else {\r\n fakeText = i18n('Loading');\r\n }\r\n\r\n fakeText.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeText);\r\n\r\n const AVATAR_SIZE = 22;\r\n const MAX_AVATARS = 3;\r\n const PADDING_PER_AVATAR = 1.125;\r\n i18nElem.element.style.visibility = 'hidden';\r\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\r\n const middleware = this.middleware.get();\r\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(fakeText) {\r\n fakeText.remove();\r\n }\r\n\r\n const reactions = result.combined;\r\n const reactedLength = participantsCount === undefined ? \r\n result.reactionsCount : \r\n (\r\n isViewingReactions ? \r\n reactions.filter((reaction) => reaction.reaction).length : \r\n reactions.length\r\n );\r\n\r\n let fakeElem: HTMLElement;\r\n if(reactions.length === 1) {\r\n fakeElem = new PeerTitle({\r\n peerId: reactions[0].peerId,\r\n onlyFirstName: true,\r\n dialog: false,\r\n }).element;\r\n\r\n if(!isViewingReactions || result.readParticipants.length <= 1) {\r\n this.viewerPeerId = reactions[0].peerId;\r\n }\r\n } else if(isViewingReactions) {\r\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\r\n fakeElem = i18n(\r\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted', \r\n isFull ? [reactedLength] : [reactedLength, reactions.length]\r\n );\r\n } else {\r\n if(!reactions.length) {\r\n i18nElem.element.style.visibility = '';\r\n } else {\r\n fakeElem = i18n('MessageSeen', [reactions.length]);\r\n }\r\n }\r\n\r\n if(fakeElem) {\r\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\r\n fakeElem.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeElem);\r\n }\r\n\r\n if(reactions.length) {\r\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\r\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\r\n viewsButton.element.append(avatars.container);\r\n\r\n // if(reactions.length > 1) {\r\n // if(isViewingReactions) {\r\n this.canOpenReactedList = true;\r\n // }\r\n }\r\n });\r\n }\r\n\r\n let menuPadding: MenuPositionPadding;\r\n let reactionsMenu: ChatReactionsMenu;\r\n let reactionsMenuPosition: 'horizontal' | 'vertical';\r\n if(this.message._ === 'message' && !this.chat.selection.isSelecting && !this.message.pFlags.is_outgoing && !this.message.pFlags.is_scheduled) {\r\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\r\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\r\n // element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 36;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n const paddingLeft = 0, paddingRight = 0;\r\n if(reactionsMenuPosition === 'vertical') {\r\n menuPadding = {\r\n top: paddingLeft,\r\n // bottom: 36, // positionMenu will detect it itself somehow\r\n left: totalSize\r\n };\r\n } else {\r\n menuPadding = {\r\n top: totalSize,\r\n right: paddingRight,\r\n left: paddingLeft\r\n };\r\n }\r\n }\r\n\r\n this.chat.container.append(element);\r\n\r\n return {\r\n element, \r\n cleanup: () => {\r\n this.cleanup();\r\n reactionsMenu && reactionsMenu.cleanup();\r\n },\r\n destroy: () => {\r\n element.remove();\r\n reactionsMenu && reactionsMenu.widthContainer.remove();\r\n },\r\n menuPadding,\r\n reactionsMenu,\r\n reactionsMenuPosition\r\n };\r\n }\r\n\r\n private onSendScheduledClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = async() => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n return message?.message ? message.message + '\\n' : '';\r\n }));\r\n\r\n const str = parts.join('');\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = async() => {\r\n let threadMessage: Message.message;\r\n const {peerId, mid} = this;\r\n const threadId = this.chat.threadId;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\r\n }\r\n\r\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\r\n const msgId = getServerMessageId(mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.managers.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.managers.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const peerId = this.peerId;\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport contextMenuController from \"../../helpers/contextMenuController\";\r\nimport { attachContextMenuListener } from \"../../helpers/dom/attachContextMenuListener\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach((button) => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n contextMenuController.openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n protected scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\r\n this.construct();\r\n }\r\n \r\n private async construct() {\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach((el) => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter((v) => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public async send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n ...this.chat.getMessageSendingParams()\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption', \r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId, \r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '', \r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n \r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement, \r\n position: 'center'\r\n });\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"./schedulers/pause\";\r\nimport { makeMediaSize } from \"./mediaSize\";\r\nimport scaleMediaElement from \"./canvas/scaleMediaElement\";\r\nimport preloadVideo from \"./preloadVideo\";\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\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 type Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { wrapDocument } from \"../wrappers\";\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 { MediaSize } from \"../../helpers/mediaSize\";\nimport { ThumbCache } from \"../../lib/storages/thumbs\";\nimport onMediaLoad from \"../../helpers/onMediaLoad\";\nimport apiManagerProxy from \"../../lib/mtproto/mtprotoworker\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\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 inputField: InputField;\n private captionLengthMax: number;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true, title: true});\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n const config = await this.managers.apiManager.getConfig();\n this.captionLengthMax = config.caption_length_max;\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 this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: this.captionLengthMax,\n withLinebreaks: true\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\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 appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\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 if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.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.inputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n\n sendFileDetails.forEach((d) => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map((d) => d.file), Object.assign({\n ...sendingParams,\n caption,\n isMedia: isMedia,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private async attachMedia(params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = createVideo();\n const source = document.createElement('source');\n source.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 promise = onMediaLoad(video).then(async() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n 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 resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n return promise;\n }\n\n private async attachDocument(params: SendFileParams, itemDiv: HTMLElement): ReturnType {\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 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: '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 const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params, itemDiv) : this.attachDocument(params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\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.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(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\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 willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && 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: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport cancelEvent from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string[]\r\n}) {\r\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\r\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS)); \r\n\r\n let target: Element;\r\n const getCurrentTarget = () => {\r\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\r\n };\r\n\r\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\r\n if(target === _target) {\r\n return;\r\n }\r\n\r\n let hadTarget = false;\r\n if(target) {\r\n hadTarget = true;\r\n target.classList.remove(ACTIVE_CLASS_NAME);\r\n }\r\n\r\n target = _target;\r\n if(!target) return;\r\n target.classList.add(ACTIVE_CLASS_NAME);\r\n\r\n if(hadTarget && scrollable && scrollTo) {\r\n fastSmoothScroll({\r\n container: scrollable, \r\n element: target as HTMLElement, \r\n position: 'center', \r\n forceDuration: 100, \r\n axis: type === 'x' ? 'x' : 'y'\r\n });\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n let attached = false;\r\n const attach = () => {\r\n if(attached) return;\r\n attached = true;\r\n // const input = document.activeElement as HTMLElement;\r\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n list.addEventListener('mousemove', onMouseMove, {passive: true});\r\n attachClickEvent(list, onClick);\r\n };\r\n\r\n const detach = () => {\r\n if(!attached) return;\r\n attached = false;\r\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n list.removeEventListener('mousemove', onMouseMove);\r\n detachClickEvent(list, onClick);\r\n };\r\n\r\n const resetTarget = () => {\r\n if(waitForKeySet) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKeySet) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(waitForKeySet.has(e.key)) {\r\n cancelEvent(e);\r\n\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n onKeyDown = _onKeyDown;\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n\r\n waitForKeySet = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\r\n attach();\r\n\r\n return {\r\n attach,\r\n detach,\r\n resetTarget\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => void,\r\n hiding: () => void\r\n}> {\r\n protected hidden = true;\r\n protected container: HTMLElement;\r\n protected list: HTMLElement;\r\n protected resetTarget: () => void;\r\n protected attach: () => void;\r\n protected detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string[];\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller?: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller && this.controller.addHelper(this);\r\n }\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n if(enabled) {\r\n this.attach && this.attach();\r\n } else {\r\n this.detach && this.detach();\r\n }\r\n }\r\n\r\n protected onVisible = () => {\r\n if(this.detach) { // it can be so because 'visible' calls before animation's end\r\n this.detach();\r\n }\r\n\r\n const list = this.list;\r\n const {attach, detach, resetTarget} = attachListNavigation({\r\n list, \r\n type: this.listType,\r\n onSelect: this.onSelect,\r\n once: true,\r\n waitForKey: this.waitForKey\r\n });\r\n\r\n this.attach = attach;\r\n this.detach = detach;\r\n this.resetTarget = resetTarget;\r\n if(!IS_MOBILE && !this.navigationItem) {\r\n this.navigationItem = {\r\n type: 'autocomplete-helper',\r\n onPop: () => {\r\n this.navigationItem = undefined;\r\n this.toggle(true);\r\n },\r\n noBlurOnPop: true\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n\r\n this.addEventListener('hidden', () => {\r\n this.resetTarget = undefined;\r\n this.attach = undefined;\r\n this.detach = undefined;\r\n\r\n list.innerHTML = '';\r\n detach();\r\n\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n }, {once: true});\r\n };\r\n\r\n protected attachNavigation() {\r\n this.addEventListener('visible', this.onVisible);\r\n }\r\n\r\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\r\n if(this.init) {\r\n return;\r\n }\r\n \r\n if(hide === undefined) {\r\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\r\n }\r\n\r\n if(this.hidden === hide) {\r\n if(!hide) {\r\n this.dispatchEvent('visible'); // reset target and listener\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.hidden = hide;\r\n\r\n if(!hide) {\r\n this.controller && this.controller.hideOtherHelpers(this);\r\n this.dispatchEvent('visible'); // fire it before so target will be set\r\n } else {\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n\r\n if(!fromController && this.controller) {\r\n this.controller.hideOtherHelpers();\r\n }\r\n\r\n if(this.detach) { // force detach here\r\n this.detach();\r\n }\r\n }\r\n\r\n const useRafs = this.controller || hide ? 0 : 2;\r\n\r\n if(hide) {\r\n this.dispatchEvent('hiding');\r\n }\r\n\r\n SetTransition(\r\n this.container, \r\n 'is-visible', \r\n !hide, \r\n rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0, \r\n () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n }, \r\n useRafs\r\n );\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport preloadAnimatedEmojiSticker from \"../../helpers/preloadAnimatedEmojiSticker\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: ['ArrowUp', 'ArrowDown']\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n preloadAnimatedEmojiSticker(emoticon);\r\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach((sticker) => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP, this.managers);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true,\r\n title: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\nimport combineSameEntities from \"../../lib/richTextProcessor/combineSameEntities\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach((emoji) => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\r\n if(!middleware()) {\r\n return;\r\n }\r\n \r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n protected className: string, \r\n onSelect: (target: Element) => boolean | void\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach((d) => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n if(!doNotShow) {\r\n this.toggle(!data.length);\r\n }\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n \r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: options.peerId\r\n });\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n setInnerHTML(name, wrapEmojiText(options.name));\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n setInnerHTML(description, wrapEmojiText(options.description));\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type 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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach((helper) => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\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 if(user.username) {\n str = '@' + user.username;\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 const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { KeyboardButton, ReplyMarkup } from \"../../layer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ListenerSetter, { Listener } from \"../../helpers/listenerSetter\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport confirmationPopup from \"../confirmationPopup\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private managers: AppManagers;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n managers: AppManagers,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n await this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', async() => {\r\n await this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n attachClickEvent(this.element, (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public async checkForceReply() {\r\n const replyMarkup = await this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private async getReplyMarkup() {\r\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\r\n if(replyMarkup === undefined) {\r\n replyMarkup = await this.getReplyMarkup() as any;\r\n }\r\n\r\n this.element.textContent = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n setInnerHTML(btn, wrapEmojiText(button.text));\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\r\n if(replyMarkup === undefined) {\r\n replyMarkup = await this.getReplyMarkup();\r\n }\r\n\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport GifsMasonry from \"../gifsMasonry\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport renderImageWithFadeIn from \"../../helpers/dom/renderImageWithFadeIn\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\r\nimport wrapRichText from \"../../lib/richTextProcessor/wrapRichText\";\r\nimport generateQId from \"../../lib/appManagers/utils/inlineBots/generateQId\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(\r\n appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n ...this.chat.getMessageSendingParams(),\r\n clearDraft: true,\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.managers.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n setInnerHTML(title, wrapEmojiText(item.title));\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n setInnerHTML(description, wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n }));\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then((blob) => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then((dataURL) => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.animated) {\r\n this.superStickerRenderer.observeAnimated(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { AckedResult } from \"../lib/mtproto/superMessagePort\";\r\nimport { Modify } from \"../types\";\r\n\r\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\r\n return {\r\n cached: acked.cached,\r\n result: acked.cached ? await acked.result : acked.result\r\n };\r\n}\r\n\r\nexport function modifyAckedPromise(promise: Promise>) {\r\n return promise.then(modifyAckedResult);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport callbackify from \"../../helpers/callbackify\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport { modifyAckedPromise } from \"../../helpers/modifyAckedResult\";\r\nimport { ChatFull } from \"../../layer\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport getPeerId from \"../../lib/appManagers/utils/peers/getPeerId\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport { AckedResult } from \"../../lib/mtproto/superMessagePort\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport getChatMembersString from \"../wrappers/getChatMembersString\";\r\n\r\nconst SEND_AS_ANIMATION_DURATION = 300;\r\n\r\nexport default class ChatSendAs {\r\n private avatar: AvatarElement;\r\n private container: HTMLElement;\r\n private closeBtn: HTMLElement;\r\n private btnMenu: HTMLElement;\r\n private sendAsPeerIds: PeerId[];\r\n private sendAsPeerId: PeerId;\r\n private updatingPromise: ReturnType;\r\n private middleware: ReturnType;\r\n private listenerSetter: ListenerSetter;\r\n private peerId: PeerId;\r\n private addedListener: boolean;\r\n\r\n constructor(\r\n private managers: AppManagers,\r\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\r\n private onChange: (sendAsPeerId: PeerId) => void\r\n ) {\r\n this.middleware = getMiddleware();\r\n this.listenerSetter = new ListenerSetter();\r\n this.construct();\r\n }\r\n \r\n private construct() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('new-message-send-as-container');\r\n\r\n this.closeBtn = document.createElement('div');\r\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\r\n\r\n const sendAsButtons: ButtonMenuItemOptions[] = [{\r\n text: 'SendMessageAsTitle',\r\n onClick: undefined\r\n }];\r\n\r\n let previousAvatar: HTMLElement;\r\n const onSendAsMenuToggle = (visible: boolean) => {\r\n if(visible) {\r\n previousAvatar = this.avatar;\r\n }\r\n\r\n const isChanged = this.avatar !== previousAvatar;\r\n const useRafs = !visible && isChanged ? 2 : 0;\r\n\r\n SetTransition(this.closeBtn, 'is-visible', visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n if(!isChanged) {\r\n SetTransition(previousAvatar, 'is-visible', !visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n }\r\n };\r\n\r\n ButtonMenuToggle({\r\n noRipple: true, \r\n listenerSetter: this.listenerSetter, \r\n container: this.container\r\n }, 'top-right', sendAsButtons, () => {\r\n onSendAsMenuToggle(true);\r\n }, () => {\r\n onSendAsMenuToggle(false);\r\n });\r\n\r\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\r\n this.btnMenu = this.container.firstElementChild as any;\r\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\r\n this.container.append(this.closeBtn);\r\n }\r\n\r\n private async updateButtons(peerIds: PeerId[]) {\r\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\r\n const textElement = document.createElement('div');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('btn-menu-item-subtitle');\r\n if(sendAsPeerId.isUser()) {\r\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\r\n } else if(sendAsPeerId === this.peerId) {\r\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\r\n } else {\r\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\r\n }\r\n\r\n textElement.append(\r\n new PeerTitle({peerId: sendAsPeerId}).element,\r\n subtitle\r\n );\r\n\r\n return {\r\n onClick: idx ? async() => {\r\n const currentPeerId = this.peerId;\r\n this.changeSendAsPeerId(sendAsPeerId);\r\n\r\n const middleware = this.middleware.get();\r\n const executeButtonsUpdate = () => {\r\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\r\n const peerIds = this.sendAsPeerIds.slice();\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateButtons(peerIds);\r\n };\r\n \r\n if(rootScope.settings.animationsEnabled) {\r\n setTimeout(executeButtonsUpdate, 250);\r\n } else {\r\n executeButtonsUpdate();\r\n }\r\n\r\n // return;\r\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\r\n } : undefined,\r\n textElement\r\n };\r\n });\r\n\r\n const buttons = await Promise.all(promises);\r\n const btnMenu = ButtonMenu(buttons/* , this.listenerSetter */);\r\n buttons.forEach((button, idx) => {\r\n const peerId = peerIds[idx];\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\r\n avatar.updateWithOptions({peerId});\r\n\r\n if(!idx) {\r\n avatar.classList.add('active');\r\n }\r\n \r\n button.element.prepend(avatar);\r\n });\r\n\r\n Array.from(this.btnMenu.children).slice(1).forEach((node) => node.remove());\r\n this.btnMenu.append(...Array.from(btnMenu.children));\r\n }\r\n\r\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n const previousAvatar = this.avatar;\r\n if(previousAvatar) {\r\n if(previousAvatar.peerId === sendAsPeerId) {\r\n return;\r\n }\r\n }\r\n \r\n if(!previousAvatar) {\r\n skipAnimation = true;\r\n }\r\n \r\n let useRafs = skipAnimation ? 0 : 2;\r\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\r\n const avatar = this.avatar = new AvatarElement();\r\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\r\n await avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: sendAsPeerId\r\n });\r\n\r\n SetTransition(avatar, 'is-visible', true, duration, undefined, useRafs); \r\n if(previousAvatar) {\r\n SetTransition(previousAvatar, 'is-visible', false, duration, () => {\r\n previousAvatar.remove();\r\n }, useRafs);\r\n }\r\n \r\n this.container.append(avatar);\r\n }\r\n\r\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n this.sendAsPeerId = sendAsPeerId;\r\n this.onChange(sendAsPeerId);\r\n return this.updateAvatar(sendAsPeerId, skipAnimation);\r\n }\r\n\r\n private getDefaultSendAs(): Promise> {\r\n // return rootScope.myId;\r\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\r\n return {\r\n cached: acked.cached,\r\n result: acked.result.then((channelFull) => {\r\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\r\n })\r\n };\r\n });\r\n }\r\n \r\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\r\n const peerId = this.peerId;\r\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\r\n return;\r\n }\r\n\r\n const middleware = this.middleware.get(() => {\r\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\r\n });\r\n\r\n const {container} = this;\r\n const chatId = peerId.toChatId();\r\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\r\n // const result = Promise.resolve(this.getDefaultSendAs());\r\n\r\n const wasSkippingAnimation = skipAnimation;\r\n if(result instanceof Promise) {\r\n skipAnimation = undefined;\r\n }\r\n\r\n const auto = wasSkippingAnimation && !skipAnimation;\r\n\r\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\r\n if(!middleware() || sendAsPeerId === undefined) return;\r\n \r\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\r\n if(!middleware()) return;\r\n\r\n this.managers.appChatsManager.getSendAs(chatId).then((peers) => {\r\n if(!middleware()) return;\r\n\r\n const peerIds = peers.map((peer) => getPeerId(peer));\r\n this.sendAsPeerIds = peerIds.slice();\r\n\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateButtons(peerIds);\r\n });\r\n\r\n const callback = () => {\r\n this.onReady(container, skipAnimation);\r\n\r\n if(!this.addedListener) {\r\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\r\n if(this.peerId === peerId) {\r\n this.update();\r\n }\r\n });\r\n\r\n this.addedListener = true;\r\n }\r\n };\r\n\r\n if(auto) {\r\n callback();\r\n return;\r\n }\r\n\r\n return callback;\r\n });\r\n\r\n updatingPromise.finally(() => {\r\n if(this.updatingPromise === updatingPromise) {\r\n this.updatingPromise = undefined;\r\n }\r\n });\r\n\r\n if(!auto) {\r\n return updatingPromise;\r\n }\r\n }\r\n\r\n public update(skipAnimation?: boolean) {\r\n return this.updateManual(skipAnimation).then((callback) => callback && callback());\r\n }\r\n\r\n public setPeerId(peerId?: PeerId) {\r\n /* if(this.avatar) {\r\n this.avatar.remove();\r\n this.avatar = undefined;\r\n } */\r\n\r\n this.middleware.clean();\r\n this.updatingPromise = undefined;\r\n this.peerId = peerId;\r\n }\r\n\r\n public destroy() {\r\n this.container.remove();\r\n this.setPeerId();\r\n this.listenerSetter.removeAll();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { _i18n } from \"../lib/langPack\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\nimport SetTransition from \"./singleTransition\";\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\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.inputFake.innerHTML = this.input.innerHTML;\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');\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.setAttribute('contenteditable', 'true');\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.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition(this.input, className, true, transitionDuration, () => {\n this.input.classList.remove(className);\n });\n }\n\n public setValueSilently(value: string, fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.inputFake.innerHTML = value;\n if(!fromSet) {\n this.onFakeInput();\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message, ChatFull, UserFull } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { putPreloader } from '../putPreloader';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { BOT_START_PARAM, NULL_PEER_ID } from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ChatBotCommands from './botCommands';\r\nimport copy from '../../helpers/object/copy';\r\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\r\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\r\nimport PopupElement from '../popups';\r\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\r\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\r\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\r\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\r\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\r\nimport wrapDraft from '../wrappers/draft';\r\nimport wrapMessageForReply from '../wrappers/messageForReply';\r\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\r\nimport { AppManagers } from '../../lib/appManagers/managers';\r\nimport contextMenuController from \"../../helpers/contextMenuController\";\r\nimport { emojiFromCodePoints } from \"../../vendor/emoji\";\r\nimport { modifyAckedPromise } from \"../../helpers/modifyAckedResult\";\r\nimport ChatSendAs from \"./sendAs\";\r\nimport filterAsync from \"../../helpers/array/filterAsync\";\r\nimport InputFieldAnimated from \"../inputFieldAnimated\";\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputFieldAnimated;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean | Promise})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void | Promise;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n private botCommandsToggle: HTMLElement;\r\n private botCommands: ChatBotCommands;\r\n private botCommandsIcon: HTMLDivElement;\r\n private hasBotCommands: boolean;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n private sendAs: ChatSendAs;\r\n public sendAsPeerId: PeerId;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appImManager: AppImManager, \r\n private managers: AppManagers\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input', 'hide');\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach((group) => {\r\n const container = RadioForm(group.elements.map((e) => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId).then((mid) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n \r\n if(mid) {\r\n this.chat.setMessageId(mid);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n managers: this.managers,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n\r\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\r\n this.botCommandsToggle = document.createElement('div');\r\n this.botCommandsToggle.classList.add('new-message-bot-commands');\r\n\r\n const scaler = document.createElement('div');\r\n scaler.classList.add('new-message-bot-commands-icon-scale');\r\n\r\n const icon = this.botCommandsIcon = document.createElement('div');\r\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\r\n scaler.append(icon);\r\n this.botCommandsToggle.append(scaler);\r\n\r\n attachClickEvent(this.botCommandsToggle, (e) => {\r\n cancelEvent(e);\r\n const isShown = icon.classList.contains('state-back');\r\n if(isShown) {\r\n this.botCommands.toggle(true);\r\n icon.classList.remove('state-back');\r\n } else {\r\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\r\n icon.classList.add('state-back');\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.botCommands.addEventListener('visible', () => {\r\n icon.classList.add('state-back');\r\n });\r\n\r\n this.botCommands.addEventListener('hiding', () => {\r\n icon.classList.remove('state-back');\r\n });\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n //this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.managers);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.chat.peerId]) {\r\n if(this.startParam === BOT_START_PARAM) {\r\n this.setStartParam();\r\n } else { // updateNewMessage comes earlier than dialog appers\r\n this.center(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then((result) => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.managers.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n \r\n if(scale < 1) {\r\n const br = 12;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n //scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform, \r\n borderRadius, \r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer && \r\n neededFakeContainer.classList.contains('chat-input-control') && \r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom, \r\n widthTo\r\n };\r\n }\r\n\r\n public async center(animate = false) {\r\n return this._center(await this.getNeededFakeContainer(), animate);\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public async getNeededFakeContainer(startParam = this.startParam) {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(\r\n startParam !== undefined || \r\n !(await this.chat.canSend()) || \r\n this.chat.type === 'pinned' || \r\n await this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public async setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n \r\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true),\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.classList.add('hide');\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n const wrappedDraft = wrapDraft(draft);\r\n\r\n if(this.messageInputField.value === wrappedDraft && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n private createSendAs() {\r\n this.sendAsPeerId = undefined;\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n let firstChange = true;\r\n this.sendAs = new ChatSendAs(\r\n this.managers,\r\n (container, skipAnimation) => {\r\n let useRafs = 0;\r\n if(!container.parentElement) {\r\n this.newMessageWrapper.prepend(container);\r\n useRafs = 2;\r\n }\r\n\r\n this.updateOffset('as', true, skipAnimation, useRafs);\r\n },\r\n (sendAsPeerId) => {\r\n this.sendAsPeerId = sendAsPeerId;\r\n\r\n // do not change placeholder earlier than finishPeerChange does\r\n if(firstChange) {\r\n firstChange = false;\r\n return;\r\n }\r\n\r\n this.getPlaceholderKey().then((key) => {\r\n this.updateMessageInputPlaceholder(key);\r\n });\r\n }\r\n );\r\n } else {\r\n this.sendAs = undefined;\r\n }\r\n\r\n return this.sendAs;\r\n }\r\n\r\n public async finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\r\n \r\n const previousSendAs = this.sendAs;\r\n const sendAs = this.createSendAs();\r\n\r\n const [\r\n isBroadcast, \r\n canPinMessage, \r\n isBot, \r\n canSend, \r\n neededFakeContainer, \r\n ackedPeerFull, \r\n ackedScheduledMids, \r\n setSendAsCallback,\r\n filteredAttachMenuButtons\r\n ] = await Promise.all([\r\n this.managers.appPeersManager.isBroadcast(peerId),\r\n this.managers.appPeersManager.canPinMessage(peerId),\r\n this.managers.appPeersManager.isBot(peerId),\r\n this.chat.canSend(),\r\n this.getNeededFakeContainer(startParam),\r\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\r\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\r\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\r\n this.filterAttachMenuButtons()\r\n ]);\r\n\r\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\r\n\r\n return () => {\r\n // console.warn('[input] finishpeerchange start');\r\n \r\n chatInput.classList.remove('hide');\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n \r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n \r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', canPinMessage);\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n \r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n \r\n if(btnScheduled && ackedScheduledMids) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n callbackify(ackedScheduledMids.result, (mids) => {\r\n if(!middleware() || !mids) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n \r\n if(this.newMessageWrapper) {\r\n this.updateOffset(null, false, true);\r\n }\r\n \r\n if(botCommandsToggle) {\r\n this.hasBotCommands = undefined;\r\n this.botCommands.toggle(true, undefined, true);\r\n this.updateBotCommandsToggle(true);\r\n botCommandsToggle.remove();\r\n if(isBot) {\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const result = ackedPeerFull.result;\r\n callbackify(result, (userFull) => {\r\n if(!middleware()) return;\r\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\r\n });\r\n }\r\n }\r\n\r\n if(previousSendAs) {\r\n previousSendAs.destroy();\r\n }\r\n\r\n if(setSendAsCallback) {\r\n setSendAsCallback();\r\n }\r\n \r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n \r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n \r\n if(this.messageInput) {\r\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n \r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n \r\n this.startParam = startParam;\r\n \r\n this._center(neededFakeContainer, false);\r\n\r\n // console.warn('[input] finishpeerchange ends');\r\n };\r\n }\r\n\r\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\r\n if(type) {\r\n this.newMessageWrapper.dataset.offset = type;\r\n } else {\r\n delete this.newMessageWrapper.dataset.offset;\r\n }\r\n\r\n SetTransition(this.newMessageWrapper, 'has-offset', forwards, skipAnimation ? 0 : 300, undefined, useRafs);\r\n }\r\n\r\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\r\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\r\n this.updateBotCommandsToggle(skipAnimation);\r\n }\r\n\r\n private updateBotCommandsToggle(skipAnimation?: boolean) {\r\n const {botCommandsToggle, hasBotCommands} = this;\r\n\r\n const show = !!hasBotCommands && this.isInputEmpty();\r\n if(!hasBotCommands) {\r\n if(!botCommandsToggle.parentElement) {\r\n return;\r\n }\r\n \r\n botCommandsToggle.remove();\r\n }\r\n \r\n const forwards = show;\r\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\r\n\r\n if(!botCommandsToggle.parentElement) {\r\n this.newMessageWrapper.prepend(botCommandsToggle);\r\n }\r\n\r\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\r\n }\r\n\r\n private async getPlaceholderKey() {\r\n const {peerId, threadId} = this.chat;\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if(\r\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) || \r\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\r\n ) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n return key;\r\n }\r\n\r\n private updateMessageInputPlaceholder(key: LangPackKey) {\r\n // console.warn('[input] update placeholder');\r\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\r\n if(!i) {\r\n return;\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n\r\n private filterAttachMenuButtons() {\r\n if(!this.attachMenuButtons) return;\r\n const {peerId, threadId} = this.chat;\r\n return filterAsync(this.attachMenuButtons, (button) => {\r\n return button.verify(peerId, threadId);\r\n });\r\n }\r\n\r\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canSend;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canSend);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n this.updateMessageInputPlaceholder(placeholderKey);\r\n\r\n this.attachMenuButtons && this.attachMenuButtons.forEach((button) => {\r\n button.element.classList.toggle('hide', !visible.includes(button));\r\n });\r\n\r\n if(!canSend) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n if(attachMenu) {\r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n }\r\n \r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputFieldAnimated({\r\n placeholder: 'Message',\r\n name: 'message',\r\n withLinebreaks: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const MONOSPACE_FONT = 'var(--font-monospace)';\r\n const SPOILER_FONT = 'spoiler';\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\r\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const checkType = (type: MarkdownType) => {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n return haveThisType;\r\n };\r\n\r\n // * monospace can't be combined with different types\r\n if(type === 'monospace' || type === 'spoiler') {\r\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const haveThisType = checkType(type);\r\n // executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(this.resetCurrentFontFormatting());\r\n } else {\r\n if(type === 'monospace' || checkType('monospace')) {\r\n executed.push(this.resetCurrentFormatting());\r\n }\r\n\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n if(checkType('monospace')) {\r\n executed.push(this.resetCurrentFormatting());\r\n }\r\n\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private resetCurrentFormatting() {\r\n return document.execCommand('removeFormat', false, null);\r\n }\r\n\r\n private resetCurrentFontFormatting() {\r\n return document.execCommand('fontName', false, 'Roboto');\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace',\r\n 'KeyP': 'spoiler'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = parseEntities(value);\r\n const value = parseMarkdown(richValue, markdownEntities, true);\r\n const entities = mergeEntities(markdownEntities, parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n //console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n \r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n const isEmpty = !richValue.trim();\r\n if(isEmpty) {\r\n if(this.lastTimeType) {\r\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n\r\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\r\n // * so have to reset formatting\r\n if(document.activeElement === this.messageInput) {\r\n // document.execCommand('styleWithCSS', false, 'true');\r\n setTimeout(() => {\r\n if(document.activeElement === this.messageInput) {\r\n this.resetCurrentFontFormatting();\r\n }\r\n }, 0);\r\n // document.execCommand('styleWithCSS', false, 'false');\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n\r\n if(this.botCommands) {\r\n this.botCommands.toggle(true);\r\n }\r\n }\r\n\r\n if(this.botCommands) {\r\n this.updateBotCommandsToggle();\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = parseEntities(fullValue);\r\n mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach((entity) => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\r\n this.messageInputField.setValueSilently(value);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = parseMarkdown(value, entities, true);\r\n entities = mergeEntities(entities, parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n await this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\r\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = async(e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend('send_media'))) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.setRecording(true);\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach((value) => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\r\n\r\n this.recordTimeEl.innerText = formatted;\r\n\r\n fastRaf(r);\r\n };\r\n\r\n r();\r\n }).catch((e: Error) => {\r\n switch(e.name as string) {\r\n case 'NotAllowedError': {\r\n toast('Please allow access to your microphone');\r\n break;\r\n }\r\n\r\n case 'NotReadableError': {\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n default:\r\n console.error('Recorder start error:', e, e.name, e.message);\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = async(e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n await this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n contextMenuController.openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const forwarding = copy(this.forwarding);\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(forwarding, () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = await this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter((entity) => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach((entity) => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {peerId} = chat;\r\n const {noWebPage} = this;\r\n const sendingParams = this.chat.getMessageSendingParams();\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.managers.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.managers.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n ...sendingParams,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n clearDraft: true\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.onMessageSent(true);\r\n } else {\r\n this.onMessageSent(false, false);\r\n }\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n // setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n ...sendingParams,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n // }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public async sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = await this.managers.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.managers.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n ...this.chat.getMessageSendingParams(),\r\n isMedia: true, \r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public async initMessageEditing(mid: number) {\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n\r\n let input = documentFragmentToHTML(wrapDraftText(message.message, {entities: message.totalEntities}));\r\n const f = async() => {\r\n const replyFragment = await wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = async() => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n const p = fromPeerIds.map(async(fromPeerId) => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n const promises = mids.map(async(mid) => {\r\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n await Promise.all(promises);\r\n\r\n length += mids.length;\r\n });\r\n\r\n await Promise.all(p);\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map((smth) => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = await wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public async initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message = await this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(!message) { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.managers.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(!message) {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const {container} = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(container);\r\n } else {\r\n replyParent.insertBefore(container, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n container.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return container;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport documentFragmentToHTML from \"../../helpers/dom/documentFragmentToHTML\";\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) {\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 documentFragmentToHTML(wrapDraftText(draft.message, {entities: totalEntities}));\n}\n","/*\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 setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport ripple from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Message } from \"../../layer\";\r\nimport safeAssign from \"../../helpers/object/safeAssign\";\r\n\r\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\r\nconst CLASSNAME_BASE = 'pinned-container';\r\nconst HEIGHT = 52;\r\n\r\nexport default class PinnedContainer {\r\n public wrapperUtils: HTMLElement;\r\n public btnClose: HTMLElement;\r\n protected wrapper: HTMLElement;\r\n\r\n protected topbar: ChatTopbar;\r\n protected chat: Chat;\r\n protected listenerSetter: ListenerSetter;\r\n public className: string;\r\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\r\n \r\n protected floating = false;\r\n\r\n public onClose?: () => void | Promise;\r\n\r\n constructor(options: {\r\n topbar: PinnedContainer['topbar'],\r\n chat: PinnedContainer['chat'],\r\n listenerSetter: PinnedContainer['listenerSetter'],\r\n className: PinnedContainer['className'],\r\n divAndCaption: PinnedContainer['divAndCaption'],\r\n onClose?: PinnedContainer['onClose'],\r\n floating?: PinnedContainer['floating']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n const {divAndCaption, className} = this;\r\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\r\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\r\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\r\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\r\n \r\n this.btnClose = document.createElement('button');\r\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\r\n \r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\r\n ripple(this.wrapper);\r\n\r\n this.wrapperUtils = document.createElement('div');\r\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\r\n this.wrapperUtils.append(this.btnClose);\r\n\r\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\r\n\r\n divAndCaption.container.append(this.wrapper/* , this.close */);\r\n\r\n this.attachOnCloseEvent(this.btnClose);\r\n }\r\n\r\n public attachOnCloseEvent(elem: HTMLElement) {\r\n attachClickEvent(elem, (e) => {\r\n cancelEvent(e);\r\n\r\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\r\n if(needClose) {\r\n this.toggle(true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public toggle(hide?: boolean) {\r\n const isHidden = this.divAndCaption.container.classList.contains('hide');\r\n if(hide === undefined) {\r\n hide = !isHidden;\r\n } else if(hide === isHidden) {\r\n return;\r\n }\r\n\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n \r\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\r\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\r\n\r\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\r\n this.divAndCaption.container.classList.toggle('hide', hide);\r\n \r\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\r\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\r\n \r\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\r\n // const maxActive = hide ? 0 : 1;\r\n \r\n // * not sure when it became unneeded\r\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\r\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\r\n // }\r\n \r\n this.topbar.setFloating();\r\n this.topbar.setUtilsWidth();\r\n }\r\n\r\n public isVisible() {\r\n return !this.divAndCaption.container.classList.contains('hide');\r\n }\r\n\r\n public isFloating() {\r\n return this.divAndCaption.container.classList.contains('is-floating');\r\n }\r\n\r\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 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","// 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}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport throttle from \"../../helpers/schedulers/throttle\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport { Message } from \"../../layer\";\r\nimport { logger } from \"../../lib/logger\";\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n \r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);//this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n //this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\r\n const byDecimal = Array.from('' + number).map((n) => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n //const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n //decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n //this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n private static LOAD_COUNT = 50;\r\n private static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n private pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n private pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n private wasPinnedIndex = 0;\r\n private wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n private waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n private mids: number[] = [];\r\n private offsetIndex = 0;\r\n\r\n private loading = false;\r\n private loadedBottom = false;\r\n private loadedTop = false;\r\n\r\n private animatedSubtitle: AnimatedSuper;\r\n private animatedMedia: AnimatedSuper;\r\n private animatedCounter: AnimatedCounter;\r\n\r\n private listenerSetter: ListenerSetter;\r\n private scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n private getCurrentIndexPromise: Promise = null;\r\n private btnOpen: HTMLButtonElement;\r\n \r\n private setPinnedMessage: () => void;\r\n\r\n private isStatic: boolean;\r\n\r\n private debug: boolean;\r\n \r\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\r\n\r\n private log: ReturnType;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.log = logger('PM');\r\n this.debug = true;\r\n this.isStatic = false;\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\r\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.chat.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.chat.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.chat.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n // return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.log('setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.log('testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.log('testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\r\n log && log('start', mid, correctAfter);\r\n\r\n let gotRest = false;\r\n const promises = [\r\n this.managers.appMessagesManager.getSearch({\r\n peerId: this.chat.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then((r) => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId).then((p) => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map((message) => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.log.error('getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.log('handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.log('handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.log.error('handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = await this.chat.getMessage(mid);\r\n if(!message) {\r\n return;\r\n }\r\n \r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = await this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = await wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: (message as Message.message).message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n //});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from \"../../helpers/tsNow\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport { MUTE_UNTIL } from \"../../lib/mtproto/mtproto_config\";\nimport RadioField from \"../radioField\";\nimport Row, { RadioFormFromRows } from \"../row\";\nimport PopupPeer from \"./peer\";\n\nconst ONE_HOUR = 3600;\nconst times: {time: number, langKey: LangPackKey}[] = [{\n time: ONE_HOUR, \n langKey: 'ChatList.Mute.1Hour'\n}, {\n time: ONE_HOUR * 4, \n langKey: 'ChatList.Mute.4Hours'\n}, {\n time: ONE_HOUR * 8, \n langKey: 'ChatList.Mute.8Hours'\n}, {\n time: ONE_HOUR * 24, \n langKey: 'ChatList.Mute.1Day'\n}, {\n time: ONE_HOUR * 24 * 3,\n langKey: 'ChatList.Mute.3Days'\n}, {\n time: -1,\n langKey: 'ChatList.Mute.Forever'\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer(peerId, time === -1 ? MUTE_UNTIL : tsNow(true) + time);\n }\n }],\n body: true\n });\n\n const name = 'mute-time';\n const rows = times.map((time) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: time.langKey, \n name, \n value: '' + time.time\n })\n });\n\n return row;\n });\n\n let time: number;\n const radioForm = RadioFormFromRows(rows, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\n\n rows[rows.length - 1].radioField.checked = true;\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\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\r\n\r\nexport type GroupCallAudioAssetName = \"group_call_connect.mp3\" | \"group_call_end.mp3\" | \"group_call_start.mp3\" | \"voip_onallowtalk.mp3\";\r\n\r\nlet audioAsset: AudioAssetPlayer;\r\nexport default function getGroupCallAudioAsset() {\r\n return audioAsset ??= new AudioAssetPlayer([\r\n 'group_call_connect.mp3',\r\n 'group_call_end.mp3',\r\n 'group_call_start.mp3',\r\n 'voip_onallowtalk.mp3'\r\n ]);\r\n}\r\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: DisplayMediaStreamConstraints = {\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: DisplayMediaStreamConstraints) {\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\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach((x) => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n(window as any).getStream = getStream;\n","/*\n * 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: DisplayMediaStreamConstraints,\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","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\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\treturn 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\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn 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 * 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","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 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","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 * 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 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 let 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 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, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\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\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","/*\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 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 let 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 let 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getGroupCallAudioAsset from \"../../components/groupCall/getAudioAsset\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup } from \"../../layer\";\r\nimport { GroupCallId, GroupCallConnectionType } from \"../appManagers/appGroupCallsManager\";\r\nimport { AppManagers } from \"../appManagers/managers\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport GroupCallInstance from \"./groupCallInstance\";\r\nimport GROUP_CALL_STATE from \"./groupCallState\";\r\nimport createMainStreamManager from \"./helpers/createMainStreamManager\";\r\nimport { generateSsrc } from \"./localConferenceDescription\";\r\nimport { WebRTCLineType } from \"./sdpBuilder\";\r\nimport StreamManager from \"./streamManager\";\r\nimport { Ssrc } from \"./types\";\r\n\r\nlet IS_MUTED = true;\r\n\r\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\r\n return [\r\n makeSsrcFromParticipant(participant, 'audio', participant.source),\r\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\r\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\r\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\r\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\r\n ].filter(Boolean);\r\n};\r\n\r\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\r\n return generateSsrc(type, source, endpoint);\r\n}\r\n\r\nexport function generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\r\n return source && {\r\n _: 'groupCallParticipantVideo',\r\n pFlags: {},\r\n endpoint: '',\r\n source_groups: source.sourceGroups,\r\n audio_source: audioSource\r\n };\r\n}\r\n\r\nexport class GroupCallsController extends EventListenerBase<{\r\n instance: (instance: GroupCallInstance) => void\r\n}> {\r\n private audioAsset: ReturnType;\r\n private log: ReturnType;\r\n private currentGroupCall: GroupCallInstance;\r\n private managers: AppManagers;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.audioAsset = getGroupCallAudioAsset();\r\n this.log = logger('GCC');\r\n\r\n rootScope.addEventListener('group_call_update', (groupCall) => {\r\n const {currentGroupCall} = this;\r\n if(currentGroupCall?.id === groupCall.id) {\r\n currentGroupCall.groupCall = groupCall;\r\n \r\n if(groupCall._ === 'groupCallDiscarded') {\r\n currentGroupCall.hangUp(false, false, true);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\r\n const {currentGroupCall} = this;\r\n if(currentGroupCall?.id === groupCallId) {\r\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\r\n }\r\n });\r\n }\r\n\r\n get groupCall() {\r\n return this.currentGroupCall;\r\n }\r\n\r\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\r\n this.currentGroupCall = groupCall;\r\n\r\n if(groupCall) {\r\n this.dispatchEvent('instance', groupCall);\r\n }\r\n }\r\n\r\n public startConnectingSound() {\r\n this.stopConnectingSound();\r\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\r\n }\r\n \r\n public stopConnectingSound() {\r\n this.audioAsset.stopSound();\r\n this.audioAsset.cancelDelayedPlay();\r\n }\r\n\r\n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\r\n this.audioAsset.createAudio();\r\n\r\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\r\n \r\n let streamManager: StreamManager;\r\n if(rejoin) {\r\n streamManager = this.currentGroupCall.connections.main.streamManager;\r\n } else {\r\n streamManager = await createMainStreamManager(muted, joinVideo);\r\n }\r\n\r\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\r\n }\r\n\r\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\r\n const log = this.log.bindPrefix('joinGroupCallInternal');\r\n log('start', groupCallId);\r\n\r\n const type: GroupCallConnectionType = 'main';\r\n\r\n let {currentGroupCall} = this;\r\n if(currentGroupCall && rejoin) {\r\n // currentGroupCall.connections.main.connection = connection;\r\n currentGroupCall.handleUpdateGroupCallParticipants = false;\r\n currentGroupCall.updatingSdp = false;\r\n log('update currentGroupCall', groupCallId, currentGroupCall);\r\n } else {\r\n currentGroupCall = new GroupCallInstance({\r\n chatId,\r\n id: groupCallId,\r\n managers: this.managers\r\n });\r\n\r\n currentGroupCall.fixSafariAudio();\r\n\r\n currentGroupCall.addEventListener('state', (state) => {\r\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\r\n this.setCurrentGroupCall(null);\r\n this.stopConnectingSound();\r\n this.audioAsset.playSound('group_call_end.mp3');\r\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\r\n }\r\n });\r\n\r\n currentGroupCall.groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\r\n\r\n const connectionInstance = currentGroupCall.createConnectionInstance({\r\n streamManager,\r\n type,\r\n options: {\r\n type,\r\n isMuted: muted,\r\n joinVideo,\r\n rejoin\r\n }\r\n });\r\n\r\n const connection = connectionInstance.createPeerConnection();\r\n connection.addEventListener('negotiationneeded', () => {\r\n connectionInstance.negotiate();\r\n });\r\n\r\n connection.addEventListener('track', (event) => {\r\n log('ontrack', event);\r\n currentGroupCall.onTrack(event);\r\n });\r\n \r\n connection.addEventListener('iceconnectionstatechange', () => {\r\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\r\n \r\n const {iceConnectionState} = connection;\r\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\r\n this.startConnectingSound();\r\n } else {\r\n this.stopConnectingSound();\r\n }\r\n \r\n switch(iceConnectionState) {\r\n case 'checking': {\r\n break;\r\n }\r\n \r\n case 'closed': {\r\n currentGroupCall.hangUp();\r\n break;\r\n }\r\n \r\n case 'completed': {\r\n break;\r\n }\r\n \r\n case 'connected': {\r\n if(!currentGroupCall.joined) {\r\n currentGroupCall.joined = true;\r\n this.audioAsset.playSound('group_call_start.mp3');\r\n this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\r\n }\r\n \r\n break;\r\n }\r\n \r\n case 'disconnected': {\r\n break;\r\n }\r\n \r\n case 'failed': {\r\n //TODO: replace with ICE restart\r\n currentGroupCall.hangUp();\r\n // connection.restartIce();\r\n break;\r\n }\r\n \r\n case 'new': {\r\n break;\r\n }\r\n }\r\n });\r\n\r\n connectionInstance.createDescription();\r\n connectionInstance.createDataChannel();\r\n\r\n connectionInstance.appendStreamToConference();\r\n\r\n this.setCurrentGroupCall(currentGroupCall);\r\n log('set currentGroupCall', groupCallId, currentGroupCall);\r\n\r\n this.startConnectingSound();\r\n\r\n return connectionInstance.negotiate();\r\n }\r\n }\r\n}\r\n\r\nconst groupCallsController = new GroupCallsController();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\r\nexport default groupCallsController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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","/*\n * 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 { fastRaf } from \"../../helpers/schedulers\";\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 generateTitleIcons from \"../generateTitleIcons\";\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\";\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: (ButtonMenuItemOptions & {verify: ButtonToVerify['verify']})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: 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 = 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({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\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 deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n if(isMenuOpen) {\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n \n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons : []);\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()) 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.getChatTyped(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(this.peerId, false))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false))\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: '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 if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware()) 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\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\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 if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n if(this.chatAudio) {\n this.chatAudio.destroy();\n }\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 = this.peerId;\n\n let newAvatar: AvatarElement;\n if(this.avatarElement) {\n newAvatar = this.constructAvatar();\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}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(isAnyChat) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !chat?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(newAvatar) {\n this.avatarElement.replaceWith(newAvatar);\n this.avatarElement = newAvatar;\n }\n \n this.setUtilsWidth();\n \n this.verifyButtons();\n \n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.chat.wasAlreadyUsed) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \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 }\n \n setTitleCallback();\n setStatusCallback && setStatusCallback();\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const peerId = this.peerId;\n const middleware = () => this.peerId === peerId;\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, this.chat.threadId);\n if(result.cached) {\n const historyResult = await result.result;\n count = historyResult.count;\n } else result.result.then((historyResult) => this.setTitle(historyResult.count));\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 }),\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 let muted = await this.managers.appNotificationsManager.isPeerLocalMuted(peerId, false);\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 \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 && 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) return;\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus(\n peerId, \n this.subtitle, \n needClear, \n false, \n () => peerId === this.peerId\n );\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n if(callback) {\n callback();\n }\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupElement from \"../../popups\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport ripple from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\nimport PopupElement from \"../popups\";\r\nimport { DIALOG_LIST_ELEMENT_TAG } from \"../../lib/appManagers/appDialogsManager\";\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n \r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n \r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.container.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n \r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n \r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.container.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\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 img: HTMLImageElement;\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.img = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => img);\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 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 img = this.img;\n\n let imageWidth = img.width, imageHeight = img.height;\n // if(imageHeight < height) {\n let patternHeight = 1480 * canvas.dpr;\n // * correct\n // if(+canvas.dataset.originalHeight !== height) hhh *= 2 / 3;\n // * but have to make it good\n if(+canvas.dataset.originalHeight !== height) patternHeight *= .875;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n // }\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(img, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = height / 2 - 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 let width = this.options.width * devicePixelRatio, \n 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\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 type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { MessagesStorageKey } from \"../../lib/appManagers/appMessagesManager\";\n// import type AppMediaViewerBase from \"../appMediaViewerBase\";\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 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 } from \"../../layer\";\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | '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 isAnyGroup: boolean;\n public isMegagroup: boolean;\n \n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\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.error('Chat construction');\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\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground && \n document.documentElement.style.cursor === 'grabbing' && \n this.gradientRenderer && \n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\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 = theme.background.intensity && theme.background.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 if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\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));\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(item, 'is-visible', true, !skipAnimation ? 200 : 0, prev ? () => {\n if(previousPatternRenderer) {\n previousPatternRenderer.cleanup(previousPatternCanvas);\n }\n\n if(previousGradientRenderer) {\n previousGradientRenderer.cleanup();\n }\n\n prev.remove();\n } : null, 2);\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 promise = Promise.resolve();\n // }\n \n promise.then(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 if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n if(this.type !== 'scheduled' && !IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.classList.add('type-' + this.type);\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(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\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.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 async onChangePeer(m: ReturnType) {\n const {peerId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n const [noForwards, isRestricted, isAnyGroup, _, isMegagroup] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId)\n ]));\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\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, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\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.peerId === peerId;\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer(false, peerId);\n this.appImManager.dispatchEvent('peer_changed', peerId);\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(samePeer, peerId, lastMsgId, startParam);\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 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(this.peerId, messageId);\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 sharedMediaTab.loadSidebarMedia(true);\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n ]);\n\n const [callbacks] = await Promise.all([\n callbacksPromise,\n sharedMediaTab.fillProfileElements()\n ]);\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.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', peerId);\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 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() {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n sendSilent: 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","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport clamp from \"../../helpers/number/clamp\";\r\nimport matchUrl from \"../../lib/richTextProcessor/matchUrl\";\r\nimport matchUrlProtocol from \"../../lib/richTextProcessor/matchUrlProtocol\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach((c) => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach((node) => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\r\n\r\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\r\n \r\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\r\n\r\n const sizesRect = currentTools.getBoundingClientRect();\r\n const top = selectionTop - sizesRect.height - 8;\r\n \r\n const minX = inputRect.left;\r\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\r\n let left: number;\r\n if(isLinkToggle) {\r\n const containerRect = this.container.getBoundingClientRect();\r\n left = clamp(containerRect.left, minX, maxX);\r\n } else {\r\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\r\n left = clamp(x, minX, maxX);\r\n }\r\n\r\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\r\n\r\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\r\n \r\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n }\r\n\r\n public show() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(isSelectionEmpty()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(this.hideTimeout !== undefined) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if(this.container.classList.contains('is-visible')) {\r\n return;\r\n }\r\n\r\n this.setActiveMarkupButton();\r\n \r\n this.container.classList.remove('is-link');\r\n const isFirstShow = this.container.classList.contains('hide');\r\n if(isFirstShow) {\r\n this.container.classList.remove('hide');\r\n this.container.classList.add('no-transition');\r\n }\r\n \r\n this.setTooltipPosition();\r\n \r\n if(isFirstShow) {\r\n void this.container.offsetLeft; // reflow\r\n this.container.classList.remove('no-transition');\r\n }\r\n \r\n this.container.classList.add('is-visible');\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'markup',\r\n onPop: () => {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n //this.log('selection', selectionRect, activeButton);\r\n }\r\n\r\n /* private onMouseUp = (e: Event) => {\r\n this.log('onMouseUp');\r\n if(findUpClassName(e.target, 'markup-tooltip')) return;\r\n\r\n this.hide();\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n }; */\r\n\r\n private onMouseUpSingle = (e?: Event) => {\r\n //this.log('onMouseUpSingle');\r\n this.waitingForMouseUp = false;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n e && cancelEvent(e);\r\n if(this.mouseUpCounter++ === 0) {\r\n this.resetSelection(this.savedRange);\r\n } else {\r\n this.hide();\r\n return;\r\n }\r\n }\r\n\r\n this.show();\r\n\r\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\r\n };\r\n\r\n public setMouseUpEvent() {\r\n if(this.waitingForMouseUp) return;\r\n this.waitingForMouseUp = true;\r\n\r\n //this.log('setMouseUpEvent');\r\n\r\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\r\n }\r\n\r\n public cancelClosening() {\r\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n document.addEventListener('mouseup', (e) => {\r\n cancelEvent(e);\r\n this.mouseUpCounter = 1;\r\n this.waitingForMouseUp = false;\r\n this.setMouseUpEvent();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n public handleSelection() {\r\n if(this.addedListener) return;\r\n this.addedListener = true;\r\n document.addEventListener('selectionchange', (e) => {\r\n //this.log('selectionchange');\r\n\r\n if(document.activeElement === this.linkInput) {\r\n return;\r\n }\r\n\r\n const messageInput = this.appImManager.chat.input.messageInput;\r\n if(document.activeElement !== messageInput) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const selection = document.getSelection();\r\n if(isSelectionEmpty(selection)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n if(IS_APPLE) {\r\n this.show();\r\n this.setTooltipPosition(); // * because can skip this in .show();\r\n } else {\r\n if(this.mouseUpCounter === 2) {\r\n this.mouseUpCounter = 0;\r\n return;\r\n }\r\n\r\n this.savedRange = selection.getRangeAt(0);\r\n this.setMouseUpEvent();\r\n /* document.addEventListener('touchend', (e) => {\r\n cancelEvent(e);\r\n this.resetSelection(range);\r\n this.show();\r\n }, {once: true, passive: false}); */\r\n }\r\n } else if(this.container && this.container.classList.contains('is-visible')) {\r\n this.setTooltipPosition();\r\n } else if(messageInput.matches(':active')) {\r\n this.setMouseUpEvent();\r\n } else {\r\n this.show();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter((node) => !!node);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach((el) => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach((el) => el.classList.remove('no-transition'));\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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 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(let 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","/*\n * 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 color: RLottieColor, 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 color = 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.checkAnimations(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 { GroupCallParticipant } from \"../../layer\";\nimport appDialogsManager, { DialogDom, AppDialogsManager } 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 = 54;\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 lazyLoadQueue: this.lazyLoadQueue\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 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 { 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 * 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 type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\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 ButtonMenu, { ButtonMenuItemOptions } 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: HTMLDivElement;\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 = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, async(e: any) => {\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 }, listenerSetter);\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.closeBtnMenu();\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.closeBtnMenu();\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.peerId !== peerId) {\n peerTitle.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: (e: TouchEvent | MouseEvent) => boolean;\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 xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\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\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 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(this.partyMutedState, 'is-visible', !!outputState?.muted, 300);\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\r\n\r\nexport type CallAudioAssetName = \"call_busy.mp3\" | \"call_connect.mp3\" | \"call_end.mp3\" | \"call_incoming.mp3\" | \"call_outgoing.mp3\" | \"voip_failed.mp3\" | \"voip_connecting.mp3\";\r\n\r\nlet audioAsset: AudioAssetPlayer;\r\nexport default function getCallAudioAsset() {\r\n return audioAsset ??= new AudioAssetPlayer([\r\n 'call_busy.mp3',\r\n 'call_connect.mp3',\r\n 'call_end.mp3',\r\n 'call_incoming.mp3',\r\n 'call_outgoing.mp3',\r\n 'voip_failed.mp3'\r\n ]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getCallAudioAsset, { CallAudioAssetName } from \"../../components/call/getAudioAsset\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\r\nimport bytesCmp from \"../../helpers/bytes/bytesCmp\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport { PhoneCallProtocol } from \"../../layer\";\r\nimport { CallId } from \"../appManagers/appCallsManager\";\r\nimport { AppManagers } from \"../appManagers/managers\";\r\nimport { logger } from \"../logger\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\nimport rootScope from \"../rootScope\";\r\nimport CallInstance from \"./callInstance\";\r\nimport CALL_STATE from \"./callState\";\r\n\r\nconst CALL_REQUEST_TIMEOUT = 45e3;\r\n\r\nexport class CallsController extends EventListenerBase<{\r\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\r\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\r\n incompatible: (userId: UserId) => void,\r\n}> {\r\n private log: ReturnType;\r\n private managers: AppManagers;\r\n private audioAsset: AudioAssetPlayer;\r\n private instances: Map;\r\n private sortedInstances: Array;\r\n private tempId: number;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.log = logger('CC');\r\n\r\n if(!IS_CALL_SUPPORTED) {\r\n return;\r\n }\r\n\r\n this.audioAsset = getCallAudioAsset();\r\n this.tempId = 0;\r\n this.instances = new Map();\r\n this.sortedInstances = [];\r\n\r\n rootScope.addEventListener('call_update', async(call) => {\r\n let instance = this.instances.get(call.id);\r\n\r\n if(instance) {\r\n instance.setPhoneCall(call);\r\n }\r\n \r\n switch(call._) {\r\n case 'phoneCallDiscarded': {\r\n if(instance) {\r\n instance.hangUp(call.reason?._, true);\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'phoneCallAccepted': {\r\n if(instance) {\r\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\r\n instance.hangUp('phoneCallDiscardReasonDisconnect');\r\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\r\n break;\r\n } */\r\n\r\n instance.confirmCall();\r\n }\r\n\r\n break;\r\n }\r\n \r\n case 'phoneCallRequested': {\r\n if(!instance) {\r\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\r\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\r\n break;\r\n } */\r\n\r\n instance = this.createCallInstance({\r\n isOutgoing: false,\r\n interlocutorUserId: call.admin_id\r\n });\r\n \r\n instance.overrideConnectionState(CALL_STATE.PENDING);\r\n instance.setPhoneCall(call);\r\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\r\n }\r\n \r\n break;\r\n }\r\n\r\n case 'phoneCall': {\r\n if(!instance || instance.encryptionKey) {\r\n break;\r\n }\r\n\r\n const g_a = instance.dh.g_a = call.g_a_or_b;\r\n const dh = instance.dh;\r\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\r\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\r\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\r\n break;\r\n }\r\n\r\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\r\n if(call.key_fingerprint !== key_fingerprint) {\r\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\r\n instance.hangUp('phoneCallDiscardReasonDisconnect');\r\n break;\r\n }\r\n\r\n instance.encryptionKey = key;\r\n instance.joinCall();\r\n\r\n break;\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\r\n const instance = this.instances.get(callId);\r\n if(instance?.id !== callId) {\r\n return;\r\n }\r\n \r\n instance.onUpdatePhoneCallSignalingData(data);\r\n });\r\n }\r\n\r\n public get currentCall() {\r\n return this.sortedInstances[0];\r\n }\r\n\r\n public getCallByUserId(userId: UserId) {\r\n for(const [callId, instance] of this.instances) {\r\n if(instance.interlocutorUserId === userId) {\r\n return instance;\r\n }\r\n }\r\n }\r\n\r\n private createCallInstance(options: {\r\n isOutgoing: boolean,\r\n interlocutorUserId: UserId,\r\n protocol?: PhoneCallProtocol\r\n }) {\r\n const call = new CallInstance({\r\n managers: this.managers,\r\n ...options,\r\n });\r\n\r\n call.addEventListener('state', (state) => {\r\n const currentCall = this.currentCall;\r\n if(state === CALL_STATE.CLOSED) {\r\n this.instances.delete(call.id);\r\n indexOfAndSplice(this.sortedInstances, call);\r\n } else {\r\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\r\n }\r\n\r\n if(state === CALL_STATE.EXCHANGING_KEYS) {\r\n call.wasTryingToJoin = true;\r\n }\r\n\r\n const hasConnected = call.connectedAt !== undefined;\r\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\r\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\r\n } else {\r\n call.clearHangUpTimeout();\r\n }\r\n\r\n if(currentCall === call || !currentCall) {\r\n if(state === CALL_STATE.CLOSED) {\r\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\r\n this.audioAsset.stopSound();\r\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\r\n this.audioAsset.playSound('voip_failed.mp3');\r\n } else {\r\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\r\n }\r\n } else if(state === CALL_STATE.PENDING) {\r\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\r\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\r\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\r\n } else if(state === CALL_STATE.CONNECTING) {\r\n if(call.duration) {\r\n this.audioAsset.playSound('voip_connecting.mp3', true);\r\n }\r\n } else {\r\n this.audioAsset.stopSound();\r\n }\r\n }\r\n });\r\n\r\n call.addEventListener('id', (id, prevId) => {\r\n if(prevId !== undefined) {\r\n this.instances.delete(prevId);\r\n }\r\n\r\n const hasCurrent = !!this.currentCall;\r\n this.instances.set(id, call);\r\n\r\n if(prevId === undefined) {\r\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\r\n }\r\n });\r\n\r\n return call;\r\n }\r\n\r\n public async startCallInternal(userId: UserId, isVideo: boolean) {\r\n this.log('p2pStartCallInternal', userId, isVideo);\r\n \r\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\r\n if(!fullInfo) return;\r\n \r\n const {video_calls_available} = fullInfo.pFlags;\r\n \r\n const call = this.createCallInstance({\r\n isOutgoing: true,\r\n interlocutorUserId: userId\r\n });\r\n\r\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\r\n\r\n call.overrideConnectionState(CALL_STATE.REQUESTING);\r\n call.setPhoneCall({\r\n _: 'phoneCallWaiting',\r\n access_hash: '',\r\n admin_id: NULL_PEER_ID,\r\n date: tsNow(true),\r\n id: --this.tempId,\r\n participant_id: userId,\r\n protocol: call.protocol,\r\n pFlags: {\r\n video: isVideo || undefined\r\n }\r\n });\r\n\r\n // return;\r\n this.managers.appCallsManager.generateDh().then(async(dh) => {\r\n call.dh = dh;\r\n\r\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\r\n }).then((phoneCall) => {\r\n call.overrideConnectionState(CALL_STATE.PENDING);\r\n call.setPhoneCall(phoneCall);\r\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\r\n });\r\n }\r\n}\r\n\r\nconst callsController = new CallsController();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\r\nexport default callsController;\r\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 let 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 let 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 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 let 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(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\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 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 faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"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({message, fwdCount, peerReaction, peerTypeNotifySettings}: {\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 = await this.managers.appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\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, undefined, undefined, true);\n\n if(peerReaction) {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(peerReaction.reaction), // 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 }\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 notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle(peerId, true, undefined, undefined, this.managers);\n if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle(notificationFromPeerId, true, undefined, undefined, 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});\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 = 'assets/img/favicon.ico') {\n if(this.prevFavicon === href) {\n return;\n }\n\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\n link.href = href;\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\n this.faviconEl = link;\n\n this.prevFavicon = href;\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(let 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 animationIntersector 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, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction } from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer 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 type { GroupCallId, MyGroupCall } from './appGroupCallsManager';\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 type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\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 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 '../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';\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\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};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (peerId: PeerId) => void,\n peer_changing: (chat: Chat) => 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 public tabId = -1;\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\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 if(theme.background.slug) {\n const url = 'assets/img/' + theme.background.slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\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 useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(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_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 !== 1\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') && bubble.classList.contains('sticker') && 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, 'message') || 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(parentElement, className, true, duration, () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition(parentElement, className, false, duration, () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n });\n }, showDuration);\n }, useRafs);\n };\n \n apiManagerProxy.addEventListener('notificationBuild', (options) => {\n if(this.chat.peerId === options.message.peerId && !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.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', (userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible', \n langPackArguments: [\n new PeerTitle({peerId: userId.toPeerId()}).element\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 this.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 this.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 this.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 this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.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 this.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 this.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}) => {\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 link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.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}) => {\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, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.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 this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n this.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 }\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 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(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.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \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\n this.openUsername({\n userName: link.domain, \n lastMsgId: postId, \n commentId,\n startParam: link.start\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.deleted) {\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 if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.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 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 const a = document.createElement('a');\n a.href = wrappedUrl;\n \n (window as any)[onclick](a);\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private 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 private onHashChange = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = this.parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n const {onclick} = wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n const p: string = params.p;\n let 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 public openUsername(options: {\n userName: string, \n lastMsgId?: number, \n threadId?: number, \n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n \n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\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 openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return this.managers.appMessagesManager.wrapSingleMessage(peerId, threadId).then((message) => {\n // const message: Message = this.managers.appMessagesManager.getMessageByPeer(peerId, threadId);\n if(!message) {\n lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return this.managers.appMessagesManager.getDiscussionMessage(peerId, msgId).then((message) => {\n return this.openThread(message.peerId, commentId, message.mid);\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 confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [new PeerTitle({peerId: userId.toPeerId()}).element],\n button: {\n langKey: 'OK',\n isCancel: true\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 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: [\n new PeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\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 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: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\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 if(theme.background.slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * 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) => !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 document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\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 if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\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.checkAnimations(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(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\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: number, 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 === 0);\n\n const prevTabId = this.tabId;\n if(prevTabId !== -1) {\n this.overrideHash(id > 0 ? this.chat?.peerId : undefined);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false && mediaSizes.activeScreen !== ScreenSize.large) {\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 === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !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.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\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: ChatSetPeerOptions = {}, 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} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\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 && chat.peerId !== peerId) {\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(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(peerId, lastMsgId, options.startParam);\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(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(options.threadId) {\n options.type = 'discussion';\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex((chat) => chat.peerId === peerId && chat.type === type);\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 if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\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) {\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);\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): Promise> {\n const typingEl = 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) {\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) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId());\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(\n peerId: PeerId, \n element: HTMLElement, \n needClear: boolean, \n useWhitespace: boolean, \n middleware: () => boolean, \n ignoreSelf?: boolean\n ) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\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);\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 ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback && callback());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","/*\n * 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 ButtonMenu 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.innerHTML = 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.innerHTML = 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.innerHTML = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = 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] = 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 = ButtonMenu(buttons);\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(\n this.playbackRateButton, \n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined, \n undefined, \n 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_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 PeerTitle from \"./peerTitle\";\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\";\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 //console.log(xDiff, yDiff);\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 // * 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({onlyMobile: true}, '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.checkAnimations(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;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\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 \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 }\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 renderImageFromUrl(el, url);\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 let 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 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 if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n \n if(preloader) {\n preloader.detach();\n }\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 let 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, detachClickEvent } 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 type { MyDocument } from \"../lib/appManagers/appDocsManager\";\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 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 { ButtonMenuItemOptions } 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: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\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', 'message'/* , '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: ButtonMenuItemOptions[] = [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 cantForwardMessage = message._ === 'messageService' || !this.managers.appMessagesManager.canForward(message);\n [this.buttons.forward, this.btnMenuForward.element].forEach((button) => {\n button.classList.toggle('hide', cantForwardMessage);\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantForwardMessage);\n \n const cantDownloadMessage = cantForwardMessage;\n [this.buttons.download, this.btnMenuDownload.element].forEach((button) => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = this.managers.appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach((button) => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\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 { 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport type LazyLoadQueue from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport isObject from \"../helpers/object/isObject\";\r\nimport { ArgumentTypes } from \"../types\";\r\nimport putPhoto from \"./putPhoto\";\r\nimport { recordPromise } from \"../helpers/recordPromise\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n (Array.from(document.querySelectorAll('avatar-element[data-peer-id=\"' + peerId + '\"]')) as AvatarElement[]).forEach((elem) => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', async(peerId) => {\r\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(peerId))) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await rootScope.managers.appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then((value) => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(\r\n photo.id, \r\n getTarget(), \r\n undefined, \r\n prevTargets ? f(prevTargets) : undefined, \r\n nextTargets ? f(nextTargets) : undefined\r\n );\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n public peerId: PeerId;\r\n public isDialog: boolean;\r\n public peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueue;\r\n public isBig: boolean;\r\n private addedToQueue = false;\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n public attachClickEvent() {\r\n let loading = false;\r\n attachClickEvent(this, async(e) => {\r\n cancelEvent(e);\r\n if(loading) return;\r\n //console.log('avatar clicked');\r\n const peerId = this.peerId;\r\n loading = true;\r\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\r\n loading = false;\r\n });\r\n }\r\n\r\n public updateOptions(options: Partial[0]>) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n public updateWithOptions(options: {\r\n peerId: PeerId,\r\n isDialog?: boolean,\r\n isBig?: boolean,\r\n peerTitle?: string,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n loadPromises?: Promise[]\r\n }) {\r\n const wasPeerId = this.peerId;\r\n this.updateOptions(options);\r\n const newPeerId = this.peerId;\r\n\r\n if(wasPeerId === newPeerId) {\r\n return;\r\n }\r\n\r\n this.peerId = /* rootScope.managers.appPeersManager.getPeerMigratedTo(newPeerId) || */newPeerId;\r\n this.dataset.peerId = '' + newPeerId;\r\n\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n return this.update();\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const promise = putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb, this.isBig);\r\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises.push(promise);\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return this.r(true);\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const promise = this.r();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, { DIALOG_LIST_ELEMENT_TAG } from \"../lib/appManagers/appDialogsManager\";\nimport type { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\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\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\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() => !(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 const isPinned = 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 const isPinned = 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.selectedId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId)); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.selectedId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId)); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(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.selectedId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n this.managers.appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(async(err) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n const config = await this.managers.apiManager.getConfig();\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n appSidebarLeft.createTab(AppChatFoldersTab);\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n new PopupMute(this.selectedId);\n };\n\n private onUnreadClick = async() => {\n const selectedId = this.selectedId;\n const dialog = await this.managers.appMessagesManager.getDialogOnly(selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(selectedId, dialog.top_message);\n this.managers.appMessagesManager.markDialogUnread(selectedId, true);\n } else {\n this.managers.appMessagesManager.markDialogUnread(selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\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.filterId = appDialogsManager.filterId;\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = await this.managers.appMessagesManager.getDialogOnly(this.selectedId);\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 // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(await this.managers.appPeersManager.getDeleteButtonText(this.selectedId)));\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.selectedId = this.dialog = this.filterId = 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 { 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\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport singleInstance from \"../lib/mtproto/singleInstance\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n \r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n const dcId = 2;\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: dcId,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-\" + dcId,\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n Promise.all([\r\n sessionStorage.get('dc'),\r\n rootScope.managers.rootScope.getConnectionStatus()\r\n ]).then(([baseDcId, connectionStatus]) => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n this.managers.apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n attachClickEvent(a, (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n if(singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\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 : -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\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 * 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 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: Element;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor() {\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 = 54;\n this.marginVertical = 9;\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?: {width: number, height: number},\n getRectFrom?: HTMLElement,\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = 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.onRemove) {\n this.onRemove();\n this.onRemove = undefined;\n }\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n }\n\n private updateCanvasSize(rect: {width: number, height: number} = this.getRectFrom.getBoundingClientRect()) {\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.avatarSize + this.marginVertical * 2) * 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 drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n\n marginLeft += avatarSize + 10;\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\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","/*\n * 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, 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 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\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent, simulateClickEvent } 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 { NULL_PEER_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 assumeType from \"../../helpers/assumeType\";\nimport generateTitleIcons from \"../../components/generateTitleIcons\";\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\";\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: 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 loadPromises?: Promise[]\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise = obj[key];\n if(oldPromise) {\n oldPromise.reject();\n }\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if(obj[key] === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => obj[key] === deferred);\n return {deferred, middleware};\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public managers: AppManagers,\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void,\n ) {\n super({\n getIndex: (element) => managers.dialogsStorage.getDialogIndex(element.id, this.indexKey),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && 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 && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({peerId: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private loadDialogsPromise: Promise<{cached: boolean, renderPromise: AppDialogsManager['loadDialogsRenderPromise']}>;\n private loadDialogsRenderPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n private sortedList: SortedDialogList;\n public placeholders: {[filterId: number]: DialogsPlaceholder} = {};\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private 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 sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\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\n constructor() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\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 /* 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 });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n apiManagerProxy.getState().then(async(state) => {\n this.loadedDialogsAtLeastOnce = false;\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 this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n this.setFilterId(0, 0);\n this.addFilter({\n id: this.filterId,\n title: '',\n orderIndex: 0\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\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(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n return this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n const placeholder = this.placeholders[folderId];\n if(placeholder) {\n placeholder.remove();\n }\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.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n //selectTab(0);\n simulateClickEvent(this.folders.menu.firstElementChild as HTMLElement);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number, orderIndex: MyDialogFilter['orderIndex']) {\n this.indexKey = getDialogIndexKey(orderIndex);\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId);\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private 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(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', async(userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && peerId !== rootScope.myId && !(await this.managers.appUsersManager.isBot(userId))) {\n const user = await this.managers.appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = await this.managers.appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setLastMessageN({\n dialog, \n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setUnreadMessagesN({dialog});\n this.validateDialogForFilter(dialog);\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.validateDialogForFilter(dialog);\n this.setUnreadMessagesN({dialog}); // возможно это не нужно, но нужно менять is-muted\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n appImManager.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\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 this.setDialogActive(element, true);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\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 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 simulateClickEvent(this.folders.menu.firstElementChild as HTMLElement);\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n return {\n indexKey: await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId), \n filter: await this.managers.filtersStorage.getFilter(filterId)\n };\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = indexKey;\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', async({peerId, typings}) => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\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 const loadDialogsPromise = this.onChatsScroll();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n const haveFilters = !!(state.filters && Object.keys(state.filters).length);\n const getDialogsFiltersPromise = haveFilters ? Promise.resolve(Object.values(state.filters).sort((a, b) => a.orderIndex - b.orderIndex)) : this.managers.filtersStorage.getDialogFilters();\n const renderFiltersPromise = getDialogsFiltersPromise.then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(haveFilters) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await loadDialogsPromise).renderPromise;\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 private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\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) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessageN({\n dialog,\n dom,\n setUnread: true\n });\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n return this.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n if(filterId === 0) {\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 unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n unreadSpan.innerText = unreadCount ? '' + unreadCount : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog) {\n if(\n !dialog || \n (this.filterId > 1 ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id)\n // (filter && !(await this.managers.filtersStorage.testDialogForFilter(dialog, filter)))\n ) {\n return false;\n }\n\n return true;\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.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n this.managers,\n list, \n getDialogIndexKey(filter.orderIndex),\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\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 private addFilter(filter: Pick) {\n if(filter.id === 1) {\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.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\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 === 0) 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 positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter);\n\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.orderIndex);\n\n this.setListClickListener(ul, null, true);\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 if(!this.showFiltersPromise) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\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 resolve();\n }, 0);\n });\n }\n\n return this.showFiltersPromise;\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scroll.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const {chatList, filterId, indexKey} = this;\n \n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\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 //let offset = storage[storage.length - 1]?.index || 0;\n \n let placeholder = this.placeholders[filterId];\n try {\n const getConversationsResult = this.managers.acknowledged.appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(\n !chatList.childElementCount && \n !placeholder && \n (\n !this.loadedDialogsAtLeastOnce || \n !(await getConversationsResult).cached\n )\n ) {\n placeholder = this.placeholders[filterId] = new DialogsPlaceholder();\n const getRectFrom = filterId === 1 ? this.chatsContainer : this.folders.container;\n placeholder.attach({\n container: chatList.parentElement, \n getRectFrom, \n onRemove: () => {\n delete this.placeholders[filterId];\n },\n blockScrollable: this.scroll\n });\n\n cachedInfoPromise.resolve(false);\n }\n \n const a = await getConversationsResult;\n const result = await a.result;\n if(this.loadDialogsRenderPromise !== renderPromise) {\n reject();\n cachedInfoPromise.reject();\n return;\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.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n // const isBuggedDialog = !this.managers.appMessagesManager.getDialogOnly(dialog.peerId);\n // if(isBuggedDialog) {\n // return;\n // }\n\n const element = this.sortedList.add(dialog.peerId, true, /* undefined, false, */cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n loadPromises.push(fastRafPromise()); // it is needed here\n await Promise.all(loadPromises).finally();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n reject();\n cachedInfoPromise.reject();\n return;\n }\n\n callbacks.forEach((callback) => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, indexKey);\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n \n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n return this.loadDialogsPromise = cachedInfoPromise.then((cached) => ({\n cached,\n renderPromise\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 === 1) {\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.scroll.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 appSidebarLeft.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(this.filterId));\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 if(this.updateContactsLengthPromise) return this.updateContactsLengthPromise;\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.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) 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: 42, \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 arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = 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 return await this.managers.appPeersManager.isContact(peerId) && !(await this.managers.appMessagesManager.getDialogOnly(peerId));\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.chatList.childElementCount || this.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\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.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.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\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.scroll.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 private async setOffsets() {\n const chatList = this.chatList;\n const firstDialog = await this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = await this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return this.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n }\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\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\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(elem) {\n if(onFound) onFound();\n\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\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(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', this.managers.appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\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: {\n dialog: Dialog, \n lastMessage?: Message.message | Message.messageService, \n dom?: DialogDom, \n highlightWord?: string, \n isBatch?: boolean,\n setUnread?: boolean\n }) {\n const promise = this.setLastMessage(options.dialog, options.lastMessage, options.dom, options.highlightWord, options.isBatch, options.setUnread);\n return promise.catch(noop);\n }\n\n private async setLastMessage(\n dialog: Dialog, \n lastMessage: Message.message | Message.messageService, \n dom: DialogDom, \n highlightWord?: string, \n isBatch = false,\n setUnread = false\n ) {\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n return;\n }\n }\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft?._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n\n lastMessage = dialog.topMessage;\n if(!lastMessage || lastMessage.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n if(setUnread) {\n this.setUnreadMessagesN({dialog, dom, isBatch, setLastMessagePromise: promise});\n }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.textContent = '';\n dom.lastTimeSpan.textContent = '';\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const peerId = dialog.peerId;\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 bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n willPrepend.unshift(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const senderBold = document.createElement('b');\n\n if(lastMessage.fromId === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n willPrepend.unshift(senderBold);\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 senderBold.prepend(element);\n return senderBold;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n senderBold.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(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply(draftMessage));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, 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\n promise.resolve();\n }\n\n private setUnreadMessagesN(options: {\n dialog: Dialog,\n dom?: DialogDom,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n return this.setUnreadMessages(options.dialog, options.dom, options.isBatch, options.setLastMessagePromise).catch(() => {});\n }\n\n private async setUnreadMessages(\n dialog: Dialog, \n dom = this.getDialogDom(dialog.peerId), \n isBatch = false,\n setLastMessagePromise?: Promise\n ) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const isMuted = await middleware(this.managers.appNotificationsManager.isPeerLocalMuted(dialog.peerId, true));\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = await middleware(this.managers.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message));\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n const filter = await middleware(this.managers.filtersStorage.getFilter(this.filterId));\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = await middleware(this.managers.appMessagesManager.isDialogUnread(dialog));\n const hasUnreadBadge = isPinned || 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 : 200;\n\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, transitionDuration);\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\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 {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n deferred.resolve();\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private async getDialog(dialog: Dialog | PeerId) {\n if(typeof(dialog) !== 'object') {\n const 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 return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n private 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(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\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 promise = this.getDialog(options.peerId).then((dialog) => {\n const {peerId} = dialog;\n const promises: Promise[] = [];\n if(!peerId.isUser()) {\n promises.push(this.processDialogForCallStatus(dialog, ret.dom));\n }\n\n if(peerId !== rootScope.myId && peerId.isUser()) {\n promises.push(this.managers.appUsersManager.getUser(peerId).then((user) => {\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n \n promises.push(this.setLastMessageN({\n dialog,\n dom: ret.dom,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n if(options.loadPromises) {\n options.loadPromises.push(promise);\n }\n }\n\n return ret;\n }\n\n private async processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n \n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\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.setLastMessage({_: 'dialog', peerId} as any, message, ret.dom, query);\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: {\n peerId: Parameters[0],\n container?: Parameters[1],\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string\n }) {\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);\n }\n\n public addDialog(\n peerId: PeerId, \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string\n ) {\n // const dialog = await this.getDialog(_dialog);\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n if(loadPromises) {\n loadPromises.push(peerTitlePromise);\n }\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\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 = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n\n const li = document.createElement(DIALOG_LIST_ELEMENT_TAG);\n li.classList.add('chatlist-chat');\n if(!autonomous) (li as HTMLAnchorElement).href = '#' + peerId;\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\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 unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n } \n \n return {dom};\n }\n\n public async setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessageN({\n dialog, \n lastMessage: null, \n dom,\n setUnread: null\n });\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\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}])}));"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","CodeInputField","constructor","super","plainText","input","this","type","autocomplete","lastLength","addEventListener","e","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","PasswordMonkey","passwordInputField","size","needFrame","container","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","TrackingMonkey","inputField","max","playAnimation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","Promise","all","PasswordInputField","onVisibilityClick","toggleVisible","toggle","name","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","resolve","onEnd","attachListenerTo","querySelector","handler","r","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","elapsedTime","cb","delay","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","isRippleUnneeded","target","includes","tagName","touchEnd","touches","once","cancelBubble","stopPropagation","passive","dataset","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","cleanSearchText","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","toLowerCase","fixCyrillic","htmlToSpan","span","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","SearchGroup","clearable","clickable","autonomous","onFound","list","nameEl","clear","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","i","messages","setVirtualContainer","onChange","reset","searchMore","onScrolledBottom","trim","peerId","beginSearch","focus","maxId","inputFilter","_","limit","res","count","history","mid","shift","searchGroup","forEach","message","fromId","avatarSize","meAsSaved","err","console","error","replaceContent","catch","InputSearch","placeholder","prevValue","timeout","onInput","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","SliderSuperTab","slider","destroyable","_constructor","header","closeBtn","title","content","addTab","listenerSetter","close","closeTab","open","args","init","result","selectTab","onCloseAfterTimeout","tabs","delete","destroy","removeAll","setTitle","key","SliderSuperTabEventable","eventListener","dispatchEvent","cleanup","SidebarSlider","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","navigationType","id","animate","isNavigation","closingId","pop","onCloseTab","tab","_selectTab","safeAssign","Map","tabsContainer","sidebarEl","Array","from","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","onPop","canAnimate","push","removeTabFromHistory","indexOfAndSplice","sliceTabsUntilTab","tabConstructor","preserveTab","getTab","find","t","isTabExists","onClose","TRANSITION_TIME","createTab","ctor","doNotAppend","managers","AvatarEdit","getContext","clearRect","months","days","ONE_DAY","getWeekNumber","date","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToTodayNew","time","today","timestamp","hour","minute","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","textTransform","formatFullSentTime","fragment","createDocumentFragment","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","dates","q","indexOf","setFullYear","setHours","minDate","maxDate","dayOfWeek","c","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","getUserStatusString","user","pFlags","bot","support","status","was_online","diff","AppNewGroupTab","uploadAvatar","isGeoChat","avatarEdit","_upload","section","SettingSection","inputWrapper","groupNameInputField","label","maxLength","groupLocationInputField","canBeEdited","valueCheck","userLocationCoords","userLocationAddress","nextBtn","appChatsManager","createChannel","about","geo_point","address","megagroup","chatId","inputFile","editPhoto","peerIds","inviteToChannel","createChat","map","toUserId","toPeerId","chatsSection","nameArgs","new","startLocating","userId","dom","rippleEnabled","lastMessageSpan","appUsersManager","getUser","navigator","geolocation","getCurrentPosition","location","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","set","change","visible","item","getVisible","clearVisible","isVisible","disconnect","refresh","targets","keys","observe","refreshVisible","unobserve","unlock","unlockAndRefresh","lock","findAndSpliceAll","array","verify","out","idx","findIndex","splice","LazyLoadQueueIntersector","parallelLimit","queue","inProcess","Set","intersector","loadItem","addElement","method","setProcessQueueTimeout","intersectorTimeout","processQueue","unshift","LazyLoadQueue","wasSeen","getItem","findAndSplice","processItem","hasOwnProperty","choosePhotoSize","photo","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","sizes","thumbs","concat","w","h","photoSize","calcImageInBox","accumulate","arr","initialValue","reduce","acc","Layouter","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","static","ratio","join","cropRatios","clamp","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","optimalCounts","optimalHeights","rowCount","index","row","colCount","lineHeight","col","prepareAlbum","widthItem","heightItem","children","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","loadedURLs","url","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","useCache","isImage","loader","Image","renderImageFromUrlPromise","renderImageWithFadeIn","image","needFadeIn","aspecter","thumbImage","SetTransition","forwards","onTransitionEnd","useRafs","cancelAnimationFrame","afterTimeout","ProgressivePreloader","tempId","detached","isUpload","cancelable","streamable","tryAgainOnFail","attachMethod","onClick","cancelEvent","preloader","loadFunc","cancel","constructContainer","color","bold","constructDownloadIcon","construct","totalLength","downloadSvg","cancelSvg","previousElementSibling","circle","firstElementChild","setDownloadFunction","func","setManual","setProgress","attachPromise","notify","notifyAll","detach","attach","addNotifyListener","details","percents","done","total","isInDOM","getTotalLength","strokeDasharray","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","results","reject","f","start","performance","possiblePromise","process","apply","context","realResult","timedChunk","finally","requireBlurPromise","fastBlurFunc","processBlurNext","img","radius","iterations","ctx","alpha","filter","drawImage","m","default","cache","dataUri","cached","onload","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewURLFromBytes","bytes","isSticker","mimeType","Uint8Array","IS_SAFARI","btoa","String","fromCharCode","bytesToDataURL","getPreviewURLFromThumb","thumb","getImageFromStrippedThumb","useBlur","getStrippedThumbIfNeeded","cacheContext","ignoreCache","downloaded","setAttachmentSize","noZoom","_isWebDocument","isWebDocument","isDocument","boxSize","aspect","isFit","aspectCovered","reply_to_mid","media","webpage","replies","comments","channel_id","toChatId","wrapPhoto","withTail","isOut","lazyLoadQueue","middleware","withoutPreloader","loadPromises","autoDownloadSize","noBlur","noThumb","noFadeIn","blurAfter","isWebDoc","full","images","noAutoDownload","mediaSizes","loadThumbPromise","isGif","mime_type","thumbsStorage","getCacheContext","gotThumb","uploadingFileName","appDownloadManager","renderOnLoad","onLoad","toDataURL","canAttachPreloader","haveToDownload","queueId","onlyCache","getDownloadPromise","renderPromise","download","render","createVideo","video","pip","disablePictureInPicture","toHHMMSS","str","leadZero","sec_num","hours","floor","minutes","seconds","FontFamily","getTextWidth","font","measureText","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","sizeType","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","capture","MiddleEllipsisElement","HTMLElement","connectedCallback","disconnectedCallback","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","formatBytes","decimals","dm","log","parseFloat","pow","toFixed","attachGrabListeners","onStart","onMove","onMouseMove","event","pageX","pageY","onMouseUp","onMouseDown","onTouchMove","preventDefault","isTouch","onTouchEnd","onTouchStart","customElements","define","RangeSelector","mousedown","events","withTransition","useTransform","vertical","scrub","seek","setFilled","onScrub","filled","step","stepStr","setHandlers","setListeners","_removeListeners","addProgress","transform","rectMax","offsetAxisValue","bottom","removeListeners","MediaProgressLine","progressRAF","onLoadedData","onEnded","onPlay","paused","setLoadProgress","onTimeUpdate","onProgress","setMedia","filledLoad","currentTime","wasPlaying","setSeekMax","scrubTime","appMediaPlaybackController","buf","buffered","numRanges","nearestStart","end","getMessageSenderPeerIdOrName","fromName","fwd_from","from_name","weakMap","WeakMap","peerTitle","update","PeerTitle","onlyFirstName","dialog","setOptions","limitSymbols","setInnerHTML","wrapEmojiText","getPeerTitle","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","constructDownloadPreloader","mids","attr","findMediaTargets","anchor","anchorMid","prev","next","isBubbles","findUpClassName","justAudioSelector","selectors","prefix","s","selector","elements","mediaItems","reverse","AudioElement","withTime","voiceAsMusic","showSender","doc","getMediaFromMessage","isRealVoice","isVoice","isOutgoing","is_outgoing","durationStr","downloadDiv","media_unread","onTypeLoad","audioEl","waveform","attributes","attribute","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","createElementNS","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","progress","audio","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","wrapVoiceMessage","descriptionEl","audioAttribute","parts","performer","titleEl","middleEllipsisEl","file_name","subtitleDiv","launched","progressLine","supportsStreaming","lastChild","replaceWith","wrapAudio","audioTimeDiv","autoload","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","togglePlay","hadSearchContext","searchContext","useSearch","imgs","wrapped","autoDownload","shouldPlay","is_scheduled","onDownloadInit","pauseListener","deferred","Error","playListener","roundVideoCircumference","wrapVideo","noInfo","group","onlyPreview","noPlayButton","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","muted","divRound","halfSize","strokeWidth","PI","strokeDashoffset","globalVideo","onPaused","onFrame","throttle","foreignObject","getAttributeNS","uploadFileName","renderDeferred","code","isFulfilled","onMediaLoad","animationIntersector","loadPhotoThumbFunc","apiFileManager","downloadMediaURL","wrapAlbum","attachmentDiv","uploading","chat","thumbPromise","to","wrapDocument","audioElement","extSplitted","split","ext","isArray","docDiv","docId","icoDiv","hadContext","fileName","wrapPlainText","descriptionParts","nameDiv","_downloadDiv","save","isTrusted","appDocsManager","getDoc","canOpenAfter","downloadFileName","getDownloadMediaDetails","isDownloading","uploadPromise","savingLottiePreview","saveLottiePreview","toneIndex","saving","toBlob","blob","wrapStickerAnimation","side","skipRatio","animationDiv","stickerPromise","withThumb","assumeType","frameNo","maxFrame","onScroll","vibrate","generateRandomSigned","random","randomOffsetX","randomOffsetY","stableOffsetX","setPosition","right","onlyThumb","emoji","needUpscale","asStatic","stickerType","sticker","lottieLoader","isAnimated","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","path","num","getPathFromBytes","ns","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","animationData","data","a","v","sendInteractionThrottled","appStickersManager","preloadAnimatedEmojiStickerAnimation","getAnimatedEmojiSoundDocument","restart","isUser","getAnimatedEmojiSticker","bubble","appMessagesManager","setTyping","msg_id","getServerMessageId","emoticon","interaction","JSON","stringify","isSavingLottiePreview","EditPeer","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","updateWithOptions","doNotEditAvatar","lockWithPromise","unlockOnSuccess","RadioForm","radios","form","checked","Row","freezed","radioField","checkboxField","subtitle","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","titleRightSecondary","noWrap","titleRightEl","navigationTab","createMedia","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","position","body","select","execCommand","removeChild","fallbackCopyTextToClipboard","RadioField","alignRight","stateKey","state","getDeepProperty","main","langKey","Event","bubbles","toastEl","toast","toastNew","langPackKey","langPackArguments","isUsernameValid","username","test","UsernameInputField","checkUsernameDebounced","debounce","checkUsername","bind","getValue","originalValue","setState","I","setError","invalidText","head","checkUsernamePromise","available","availableText","takenText","isValidToChange","PopupPeer","overlayClosable","buttons","avatarEl","AvatarElement","isDialog","noTitle","titleLangArgs","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","original","nextElementSibling","AppChatTypeTab","isBroadcast","privateRow","publicRow","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","toggleDisability","appProfileManager","getChatInviteLink","show","caption","noDelimiter","linkInputField","applyBtn","migrateChat","channelId","updateUsername","setOriginalValue","toggleNoForwards","onChatUpdate","noforwards","ScrollableLoader","loading","loaded","getPromise","checkForTriggers","windowSize","visualViewport","innerWidth","innerHeight","filterAsync","Boolean","numberThousandSplitter","toString","getChatMembersString","getCachedFullChat","participants_count","participants","broadcast","AppSelectPeers","chatsContainer","selected","folderId","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","cachedContacts","getMoreResults","renderResultsFunc","renderResults","splitUp","notRendered","has","filterPeerTypeBy","isPeerId","appPeersManager","getPeer","deleted","innerContainer","topContainer","selectedContainer","selectedScrollable","li","sectionNameLangPackKey","noShadow","findUpAttribute","checkbox","debouncedInput","generateDelimiter","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","dialogs","archived","pageCount","getConversations","newOffsetIndex","getDialogIndex","chatRightsAction","filterByRights","isEnd","contacts","getMoreContacts","peer","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","filterUnique","getMoreChannelParticipants","channelParticipants","getChannelParticipants","participant","getParticipantPeerId","isNonContactUser","containerEl","subtitleEl","isAnyChat","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","getSelected","addInitial","values","forceDirection","PopupPickUser","closable","onSelect","hide","peerTypes","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","takeOut","deepEqual","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","copy","defaultRights","combineParticipantBannedRights","restrictionText","info","mainFlag","restriction","until_date","flag","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","DIALOG_LIST_ELEMENT_TAG","setSubtitle","bannedRights","cantWhat","getPeerId","listEl","setLength","exceptionsCount","setLoader","isChannel","migrateFrom","migrateTo","PopupDeleteDialog","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","isDanger","textArgs","AppChatReactionsTab","availableReactions","appReactionsManager","getActiveAvailableReactions","getChatFull","originalReactions","available_reactions","enabledReactions","toggleSection","toggleCheckboxField","toggleRow","reactionsSection","checkboxFields","availableReaction","reaction","saveReactionsDebounced","wrapStickerToRow","static_icon","every","saveReactions","newReactions","sort","setChatAvailableReactions","AppEditChatTab","_init","chatUpdateListeners","addChatUpdateListener","canChangeType","canChangePermissions","chatNameInputField","descriptionInputField","editPeer","chatTypeRow","setChatTypeSubtitle","reactionsRow","setReactionsLength","availableReactionsLength","getAvailableReactions","inactive","reactions","permissionsRow","setPermissionsLength","getChatTyped","editTitle","editAbout","race","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","formatUserPhone","phone","formatPhoneNumber","formatted","AppEditContactTab","isNew","isContact","nameInputField","lastNameInputField","setDraftValue","first_name","last_name","notificationsCheckboxField","togglePeerMute","enabled","appNotificationsManager","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","AppAddMembersTab","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","generateFakeIcon","isScam","generateTitleIcons","verified","use","use2","generateVerifiedIcon","fake","scam","DialogColorsFg","DialogColors","DialogColorsMap","getPeerColorById","pic","getAbbreviation","onlyFirst","splitted","last","putAvatar","renderThumbPromise","isFullLoaded","stripped_thumb","putPhoto","isBig","myId","getPeerPhoto","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","abbr","getPeerInitials","ContextMenuController","openedMenu","diffX","diffY","closeBtnMenu","menuOverlay","openedMenuOnClose","IS_MOBILE_SAFARI","isOpened","openBtnMenu","menuElement","getEvent","attachGlobalListenerTo","RESET_GLOBAL","SwipeHandler","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","setProperty","onFirstSwipe","onSwipeResult","onSwipe","setCursor","PeerProfileAvatars","photoId","avatar","BASE_CLASS","avatars","appPhotosManager","getPhoto","action","draggable","loadCallback","intersectionObserver","loadCallbacks","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","SWITCH_ZONE","freeze","listLoader","previous","current","prevTargets","nextTargets","openAvatarViewer","toRight","offsetLeft","go","cancelNextClick","lastDiffX","minX","swipeHandler","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","loadCount","loadMore","older","getUserPhotos","photos","getSearch","Number","MAX_SAFE_INTEGER","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","onJump","activeTab","photo_id","wrapPeerTitle","setText","PeerProfile","setPeerStatus","needClear","attachClickEvent","bio","getProfileByPeerId","notifications","setMoreDetails","fillUsername","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","cleanupHTML","clearSetMoreDetailsTimeout","canBeDetailed","oldAvatars","getPeerUsername","fillNotifications","fillRows","icons","fillProfileElements","cleaned","_setMoreDetails","peerFull","wrapRichText","exportedInvite","setMoreDetailsTimeout","override","isRestricted","acknowledged","setPromise","clearInterval","historiesStorage","AppSharedMediaTab","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","profile","onAdditionalScroll","searchSuper","nav","setIsSharedMedia","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","renderNewMessages","msgs","deleteDeletedMessages","AppSearchSuper","mediaTabs","onChangeTab","mediaTab","btnAddMembers","scrollStartCallback","showConfirmation","b","onError","addChatUser","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","setLoadMutex","loadMutex","peerChanged","setQuery","historyStorage","loadSidebarMedia","single","justLoad","RIGHT_COLUMN_ACTIVE_CLASSNAME","appSidebarRight","getElementById","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","proportion","scrollWidth","documentElement","enable","active","willChange","animationPromise","AppPollResultsTab","resultsDiv","poll","appPollsManager","getPoll","quiz","question","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","getVotes","option","votesList","votes","vote","user_id","showMore","next_offset","down","CLASS_NAME","StackedAvatars","avatarContainer","AVATAR_CLASS_NAME","updateOptions","parentNode","lineTotalLength","minIndex","minRemainder","remainder","maxRemainder","pollElement","isClosed","closed","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","period","closeTime","quizInterval","timeLeft","stroke","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","textEl","entities","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","setResults","recent_voters","stackedAvatars","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","times","votersCount","DivAndCaption","fill","border","htmlToDocumentFragment","DocumentFragment","template","platforms","ignore","getRestrictionReason","reasons","reason","platform","escapeRegExp","isMessageRestricted","restriction_reason","CALL_DURATION_LANG_KEYS","formatCallDuration","plain","showLast","modulus","formatDuration","strings","paymentsWrapCurrencyAmount","amount","currency","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","n","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","symbol","space_between","symbol_left","splitter","wrapJoinVoiceChatAnchor","onclick","wrapUrl","call","access_hash","href","wrapLinkToMessage","savedFrom","dir","wrapMessageForReply","wrapMessageActionTextNew","unsafeMessage","noLinebreaks","getNameDivHTML","endsWith","post","users","schedule_date","daysToStart","tomorrowDate","pinnedMessage","getMessageByPeer","fetchMessageReplyTo","joined","anchorHTML","domain","total_amount","invoiceMessage","reply_to","reply_to_peer_id","langPack","waited","wrapMessageActionTextNewUnsafe","usingMids","highlightWord","withoutMediaType","hasAlbumKey","addPart","part","totalEntities","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","game","stickerEmojiRaw","actionWrapped","match","found","regExp","sortEntities","messageWrapped","noLinks","noTextFormat","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","isRound","mediaChildren","CHAT_ANIMATION_GROUP","child","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","fillPromise","hex","g","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","animated","videos","URL","createObjectURL","getStickerSet","stickerSet","documents","previousMedia","_size","positionElementByIndex","pos","prevPos","whichChild","SortedList","updateElementWith","updateListWith","sorted","clean","_updateList","onSort","updateList","canUpdate","getAll","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","insertInDescendSortedArray","SortedUserList","getUserStatusForSort","onListLengthChange","willChangeLength","createChatListOptions","doTimeout","good","SORT_INTERVAL","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","removeManual","IS_APPLE","onCancel","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","ButtonMenuItem","noCheckboxClickListener","textElement","regularText","keepOpen","menu","PopupForward","peerIdMids","overrideOnSelect","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","_hasRights","canRevoke","PopupSendNow","sendScheduledMessages","cancelSelection","getSelection","empty","removeAllRanges","accumulateMapSet","AppSelection","selectedMids","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","getElementFromTarget","verifyMouseMoveTarget","listenElement","documentListenerOptions","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","attachListeners","selectedText","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","toggleElementCheckbox","hasCheckbox","getCheckboxInputFromElement","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","isScheduled","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","lastMsgId","obj","fromPeerId","isPrivate","transitionElement","opacity","ChatSelection","recording","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","skippedMids","isGrouped","groupedCheckboxInput","wrapWebPageDescription","webPage","shortDescriptionText","wrapWebPageTitle","shortTitle","author","site_name","positionMenu","additionalPadding","getScrollWidthFromElement","menuWidth","scrollHeight","menuHeight","windowWidth","windowHeight","paddingTop","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","intermediateX","intermediateY","possibleSides","SearchContextMenu","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","withSelection","canForward","canDeleteMessage","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","searchContextMenu","navScrollable","tabsMenu","menuTab","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","skipScroll","startCallback","newMediaTab","fromMediaTab","offsetTop","rect2","onMediaClick","targetClassName","warn","AppMediaViewer","setSearchContext","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","filterMessagesByInputFilter","processEmptyFilter","setLastMessagePromise","lastMessage","processPhotoVideoFilter","processDocumentFilter","processUrlFilter","entity","display_url","sliced","matchUrl","same","hostname","hash","previewDiv","subtitleFragment","HTMLAnchorElement","decodeURIComponent","firstChild","elemsToAppend","sharedMediaDiv","processCallback","awaited","monthContainer","getMonthContainerByTimestamp","afterPerforming","loadChats","inputMessagesFilterEmpty","showMembersCount","titleSpan","arg","globalContacts","intlElement","isShort","renderRecentSearch","recent","recentSearch","getTopPeers","peers","people","loadMembers","renderParticipants","membersList","LOAD_COUNT","loadType","used","slicedLength","ids","notFilteredMessages","nextRate","next_rate","loadFirstTime","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","loadFirstTimePromise","toLoad","dateTimestamp","containers","dateElement","haveTimestamps","getObjectKeysAndSort","goFirst","revokeObjectURL","newInputFilter","ButtonMenuToggleHandler","btnMenu","getPrivacyRulesDetails","rules","types","allowPeers","chats","disallowPeers","rule","PrivacyType","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","appPrivacyManager","getPrivacy","inputKey","setRadio","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","anchorCopy","phoneSection","sCaption","wrapStickerEmoji","AppTwoStepVerificationSetTab","captionOld","stickerContainer","inputContent","btnReturn","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","matchEmail","E","onContinueClick","btnContinue","btnSkip","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","has_password","labelText","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","country","date_active","date_created","midtitle","device_model","system_version","authorizations","session","btnTerminate","apiManager","invokeApi","otherSection","onTerminateClick","AppBlockedUsersTab","btnAdd","toggleBlock","blocked","getBlocked","convertKeyToInputKey","toUpperCase","confirmationPopup","cancelButton","AppPrivacyAndSecurityTab","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","settings","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","appDraftsManager","clearAllDrafts","payment","clearButton","appPaymentsManager","clearSavedInfo","auths","averageColorFromCanvas","pixel","pixels","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","onWheel","_animatingToNextPosition","_scrollDelta","deltaY","_onWheelRAF","drawOnWheel","changeTail","curPos","curPosition","_phase","_tail","drawGradient","drawNextPositionAnimated","frames","_frames","drawImageData","leftLength","_incrementalCurve","hexToRgb","getPositions","positions","getNextPositions","phase","curveMax","curve","distances","nextPos","tail","getGradientImageData","_hctx","createImageData","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","colors","getAttribute","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","curves","scrollAnimate","_addedScrollListener","createCanvas","gradientRenderer","ColorPicker","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","appStateManager","pushToState","onColorChange","applyColor","themeController","gridSection","grid","backgroundColor","isColored","scaleMediaElement","mediaSize","aspectFitted","quality","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","file","files","click","requestFile","naturalWidth","naturalHeight","File","wallPaper","prepareWallPaperUpload","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","blur","onGridClick","wallpaper","saveToCache","_tempId","onReady","getPixelPromise","imageUrl","averageColor","create","getColorsFromWallPaper","getWallPaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","getWallPapers","wallPapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","ANIMATION_GROUP","PopupStickers","stickerSetInput","onStickersClick","fileId","stickersDiv","stickersFooter","btn","loadStickerSet","installed_date","toggleStickerSet","divs","AppQuickReactionTab","getQuickReaction","quickReaction","setDefaultReaction","RangeSettingSelector","minValue","writeValue","valueDiv","valueContainer","range","AppGeneralSettingsTab","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","eachMinute","toLocaleTimeString","suggestCheckboxField","bigCheckboxField","renderQuickReaction","loopCheckboxField","stickerSets","stickersContent","renderStickerSet","getAllStickers","allStickers","sets","AppEditProfileTab","appConfig","getAppConfig","firstNameInputField","bioInputField","about_length_limit_premium","about_length_limit_default","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","userFull","getProfile","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","forEachReverse","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","originalFilter","AppEditFolderTab","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","loadAnimationPromise","player","onCreateOpen","onEditOpen","documentFragmentToHTML","wrapDraftText","ul","ignoreClick","hasPeer","getDialogOnly","renderMore","_length","exclude_peers","AppChatFoldersTab","filtersRendered","renderFolder","dialogFilter","Object","folder","channels","isAnyGroup","filterId","getFilter","orderIndex","createFolderBtn","foldersSection","suggestedSection","dialog_filters_limit_premium","dialog_filters_limit_default","onFiltersContainerUpdate","getSuggestedFilters","order","getSuggestedDialogsFilters","suggestedFilters","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","invokeApiCacheable","lang_pack","languages1","languages2","rendered","webLangCodes","language","lang_code","native_name","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","setByKey","MIN","MAX_RANGE","MAX","upTo","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","onDisabledChange","gifsCheckboxField","videosCheckboxField","peerKeys","enabledKeys","isAll","logOut","edit","changeAvatarBtn","upload","updateChangeAvatarBtn","buttonsDiv","devicesRow","languageRow","buttonsSection","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","PopupCreateContact","withConfirm","btnConfirm","importContact","telInputField","validate","country_code","AppContactsTab","inputSearch","openContacts","sortedUserList","createList","IS_MOBILE","renderPage","AppArchivedTab","wasFilterId","chatList","AppPeopleNearbyTab","isLocationWatched","parseDistance","retryBtn","latestLocationSaved","accuracy","getLocated","updates","orderedPeers","groupsCounter","usersCounter","peopleSection","locatedPeers","sortedList","errorCategory","startWatching","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","formatNumber","LEFT_COLUMN_ACTIVE_CLASSNAME","fakeGradientDelimiter","captionArgs","delimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","filteredButtons","sessionStorage","kz_version","toolsBtn","btnMenuFooter","rel","newBtnMenu","updateBtn","reload","initSearch","archivedCount","unreadPeerIds","navigationItem","noHistory","checkUpdateInterval","ok","hasUpdate","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","BubbleGroup","createAvatar","avatarLoadPromise","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","sortGroupItemsKey","insertGroup","removeItem","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","siblings","getSiblingsAtIndex","modifiedGroups","previousSibling","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","bad","partition","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","viaBotId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","previousGroup","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","lines","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","addSentinel","sentinel","observeStickyHeaderChanges","headerSentinel","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","REACTIONS_ELEMENTS","ReactionsElement","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","availableReactionsResult","isReactionActive","some","totalReactions","can_see_list","reactionElementIdx","recent_reactions","handleChangedResults","childNodes","timeSpan","RepliesElement","updated","postKey","leftPart","recent_repliers","isUnread","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","reactionsElement","reactionsMessage","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","pinned","inner","clonedArgs","_reactionsElement","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalPeerTitle","titlePeerId","originalMessage","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","elementFromPoint","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","overflow","horizontal","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ScrollSaver","getSaved","clientHeight","findElements","containerRect","elementRect","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","setScrollTopSilently","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","callbacks","toggleObservingNew","isMentionUnread","mentioned","middlewarePromise","throwWhat","getEmojiEntityFromEmoji","unicode","appendEmoji","unify","spanEmoji","kek","wrapSingleEmoji","fixEmoji","getEmojiFromElement","nodeType","nodeValue","EmojiTab","closeScrollTop","onContentClick","category","emojis","titleDiv","itemsDiv","unified","emojiScroll","appEmojiManager","getRecentEmojis","hasRecent","activeId","EmoticonsDropdown","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","LazyLoadQueueRepeat2","spliced","GifsMasonry","scrollPromise","processInvisibleDiv","processVisibleDiv","gifWidth","gifHeight","willUseWidth","GifsTab","gifsContainer","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","LazyLoadQueueRepeat","_queue","SuperStickerRenderer","regularLazyLoadQueue","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTab","categoriesMap","createCategory","_title","menuTabPadding","categoriesIntersector","categoryAppendStickers","isCategoryVisible","superStickerRenderer","setCategoryItemsHeight","containerWidth","stickerSize","itemsPerRow","menuWrapper","menuScroll","intersectionOptions","clearCategoryItems","recentCategory","toggleRecentCategory","clearRecentStickers","onRecentStickers","stickers","getRecentStickers","rendererLazyLoadQueue","resizeCategories","pushRecentSticker","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","search","gifsDiv","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","AppStickersTab","setsDiv","renderSet","countDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","covered","searchStickerSets","DropdownHover","forceClose","inited","onMouseOut","isActive","displayTimeout","toElement","willBeActive","dispatchResultableEvent","attachButtonListener","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendToPeer","canSendGifs","savedRange","getGoodRange","emojiTab","stickersTab","gifsTab","HIDE_EMOJI_TAB","IS_APPLE_MOBILE","INIT_TAB_ID","getElement","addLazyLoadQueueRepeat","getSavedRange","rangeCount","activeElement","getRangeAt","jumpedTo","stuck","which","axis","clearDraft","emoticonsDropdown","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","charCodeAt","buggedRegExp","getDistanceFromBuggedToNormal","char","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","source","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","iso2","IS_ANDROID","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","createVerificationIframe","iframe","allow","contentWindow","parse","PopupPaymentVerification","eventType","eventData","path_full","InputFieldCorrected","onKeyDown","lastKeyDown","deleting","lastTransformed","getPattern","pushRest","autocorrectComplete","selectionStart","selectionEnd","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","noPhoneCodes","onCountryChange","inputMode","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","placeCaretAtEnd","nextInputField","inputFieldsRow","billingSection","saveCheckboxField","need_country","need_zip","canSave","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","Authorization","publishable_key","params","expiration_month","expiration_year","security_code","Accept","public_token","btnConfirmOnEnter","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","invoice","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","selectCountryByIso2","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","PopupPayment","receiptPeerId","receiptMsgId","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","isReceipt","receipt_msg_id","itemEl","detailsClassName","photoEl","linesClassName","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","bot_id","wrapAmount","makeLabel","labelEl","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","HTMLInputElement","onSelectionChange","ignoreNextSelectionChange","onFocusOut","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","createRow","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","node","onContentUpdate","shipping","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueuePromise","messagesQueue","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","random_id","viewSponsoredMessage","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getMiddleware","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","appImManager","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","messageId","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","ignoreHeavyAnimation","scrollDimensions","sliceViewportDebounced","topbar","setCorrectIndexThrottled","lastScrollDirection","setStickyDateManually","distanceToEnd","getDistanceToEnd","setPeerPromise","requestHistory","setMessageId","constructBubbles","bubbleGroups","sequential","messagesStorageKey","newItem","_items","groupBubbles","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","contextMenu","highlightBubble","replyAfter","shouldReply","canSend","_target","initMessageReply","constructPeerHelpers","renderNewMessage","setUnreadCount","updateUnreadByDialog","finishPeerChange","postViewsElements","different","postViews","incrementMessageViews","createResizeObserver","resizeObserver","wasHeight","resizing","skip","scrolled","rAF","onResizeEnd","offsetHeight","isScrolledDown","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","overlayCounter","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","readMessages","readHistory","constructPinnedHelpers","constructScheduledHelpers","getScheduledMessagesStorage","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","setLoaded","onScrolledTop","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","permanent","ignoreOnScroll","emptyPlaceholderBubble","ignoreNextScrollEvent","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","_renderNewMessage","newMessage","replyTo","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","forceDuration","fallbackToElementStartWhenCentering","isChangingHeight","messageInput","margin","getNormalSize","dimensions","lastScrollPosition","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","cancelMeasure","samePeer","startParam","perf","bindPrefix","onChangePeer","topMessage","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","unread_count","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","unread_mark","markDialogUnread","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","historyMaxId","canWrite","renderMessagesQueue","setMessagesQueuePromise","renderQueue","renderQueuePromises","loadQueue","filterQueue","avatarPromises","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","local","updatePlaceholderPosition","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","unread","chat_id","is_single","messageMessage","messageMedia","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","forward","replyMarkup","reply_markup","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","popup","switchInlineQuery","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","processingWebPage","previewResizer","preview","quote","quoteTextDiv","strong","textDiv","isSquare","emojiSticker","animatedSticker","staticSticker","newNameContainer","getMidsByMid","wrapper","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","contactNumberDiv","phone_number","wrapPoll","isTest","priceEl","needName","titleVia","isHidden","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","getViewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","getHistory","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","generateMessageId","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","getOutputPeer","saveMessages","storage","extraSize","invisibleTop","invisibleBottom","foundVisible","visibleRect","minTop","maxBottom","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","_log","getSponsoredMessage","sponsoredMessages","messagePromise","processPromise","bot_info","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","silent","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","buttonsEl","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","btnClose","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","dialogSize","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTION_CLASS_NAME","REACTIONS_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","animationGroup","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","selectWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","onContextMenu","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","noForwards","viewerPeerId","canOpenReactedList","initResult","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","attachListenerSetter","closest","filterButtons","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","onMessageSent","canEditMessage","getMessageFromStorage","hasTarget","isGoodType","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","visibility","reactionsCount","fakeElem","readParticipants","isFull","totalSize","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","questionInputField","sendSilent","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","getRichValue","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","videoWidth","videoHeight","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","confirmShortcutIsSendShortcut","attachFile","willAttach","shouldCompress","itemDiv","attachMedia","attachDocument","sendFileDetails","config","getConfig","captionLengthMax","caption_length_max","mediaContainer","withLinebreaks","wasInputValue","messageInputField","attachFiles","appendDrops","appendGroupCheckboxField","groupCheckboxField","mediaCheckboxField","appendMediaCheckboxField","addFiles","toPush","_file","lastModified","isMedia","sendingParams","sendText","sendAlbum","assign","replyToMsgId","startsWith","objectURL","controls","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","isPhoto","isAudio","finish","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","albumContainer","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","AutocompleteHelper","hidden","onVisible","resetTarget","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","_onKeyDown","attachListNavigation","listType","noBlurOnPop","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","ready","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","alt","getRichElementValue","caretPos","combineSameEntities","EmojiHelper","chatInput","onEmojiSelected","scrollLeft","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","botInfo","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","helpers","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","separator","dcId","readBlobAsDataURL","dataURL","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","addedListener","InputFieldAnimated","inputFake","onFakeInput","setHeight","newHeight","currentHeight","transitionDuration","fromSet","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","shiftKey","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","draft","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","borderRadius","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","br","getNeededFakeContainer","hasMentions","unread_mentions_count","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","ctrlKey","metaKey","setStart","collapse","addRange","readAllHistory","commandsMap","italic","underline","strikethrough","monospace","spoiler","saveExecuted","executed","checkType","haveThisType","isCollapsed","tag","commonAncestorContainer","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","suffix","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","wrapSingleMessage","_message","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","VolumeSelector","onMuteClick","setVolume","volume","iconIndex","ICONS","ChatAudio","onPlaybackParams","playbackParams","fasterEl","playbackRate","repeatEl","onPause","toggleEl","onStop","onMediaPlay","isMusic","volumeSelector","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","cssText","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","getRow","animateFirst","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","debug","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","lastY","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ONE_HOUR","PopupMute","mutePeer","radioForm","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","audioAsset","getAudioConstraints","constraints","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","getScreenConstraints","skipAudio","frameRate","getScreenStream","screenStream","getDisplayMedia","getVideoTracks","contentHint","getStream","stream","getUserMedia","getTracks","getStreamCached","_cache","screen","isScreen","stopTrack","track","StringFromLineBuilder","newLine","word","addJoined","finalize","toTelegramSource","fromTelegramSource","fixMediaLineType","mediaType","getConnectionTypeForMediaType","generateMediaFirstLine","port","payloadIds","connectionType","SDPBuilder","addCandidate","foundation","component","protocol","priority","generation","performCandidate","addHeader","sId","bundleMids","bundle","addTransport","transport","skipCandidates","ufrag","pwd","fingerprint","fingerprints","setup","candidates","candidate","addSsrc","streamName","sourceGroups","addSource","ssrc","addMsid","ssrcGroup","sources","semantics","addSsrcEntry","isAnswer","isApplication","codec","isInactive","shouldBeSkipped","payloadTypes","hdrexts","hdrext","clockrate","parameters","fbs","fb","subtype","addConference","conference","sessionId","IS_FIREFOX","recvEntry","sendEntry","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","interval","getAmplitude","streamAnalyser","rms","analyse","amplitudes","ANALYSER_LISTENER","AudioContext","webkitAudioContext","outputStream","MediaStream","inputStream","canCreateConferenceEntry","addStream","addTrack","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","hasInputTrackKind","substring","replaceInputAudio","oldTrack","timer","appendToConference","transceiverInit","streams","tracks","findEntry","createEntry","transceiver","createTransceiver","connection","mediaTrackType","trackIdx","sender","replaceTrack","CallInstanceBase","fixSafariAudio","isSharingAudio","streamManager","isSharingVideo","requestAudioSource","requestInputSource","isAudioGood","isVideoGood","onInputStream","requestScreen","endpoint","onTrack","tryAddTrack","saveInputVideoStream","isOutput","isVideo","elementEndpoint","useStream","srcObject","sinkId","outputDeviceId","setSinkId","setMuted","getAudioTracks","isClosing","ConferenceEntry","originalDirection","setPort","setEndpoint","addTransceiver","setSource","generateSsrc","LocalConferenceDescription","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","setData","deleteEntry","setEntrySource","setEntryPeerId","findFreeSendRecvEntry","isSending","getEntryByMid","getEntryBySource","getEntriesByPeerId","generateSdp","fromConference","CallConnectionInstanceBase","createPeerConnection","RTCPeerConnection","signalingState","connectionState","iceConnectionState","createDataChannel","dict","dataChannel","channel","createDescription","appendStreamToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","SDP","mediaSections","parsed","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","mediaLineParts","SDPAttributeInner","missed","exists","rest","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","mediaLine","isReceiving","lookupAttributeKeys","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","parseMediaSectionInfo","sdp","clientInfo","telegramSourceGroups","sdpLines","parseSourceGroups","raw","GROUP_CALL_STATE","GroupCallConnectionInstance","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","groupCall","groupCallId","processedChannels","processed","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","appGroupCallsManager","joinGroupCall","connections","extmap","performExtmap","filterServerCodecs","isNewConnection","originalOffer","createOffer","iceRestart","offer","hasMunged","skipAddingMulticast","generator","originalSsrcs","ssrcs","ssrcs2","ssrcsStrLines","ssrc2","addSimulcast","localMLine","codecIds","newData","newChannel","mungedSdp","fixLocalOffer","setLocalDescription","entriesToDelete","answerDescription","iceGatheringState","setRemoteDescription","updateConstraints","getTransceivers","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","can_self_unmute","getCachedParticipants","isSharingScreen","presentation","pinSource","unpinSource","unpinAll","getParticipantByPeerId","toggleMuted","changeUserMuted","editParticipant","getVideoElementFromParticipantByType","source_groups","clone","createConnectionInstance","changeRaiseHand","raise","raiseHand","startScreenSharingInternal","connectionInstance","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","toggleScreenSharing","startVideoSharingInternal","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","stopVideoSharing","toggleVideoSharing","hangUp","discard","rejoin","isDiscarded","isUpdatingMeInCurrentCall","raise_hand_rating","audio_source","audioSource","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","makeSsrcFromParticipant","makeSsrcsFromParticipant","modifiedTypes","oldSsrc","oldSource","oldEntry","GroupCallsController","currentGroupCall","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","createMainStreamManager","joinGroupCallInternal","getGroupCallFull","getGroupCallParticipants","handleUpdateGroupCallParticipants","updatingSdp","groupCallsController","ChatTopbar","verifyButtons","isMenuOpen","btnMore","deleteButtonText","getDeleteButtonText","menuButtons","buttonsToVerify","verifyVideoChatButton","call_active","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","onResize","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","constructDiscussionHelpers","byCurrent","newAvatar","setTitleCallback","setStatusCallback","setTitleManual","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","instance","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","objectUrl","imageWidth","imageHeight","patternHeight","dpr","originalHeight","mask","globalCompositeOperation","centerY","topY","endY","bottomY","setCanvasDimensions","Chat","backgroundEl","Log","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","patternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","beforeDestroy","cleanupBackground","searchTab","_isAnyGroup","setAutoDownloadMedia","destroySharedMediaTab","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","setPrefix","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","getActiveMarkupButton","nodes","getSelectedNodes","currentMarkups","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","draw","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","createLinearGradient","addColorStop","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","customProperties","computedStyle","getProperty","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","withIcons","iconClassName","element2","actionClassName","GroupCallParticipantsList","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","ControlsHover","hideControls","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","canHideControls","showControls","toggleControls","ignoreClickClassName","relatedTarget","showOnLeaveToClassName","lockControls","callVideoCanvasBlur","renderFrame","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","setElementDisplay","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","isPinned","hasAnyVideo","participantElements","participantVideo","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","canManageCall","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","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","withoutOverlay","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","onScreenClick","btnScreen","onLeaveClick","onFullScreenChange","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","CALL_STATE","CallDescriptionElement","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","big","isPendingIncoming","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","isVertical","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","parseSignalingData","screencast","convertNumber","ssrcGroups","sourceGroup","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","feedbackTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","offerSent","initialSetup","sendCallSignalingData","CALL_REQUEST_TIMEOUT","CallsController","instances","sortedInstances","setPhoneCall","confirmCall","createCallInstance","admin_id","overrideConnectionState","setHangUpTimeout","encryptionKey","g_a","dh","g_a_or_b","g_a_hash","bytesCmp","key_fingerprint","appCallsManager","computeKey","joinCall","callId","onUpdatePhoneCallSignalingData","currentCall","getCallByUserId","CallInstance","hasConnected","clearHangUpTimeout","discardReason","hasCurrent","startCallInternal","fullInfo","participant_id","generateDh","requestCall","phoneCall","callsController","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","convertToUint8Array","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","stringBuilder","addExtmap","addPayloadTypes","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","userAgent","isSafari","j","fmtp","getOwnPropertyNames","pName","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","relAddress","tcpType","networkId","networkCost","generateOffer","generateAnswer","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","lowBattery","videoRotation","Proxy","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","sortIndex","wasStartingScreen","wasStartingVideo","isSharingVideoType","audioTrack","hangUpTimeout","canAccept","g_b","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","configuration","ipv6","urls","turn","stun","credential","p2p_allowed","getRtcConfiguration","sendIceCandidate","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","p2pParseCandidate","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","sdpDescription","videoTrack","onMutedChange","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","sendRecvEntry","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","TopbarCall","onState","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconEl","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","singleInstance","idle","toggleToggler","peerString","soundReset","unreadUnmutedPeerIds","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","isBlink","setFavicon","titleInterval","arc","fontSize","textBaseline","textAlign","fillText","prevFavicon","replaceChild","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","clipboardData","originalEvent","webkitGetAsEntry","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","onHashChange","saveState","parseUriParams","tgaddr","postId","openUsername","userName","setSettings","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","apiUpdatesManager","backgroundPromises","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typings","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","overrideHash","stateStorage","topbarCall","discardCurrentCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","makeLink","VOICE_CHAT","USER_PHONE_NUMBER","PRIVATE_POST","thread","comment","MESSAGE","attachKeydownListener","timeoutOperation","requests","request","isBad","activatingChat","IGNORE_KEYS","altKey","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","checkChatInvite","saveApiChat","resolvePhone","openUrl","wrappedUrl","noPathnameParams","pathname","noUriParams","openComment","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","prevTab","prevIdx","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","drop","transitionTime","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","dot","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","peerTitlePromise","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getUserStatus","ignoreSelf","getPeerStatus","useWhitespace","typingContainer","VideoPlayer","onPlaybackRackMenuToggle","onPip","onPipClose","playbackRateButton","skin","stylePlayer","setBtnMenuToggle","initDuration","buildControls","timeDuration","pipButton","fullScreenButton","timeElapsed","leftControls","requestPictureInPicture","debounceTime","debouncedPip","listener","pictureInPictureElement","toggleFullScreen","nextIdx","PLAYBACK_RATES","onFullScreen","setPlaybackRateIcon","pictureInPictureEnabled","rate","PLAYBACK_RATES_ICONS","webkitEnterFullscreen","enterFullscreen","AppMediaViewerBase","topButtons","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","classNames","ctrlKeyDown","changeZoom","onKeyUp","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","authorRight","zoom","onLoadedMore","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","zoomSwipeHandler","lastDiffY","btnMenuToggle","setMoverToTarget","appMediaViewer","removeGlobalListeners","toggleOverlay","toggleGlobalListeners","setGlobalListeners","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGForeignObjectElement","needOpacity","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","setAuthorInfo","wrapTitlePromise","oldAvatar","_openMedia","setAuthorPromise","setTargets","useContainerAsTarget","padding","windowH","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","otherMediaViewer","releaseSingleMedia","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","cancellablePromise","haveImage","captionTimeout","isForDocument","onAuthorClick","onEmptied","setCaptionTimeout","btnMenuForward","btnMenuDownload","btnMenuDelete","onCaptionClick","getScheduledMessageByPeer","setCaption","cantForwardMessage","cantDownloadMessage","AvatarListLoader","loadedAllUp","AppMediaViewerAvatar","onAvatarUpdate","getTarget","hadMessage","isObject","believeMe","addedToQueue","wasPeerId","newPeerId","DialogsContextMenu","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","SENDING_STATUS","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","rootScope","baseDcId","connectionStatus","setFirstConnectionTimeout","online","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","forceReconnectTimeout","setStateTimeout","statusContainer","easeInOutSine","roundRect","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","animations","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","shimmerColor","on","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","completed","elapsedRowTime","dialogHeight","createPattern","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","drawCircle","drawCircleFromStart","setPromiseMiddleware","oldPromise","SortedDialogList","indexKey","appDialogsManager","addListDialog","isBatch","AppDialogsManager","placeholders","sortedLists","scrollables","folders","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","onTabChange","loadDialogsRenderPromise","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","loadContacts","verifyPeerIdForContacts","processContact","added","setListClickListener","onChatsRegularScroll","sliceTimeout","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","getProxiedManagers","bottomPart","allChatsIntlElement","onStateLoaded","setFilterId","addFilter","foldersScrollable","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","getDialogIndexKey","getDialogIndexKeyByFilterId","setOnlineStatus","hasClassName","initListeners","getDialogDom","processDialogForCallStatus","setFilterUnreadCount","setLastMessageN","setUnread","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessagesN","setDialogActive","getCachedDialogs","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","haveFilters","renderFiltersPromise","showFiltersPromise","getNotifyPeerTypeSettings","fillConversations","getOffsetIndex","isDialogMustBeInViewport","migratedTo","testDialogForFilter","topOffset","bottomOffset","unreadSpan","unreadUnmutedCount","unreadCount","getFolderUnreadCount","generateScrollable","sortedDialogList","createChatList","clientWidth","wasShowing","cachedInfoPromise","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","cccc","offsetDialog","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","setLastMessage","draftMessage","lastTimeSpan","willPrepend","videoTypes","playIcon","senderBold","setUnreadMessages","wasMuted","setStatusMessage","hasUnreadBadge","disableAnimationIfRippleFound","setSendingStatus","statusSpan","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","isMention","getDialog","originalDialog","setCallStatus","START_X","wasMounted","itemProgress","groupCallActiveIcon","addDialogNew","call_not_empty","addDialogAndSetLastMessage","addDialog","captionDiv","titleSpanContainer","titleIconsPromise","titleP","rightSpan","oldTypingElement","newTypingElement","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","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function"],"sourceRoot":""} \ No newline at end of file diff --git a/public/21.8a1e14284789fc762941.bundle.js b/public/21.8a1e14284789fc762941.bundle.js new file mode 100644 index 000000000..6f075eb33 --- /dev/null +++ b/public/21.8a1e14284789fc762941.bundle.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[21],{4159:(d,e,u)=>{u.d(e,{Z:()=>r});const t="web.telegram.org",f={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.5.0",versionFull:"1.5.0 (216)",build:216,langPackVersion:"0.4.4",langPack:"macos",langPackCode:"en",domains:[t],baseDcId:2,isMainDomain:location.hostname===t,suffix:"K",cryptoWorkers:4};f.isMainDomain&&(f.id=2496,f.hash="8da85b0d5bfe62527e5b244c209159c3");const r=f},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"}]}},2219:(d,e,u)=>{u.d(e,{Z:()=>t});const t=Date.now()%Math.random()*1e8|0},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)},5659:(d,e,u)=>{function t(d){const e=document.createElement("script"),u=new Promise((d=>{e.onload=e.onerror=()=>{d(e)}}));return e.src=d,document.body.appendChild(e),u}u.d(e,{Z:()=>t})},5471:(d,e,u)=>{function t(d){return{type:d}}u.d(e,{Z:()=>t})},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)));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){for(const s in d)typeof e[s]!=typeof d[s]?(e[s]=(0,t.Z)(d[s]),u&&u(c||s)):(0,f.Z)(d[s])&&r(d[s],e[s],u,c||s)}},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}},3591:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(2423),f=u(6637);function r(d,e){let u,r,c,s;if((0,f.Z)(d)||(d="https://"+d),u=d.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=u[1],f=e.split("/");if(f[0]&&"$"===f[0][0]&&f[0].length>1)return s="invoice",{url:d,onclick:s};if(/^\W/.test(e)&&!t.kO.test(e))return s="joinchat",{url:d,onclick:s};switch(f[0]){case"joinchat":case"addstickers":case"voicechat":case"invoice":s=f[0];break;default:if(f[1]&&f[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===f.length){s="im";break}}}else(r=d.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?s="im":(c=d.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(s="tg_"+c[1]);return window[s]||(s=void 0),{url:d,onclick:s}}},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=21.8a1e14284789fc762941.bundle.js.map \ No newline at end of file diff --git a/public/21.8a1e14284789fc762941.bundle.js.map b/public/21.8a1e14284789fc762941.bundle.js.map new file mode 100644 index 000000000..71dec9eab --- /dev/null +++ b/public/21.8a1e14284789fc762941.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"21.8a1e14284789fc762941.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/config/tabId.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/dom/loadScript.ts","webpack://tweb/./src/helpers/makeError.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/richTextProcessor/wrapUrl.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_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.4',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K',\n cryptoWorkers: 4\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Database} from '.';\r\nimport type {IDBIndex} from '../../lib/files/idb';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n // indexes: [\r\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\r\n // const name = `index_${idx}`;\r\n // const index: IDBIndex = {\r\n // indexName: name,\r\n // keyPath: name,\r\n // objectParameters: {}\r\n // };\r\n\r\n // return index\r\n // })\r\n // ]\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","const tabId = Date.now() % Math.random() * 100000000 | 0;\nexport default tabId;\n","/*\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from './noop';\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: (reason?: any) => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n const deferredHelper: any = {\r\n isFulfilled: false,\r\n isRejected: false,\r\n\r\n notify: () => {},\r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n },\r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n\r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n\r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n\r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = noop;\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({includeUncontrolled: false, type: 'window'});\r\n};\r\n\r\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n // console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\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","export default function makeError(type: Error['type']) {\n const error: ApiError = {\n type\n };\n\n return error;\n}\n","export default function noop() {}\r\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 // 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(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport {AnyToVoidFunction} from '../../types';\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if(!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {CryptoMethods} from './crypto_methods';\r\nimport SuperMessagePort from '../mtproto/superMessagePort';\r\nimport {Awaited} from '../../types';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {IS_WORKER} from '../../helpers/context';\r\n\r\ntype CryptoEvent = {\r\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\r\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\r\n terminate: () => void\r\n};\r\n\r\nexport class CryptoMessagePort extends SuperMessagePort {\r\n private lastIndex: number;\r\n\r\n constructor() {\r\n super('CRYPTO');\r\n this.lastIndex = -1;\r\n }\r\n\r\n public invokeCryptoNew({method, args, transfer}: {\r\n method: T,\r\n args: Parameters,\r\n transfer?: Transferable[]\r\n }): Promise>> {\r\n const payload = {method, args};\r\n const listeners = this.listeners['invoke'];\r\n if(listeners?.length) { // already in worker\r\n // try {\r\n // @ts-ignore\r\n let result: any = listeners[0].callback(payload);\r\n if(!IS_WORKER && !(result instanceof Promise)) {\r\n result = Promise.resolve(result);\r\n }\r\n\r\n return result;\r\n // } catch(err) {\r\n // return Promise.reject(err);\r\n // }\r\n }\r\n\r\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\r\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\r\n 0;\r\n // @ts-ignore\r\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\r\n }\r\n\r\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\r\n return this.invokeCryptoNew({method, args});\r\n }\r\n}\r\n\r\nconst cryptoMessagePort = new CryptoMessagePort();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\r\nexport default cryptoMessagePort;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../../config/modes';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport MemoryWriter from './memoryWriter';\r\nimport FileManager from './memoryWriter';\r\nimport FileStorage from './fileStorage';\r\nimport makeError from '../../helpers/makeError';\r\nimport deferredPromise from '../../helpers/cancellablePromise';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController implements FileStorage {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n // private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n\r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n // console.warn('getFile:', response, fileName);\r\n throw makeError('NO_ENTRY_FOUND');\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n\r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject(makeError('STORAGE_OFFLINE'));\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n // console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\r\n return {\r\n deferred: deferredPromise(),\r\n getWriter: () => {\r\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return writer;\r\n }\r\n };\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport StreamWriter from './streamWriter';\r\n\r\nexport default class MemoryWriter implements StreamWriter {\r\n private bytes: Uint8Array;\r\n\r\n constructor(\r\n private mimeType: string,\r\n private size: number,\r\n private saveFileCallback?: (blob: Blob) => Promise\r\n ) {\r\n this.bytes = new Uint8Array(size);\r\n }\r\n\r\n public async write(part: Uint8Array, offset: number) {\r\n // sometimes file size can be bigger than the prov\r\n const endOffset = offset + part.byteLength;\r\n if(endOffset > this.bytes.byteLength) {\r\n const newBytes = new Uint8Array(endOffset);\r\n newBytes.set(this.bytes, 0);\r\n this.bytes = newBytes;\r\n }\r\n\r\n this.bytes.set(part, offset);\r\n };\r\n\r\n public truncate() {\r\n this.bytes = new Uint8Array();\r\n }\r\n\r\n public trim(size: number) {\r\n this.bytes = this.bytes.slice(0, size);\r\n }\r\n\r\n public finalize(saveToStorage = true) {\r\n const blob = blobConstruct(this.bytes, this.mimeType);\r\n\r\n if(saveToStorage && this.saveFileCallback) {\r\n this.saveFileCallback(blob);\r\n }\r\n\r\n return blob;\r\n }\r\n\r\n public getParts() {\r\n return this.bytes;\r\n }\r\n\r\n public replaceParts(parts: Uint8Array) {\r\n this.bytes = parts;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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: (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 {PHONE_NUMBER_REG_EXP} from '.';\nimport matchUrlProtocol from './matchUrlProtocol';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n return {url, onclick};\n }\n\n // second regexp is for phone numbers (t.me/+38050...)\n if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n case 'invoice':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n return {url, onclick};\n}\n","/*\n * 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\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport {IS_WORKER} from '../helpers/context';\r\nimport {WorkerTaskTemplate} from '../types';\r\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\r\n// import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n // console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n\r\n // if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach((key) => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n\r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(const key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n // private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\r\n if(IS_WORKER) {\r\n const port = MTProtoMessagePort.getInstance();\r\n return port.invoke('localStorageProxy', {type, args});\r\n }\r\n\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n return this.storage[type].apply(this.storage, args as any);\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return this.proxy('toggleStorage', enabled, clearWrite);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {AppInstance} from './mtproto/singleInstance';\r\nimport type {UserAuth} from './mtproto/mtproto_config';\r\nimport type {DcId} from '../types';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n },\r\n k_build: number\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {ChatSavedPosition} from './appManagers/appImManager';\r\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\r\nimport type {State} from '../config/state';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport {LangPackDifference} from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nclass StateStorage extends AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE> {\r\n constructor() {\r\n super(DATABASE_STATE, 'session');\r\n }\r\n}\r\n\r\nconst stateStorage = new StateStorage();\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../config/databases';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n// import DATABASE_SESSION from \"../config/databases/session\";\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport {IS_WORKER} from '../helpers/context';\r\nimport throttle from '../helpers/schedulers/throttle';\r\n// import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from './files/idb';\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nconst THROTTLE_TIME = 16;\r\n\r\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\r\nexport default class AppStorage<\r\n Storage extends Record,\r\n T extends Database\r\n> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;// new CacheStorageController('session');\r\n\r\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n const values = keys.map((key) => this.cache[key]);\r\n try {\r\n // console.log('setItem: will set', key/* , value */);\r\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n // console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n // this.useCS = false;\r\n console.error('[AS]: set error:', e, keys, values);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, THROTTLE_TIME, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, THROTTLE_TIME, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then((values) => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error: ApiError) => {\r\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\r\n if(!ignoreErrors.has(error.type)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, THROTTLE_TIME, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n // console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n\r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n\r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!IS_WORKER || !clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {\r\n console.error('freezeSaving callback error:', err);\r\n }\r\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\r\n","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\r\nexport default originalString;\r\n"],"names":["MAIN_DOMAIN","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","cryptoWorkers","name","stores","Date","now","Math","random","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","loadScript","url","script","document","createElement","promise","onload","onerror","src","body","appendChild","makeError","noop","copy","obj","getTime","map","el","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","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","description","perf","performance","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","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","onclick","fullPath","path","split","window","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","has","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/25.481fbe1a27468243ce6c.chunk.js b/public/25.481fbe1a27468243ce6c.chunk.js new file mode 100644 index 000000000..ee6364b1c --- /dev/null +++ b/public/25.481fbe1a27468243ce6c.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[25,339],{4494:(e,t,i)=>{i.d(t,{Z:()=>r});var s=i(2325),n=i(1405);const r=(e,t={})=>{const i=document.createElement(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}},279:(e,t,i)=>{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},1405:(e,t,i)=>{i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),r=i(5432),o=i(3512),a=i(5975);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const h=document.createElement("div");let p;h.classList.add("c-ripple"),e.classList.contains("rp-square")&&h.classList.add("is-square"),e[c?"prepend":"append"](h);const u=(e,s)=>{const o=Date.now(),a=document.createElement("div"),c=l++,d=1e3*+window.getComputedStyle(h).getPropertyValue("--ripple-duration").replace("s","");p=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{a.remove()})),i&&i(c)};if(ea.classList.add("hiding")),Math.max(i-d/2,0)),setTimeout(t,i)}else a.classList.add("hiding"),setTimeout(t,d/2);r.Z||window.removeEventListener("contextmenu",p),p=null,v=!1},t&&t(c),window.requestAnimationFrame((()=>{const t=h.getBoundingClientRect();a.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,r=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-r/2,l=n-r/2;a.style.width=a.style.height=r+"px",a.style.left=o+"px",a.style.top=l+"px",h.append(a)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==h)&&(d===e||!(0,a.Z)(t.target,d));let v=!1;if(r.Z){const e=()=>{p&&p()};d.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||v||m(t))return;v=!0;const{clientX:i,clientY:s}=t.touches[0];u(i,s),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else d.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(v)return void(v=!1);const{clientX:t,clientY:i}=e;u(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},8805:(e,t,i)=>{i.d(t,{ZP:()=>d,v7:()=>h});var s=i(5432),n=i(5003),r=i(4789),o=i(8594),a=i(3910);const l=i(4762).IS_ANDROID?200:24;class c{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,r.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class d extends c{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"}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,a.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class h extends c{constructor(e,t="",i=300,n=15,r=document.createElement("div")){if(super(e,t,r),this.onScrollOffset=i,this.splitCount=n,this.container=r,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,a.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},9674:(e,t,i)=>{i.d(t,{Z:()=>l});var s=i(3035),n=i(3725),r=i(410),o=i(8487);const a=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?t():s.then((()=>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={}})))}};r.GO&&(r.GO.sequentialDom=a);const l=a},2582:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2325);class n{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,i)=>{i.r(t),i.d(t,{default:()=>g});var s=i(4494),n=i(503),r=i(279),o=i(6765),a=i(2325),l=i(2582),c=i(4874),d=i(8799),h=i(5565),p=i(1168),u=i(8115),m=i(3512);let v=null;const g=new c.Z("page-signUp",!0,(()=>{const e=new l.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const c=document.createElement("span");let g;c.className="tgico tgico-cameraadd",e.imageDiv.append(t,c),e.imageDiv.addEventListener("click",(()=>{p.Z.createPopup(o.Z).open(t,(e=>{g=e}))}));const L=t=>{const i=S.value||"",s=w.value||"",n=i||s?(i+" "+s).trim():"";n?(0,h.Z)(e.title,(0,u.Z)(n)):(0,h.Z)(e.title,(0,a.ag)("YourName"))},S=new n.Z({label:"FirstName",maxLength:70}),w=new n.Z({label:"LastName",maxLength:64}),f=(0,s.Z)("btn-primary btn-color-primary"),b=new a.ZP.IntlElement({key:"StartMessaging"});return f.append(b.element),e.inputWrapper.append(S.container,w.container,f),S.input.addEventListener("input",L),w.input.addEventListener("input",L),f.addEventListener("click",(function(e){if(S.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!S.value.length)return S.input.classList.add("error"),!1;this.disabled=!0;const t=S.value.trim(),s=w.value.trim(),n={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:t,last_name:s};b.update({key:"PleaseWait"});const o=(0,r.y)(this);m.Z.managers.apiManager.invokeApi("auth.signUp",n).then((e=>{"auth.authorization"===e._?(m.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!g)return e();g().then((i=>{m.Z.managers.appProfileManager.uploadProfilePhoto(i).then(e,t)}),t)})).finally((()=>{i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()}))}))):(b.update({key:e._}),this.removeAttribute("disabled"),o.remove())})).catch((e=>{this.removeAttribute("disabled"),o.remove(),e.type,b.update({key:e.type})}))})),(0,d.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}),(e=>{v=e,m.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); +//# sourceMappingURL=25.481fbe1a27468243ce6c.chunk.js.map \ No newline at end of file diff --git a/public/25.481fbe1a27468243ce6c.chunk.js.map b/public/25.481fbe1a27468243ce6c.chunk.js.map new file mode 100644 index 000000000..c82241e40 --- /dev/null +++ b/public/25.481fbe1a27468243ce6c.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"25.481fbe1a27468243ce6c.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport ripple from './ripple';\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true,\r\n onlyMobile: true,\r\n icon: string,\r\n rippleSquare: true,\r\n text: LangPackKey,\r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport rootScope from '../lib/rootScope';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement,\r\n callback: (id: number) => Promise = () => Promise.resolve(),\r\n onEnd: (id: number) => void = null,\r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n // return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n\r\n const r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n // let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n\r\n // console.log('ripple drawRipple');\r\n\r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n // console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n // handler = () => animationEndPromise.then((duration) => {\r\n // console.log('ripple animation was:', duration);\r\n\r\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n // return;\r\n const elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n\r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n const delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n // });\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n // console.log('ripple after promise', Date.now() - startTime);\r\n // console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n\r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n // r.classList.add('active');\r\n // handler();\r\n });\r\n // });\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\r\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem ||\r\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n const touchEnd = () => {\r\n handler && handler();\r\n };\r\n\r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n // console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n\r\n // console.log('touchstart', e);\r\n touchStartFired = true;\r\n\r\n const {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n\r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n\r\n const {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport {logger, LogTypes} from '../lib/logger';\r\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\r\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {IS_ANDROID} from '../environment/userAgent';\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\r\n //_el.style.display = '';\r\n //return;\r\n\r\n let el = _el.parentElement;\r\n let height = el.scrollHeight;\r\n let width = el.scrollWidth;\r\n el.style.width = width + 'px';\r\n el.style.height = height + 'px';\r\n _el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver((entries) => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nconst SCROLL_THROTTLE = IS_ANDROID ? 200 : 24;\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n\r\n protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach((c) => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n // this.onScroll();\r\n }\r\n\r\n public addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n\r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\r\n }\r\n\r\n public destroy() {\r\n this.removeListeners();\r\n this.onAdditionalScroll = undefined;\r\n this.onScrolledTop = undefined;\r\n this.onScrolledBottom = undefined;\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n // return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n // if(this.debug) {\r\n // this.log('onScroll call', this.onScrollMeasure);\r\n // }\r\n\r\n // return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) return;\r\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = window.setTimeout(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n // lastScrollDirection check is useless here, every callback should decide on its own\r\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\r\n this.onAdditionalScroll();\r\n }\r\n\r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n // });\r\n }, SCROLL_THROTTLE);\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n // window.cancelAnimationFrame(this.onScrollMeasure);\r\n clearTimeout(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\r\n }\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n\r\n get scrollTop() {\r\n // this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n\r\n public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\r\n }\r\n\r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n\r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element\r\n * @param callback\r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport type {InputFile} from '../layer';\r\nimport type {AuthState} from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, {i18n} from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName ?\r\n (name + ' ' + lastName).trim() :\r\n '';\r\n\r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n const sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n // console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n // console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n // console.log('uploaded smthn', inputFile);\r\n\r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n // console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n // console.log('auth.signUp response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n\r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","remove","removeAttribute","rippleClickId","ripple","callback","Promise","resolve","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","touches","length","once","cancelBubble","stopPropagation","passive","dataset","SCROLL_THROTTLE","IS_ANDROID","ScrollableBase","constructor","el","logPrefix","container","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","this","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollPosition","scrollProperty","checkForTriggers","log","Array","from","children","forEach","c","addScrollListener","addedScrollListener","capture","removeScrollListener","setListeners","removeHeavyAnimationListener","removeListeners","undefined","destroy","element","scrollIntoViewNew","clearTimeout","Scrollable","onScrollOffset","withPaddingContainer","super","loadedAll","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setVirtualContainer","elements","padding","getDistanceToEnd","round","offsetHeight","isScrolledDown","setScrollTopSilently","value","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","then","measure","mutate","mutateElement","isConnected","read","write","LoginPage","body","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","avatarPreview","id","addIco","uploadAvatar","open","_uploadAvatar","handleInput","name","nameInputField","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","response","_","user","reject","inputFile","finally","m","default","mount","catch","err","type","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/25.7268088042b01ecb2f03.chunk.js b/public/25.7268088042b01ecb2f03.chunk.js deleted file mode 100644 index 3bf4505b8..000000000 --- a/public/25.7268088042b01ecb2f03.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[25,339],{4494:(e,t,i)=>{i.d(t,{Z:()=>r});var s=i(2325),n=i(1405);const r=(e,t={})=>{const i=document.createElement(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}},279:(e,t,i)=>{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},1405:(e,t,i)=>{i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),r=i(5432),o=i(3512),a=i(5975);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let h,p=document.createElement("div");p.classList.add("c-ripple"),e.classList.contains("rp-square")&&p.classList.add("is-square"),e[c?"prepend":"append"](p);const u=(e,s)=>{const o=Date.now(),a=document.createElement("div"),c=l++,d=1e3*+window.getComputedStyle(p).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{n.Z.mutate((()=>{a.remove()})),i&&i(c)};if(ea.classList.add("hiding")),Math.max(i-d/2,0)),setTimeout(t,i)}else a.classList.add("hiding"),setTimeout(t,d/2);r.Z||window.removeEventListener("contextmenu",h),h=null,v=!1},t&&t(c),window.requestAnimationFrame((()=>{const t=p.getBoundingClientRect();a.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,r=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-r/2,l=n-r/2;a.style.width=a.style.height=r+"px",a.style.left=o+"px",a.style.top=l+"px",p.append(a)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==p)&&(d===e||!(0,a.Z)(t.target,d));let v=!1;if(r.Z){let e=()=>{h&&h()};d.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||v||m(t))return;v=!0;let{clientX:i,clientY:s}=t.touches[0];u(i,s),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else d.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(v)return void(v=!1);let{clientX:t,clientY:i}=e;u(t,i),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})}),{passive:!0})}},8805:(e,t,i)=>{i.d(t,{ZP:()=>c,v7:()=>d});var s=i(5432),n=i(5003),r=i(4789),o=i(8594),a=i(3910);class l{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,r.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class c extends l{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"}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,a.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class d extends l{constructor(e,t="",i=300,n=15,r=document.createElement("div")){if(super(e,t,r),this.onScrollOffset=i,this.splitCount=n,this.container=r,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,a.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},9674:(e,t,i)=>{i.d(t,{Z:()=>l});var s=i(3035),n=i(3725),r=i(410),o=i(8487);const a=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?t():s.then((()=>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={}})))}};r.GO&&(r.GO.sequentialDom=a);const l=a},2582:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2325);class n{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,i)=>{i.r(t),i.d(t,{default:()=>g});var s=i(4494),n=i(503),r=i(279),o=i(6765),a=i(2325),l=i(2582),c=i(4874),d=i(8799),h=i(5565),p=i(1168),u=i(8115),m=i(3512);let v=null;const g=new c.Z("page-signUp",!0,(()=>{const e=new l.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const c=document.createElement("span");let g;c.className="tgico tgico-cameraadd",e.imageDiv.append(t,c),e.imageDiv.addEventListener("click",(()=>{p.Z.createPopup(o.Z).open(t,(e=>{g=e}))}));const L=t=>{const i=S.value||"",s=w.value||"",n=i||s?(i+" "+s).trim():"";n?(0,h.Z)(e.title,(0,u.Z)(n)):(0,h.Z)(e.title,(0,a.ag)("YourName"))},S=new n.Z({label:"FirstName",maxLength:70}),w=new n.Z({label:"LastName",maxLength:64}),f=(0,s.Z)("btn-primary btn-color-primary"),b=new a.ZP.IntlElement({key:"StartMessaging"});return f.append(b.element),e.inputWrapper.append(S.container,w.container,f),S.input.addEventListener("input",L),w.input.addEventListener("input",L),f.addEventListener("click",(function(e){if(S.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!S.value.length)return S.input.classList.add("error"),!1;this.disabled=!0;const t=S.value.trim(),s=w.value.trim(),n={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:t,last_name:s};b.update({key:"PleaseWait"});const o=(0,r.y)(this);m.Z.managers.apiManager.invokeApi("auth.signUp",n).then((e=>{"auth.authorization"===e._?(m.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!g)return e();g().then((i=>{m.Z.managers.appProfileManager.uploadProfilePhoto(i).then(e,t)}),t)})).finally((()=>{i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()}))}))):(b.update({key:e._}),this.removeAttribute("disabled"),o.remove())})).catch((e=>{this.removeAttribute("disabled"),o.remove(),e.type,b.update({key:e.type})}))})),(0,d.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}),(e=>{v=e,m.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); -//# sourceMappingURL=25.7268088042b01ecb2f03.chunk.js.map \ No newline at end of file diff --git a/public/25.7268088042b01ecb2f03.chunk.js.map b/public/25.7268088042b01ecb2f03.chunk.js.map deleted file mode 100644 index c1f359390..000000000 --- a/public/25.7268088042b01ecb2f03.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"25.7268088042b01ecb2f03.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver((entries) => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach((c) => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n \r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\r\n }\r\n\r\n public destroy() {\r\n this.removeListeners();\r\n this.onAdditionalScroll = undefined;\r\n this.onScrolledTop = undefined;\r\n this.onScrolledBottom = undefined;\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n // return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) return;\r\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = window.setTimeout(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n // lastScrollDirection check is useless here, every callback should decide on its own\r\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n // });\r\n }, 200);\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n // window.cancelAnimationFrame(this.onScrollMeasure);\r\n clearTimeout(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\r\n }\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n\r\n public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, { i18n } from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","remove","removeAttribute","rippleClickId","ripple","callback","Promise","resolve","onEnd","prepend","attachListenerTo","querySelector","handler","r","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","touches","length","once","cancelBubble","stopPropagation","passive","dataset","ScrollableBase","constructor","el","logPrefix","container","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","this","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollPosition","scrollProperty","checkForTriggers","log","Array","from","children","forEach","c","addScrollListener","addedScrollListener","capture","removeScrollListener","setListeners","removeHeavyAnimationListener","removeListeners","undefined","destroy","element","scrollIntoViewNew","clearTimeout","Scrollable","onScrollOffset","withPaddingContainer","super","loadedAll","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setVirtualContainer","elements","padding","getDistanceToEnd","round","offsetHeight","isScrolledDown","setScrollTopSilently","value","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","then","measure","mutate","mutateElement","isConnected","read","write","LoginPage","body","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","avatarPreview","id","addIco","uploadAvatar","open","_uploadAvatar","handleInput","name","nameInputField","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","response","_","user","reject","inputFile","finally","m","default","mount","catch","err","type","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/27.0409c6d29d5c2ee62ee6.chunk.js b/public/27.0409c6d29d5c2ee62ee6.chunk.js deleted file mode 100644 index 8473956f1..000000000 --- a/public/27.0409c6d29d5c2ee62ee6.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[27],{4421:(e,t,s)=>{s.d(t,{Z:()=>r});var n=s(1655),i=s(6724),o=s(5003);class r{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=(0,o.kg)("LL",o.v9.Error),this.processQueue=(0,i.Z)((()=>this._processQueue()),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise(((e,t)=>{this.unlockResolve=e})))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return t=this,s=void 0,i=function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}},new((n=void 0)||(n=Promise))((function(e,o){function r(e){try{c(i.next(e))}catch(e){o(e)}}function l(e){try{c(i.throw(e))}catch(e){o(e)}}function c(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,l)}c((i=i.apply(t,s||[])).next())}));var t,s,n,i}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit))do{if(e?(0,n.Z)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.size{s.d(t,{Z:()=>n});const n={Á:"A",Ă:"A",Ắ:"A",Ặ:"A",Ằ:"A",Ẳ:"A",Ẵ:"A",Ǎ:"A",Â:"A",Ấ:"A",Ậ:"A",Ầ:"A",Ẩ:"A",Ẫ:"A",Ä:"A",Ǟ:"A",Ȧ:"A",Ǡ:"A",Ạ:"A",Ȁ:"A",À:"A",Ả:"A",Ȃ:"A",Ā:"A",Ą:"A",Å:"A",Ǻ:"A",Ḁ:"A",Ⱥ:"A",Ã:"A",Ꜳ:"AA",Æ:"AE",Ǽ:"AE",Ǣ:"AE",Ꜵ:"AO",Ꜷ:"AU",Ꜹ:"AV",Ꜻ:"AV",Ꜽ:"AY",Ḃ:"B",Ḅ:"B",Ɓ:"B",Ḇ:"B",Ƀ:"B",Ƃ:"B",Ć:"C",Č:"C",Ç:"C",Ḉ:"C",Ĉ:"C",Ċ:"C",Ƈ:"C",Ȼ:"C",Ď:"D",Ḑ:"D",Ḓ:"D",Ḋ:"D",Ḍ:"D",Ɗ:"D",Ḏ:"D",Dz:"D",Dž:"D",Đ:"D",Ƌ:"D",DZ:"DZ",DŽ:"DZ",É:"E",Ĕ:"E",Ě:"E",Ȩ:"E",Ḝ:"E",Ê:"E",Ế:"E",Ệ:"E",Ề:"E",Ể:"E",Ễ:"E",Ḙ:"E",Ë:"E",Ė:"E",Ẹ:"E",Ȅ:"E",È:"E",Ẻ:"E",Ȇ:"E",Ē:"E",Ḗ:"E",Ḕ:"E",Ę:"E",Ɇ:"E",Ẽ:"E",Ḛ:"E",Ꝫ:"ET",Ḟ:"F",Ƒ:"F",Ǵ:"G",Ğ:"G",Ǧ:"G",Ģ:"G",Ĝ:"G",Ġ:"G",Ɠ:"G",Ḡ:"G",Ǥ:"G",Ḫ:"H",Ȟ:"H",Ḩ:"H",Ĥ:"H",Ⱨ:"H",Ḧ:"H",Ḣ:"H",Ḥ:"H",Ħ:"H",Í:"I",Ĭ:"I",Ǐ:"I",Î:"I",Ï:"I",Ḯ:"I",İ:"I",Ị:"I",Ȉ:"I",Ì:"I",Ỉ:"I",Ȋ:"I",Ī:"I",Į:"I",Ɨ:"I",Ĩ:"I",Ḭ:"I",Ꝺ:"D",Ꝼ:"F",Ᵹ:"G",Ꞃ:"R",Ꞅ:"S",Ꞇ:"T",Ꝭ:"IS",Ĵ:"J",Ɉ:"J",Ḱ:"K",Ǩ:"K",Ķ:"K",Ⱪ:"K",Ꝃ:"K",Ḳ:"K",Ƙ:"K",Ḵ:"K",Ꝁ:"K",Ꝅ:"K",Ĺ:"L",Ƚ:"L",Ľ:"L",Ļ:"L",Ḽ:"L",Ḷ:"L",Ḹ:"L",Ⱡ:"L",Ꝉ:"L",Ḻ:"L",Ŀ:"L",Ɫ:"L",Lj:"L",Ł:"L",LJ:"LJ",Ḿ:"M",Ṁ:"M",Ṃ:"M",Ɱ:"M",Ń:"N",Ň:"N",Ņ:"N",Ṋ:"N",Ṅ:"N",Ṇ:"N",Ǹ:"N",Ɲ:"N",Ṉ:"N",Ƞ:"N",Nj:"N",Ñ:"N",NJ:"NJ",Ó:"O",Ŏ:"O",Ǒ:"O",Ô:"O",Ố:"O",Ộ:"O",Ồ:"O",Ổ:"O",Ỗ:"O",Ö:"O",Ȫ:"O",Ȯ:"O",Ȱ:"O",Ọ:"O",Ő:"O",Ȍ:"O",Ò:"O",Ỏ:"O",Ơ:"O",Ớ:"O",Ợ:"O",Ờ:"O",Ở:"O",Ỡ:"O",Ȏ:"O",Ꝋ:"O",Ꝍ:"O",Ō:"O",Ṓ:"O",Ṑ:"O",Ɵ:"O",Ǫ:"O",Ǭ:"O",Ø:"O",Ǿ:"O",Õ:"O",Ṍ:"O",Ṏ:"O",Ȭ:"O",Ƣ:"OI",Ꝏ:"OO",Ɛ:"E",Ɔ:"O",Ȣ:"OU",Ṕ:"P",Ṗ:"P",Ꝓ:"P",Ƥ:"P",Ꝕ:"P",Ᵽ:"P",Ꝑ:"P",Ꝙ:"Q",Ꝗ:"Q",Ŕ:"R",Ř:"R",Ŗ:"R",Ṙ:"R",Ṛ:"R",Ṝ:"R",Ȑ:"R",Ȓ:"R",Ṟ:"R",Ɍ:"R",Ɽ:"R",Ꜿ:"C",Ǝ:"E",Ś:"S",Ṥ:"S",Š:"S",Ṧ:"S",Ş:"S",Ŝ:"S",Ș:"S",Ṡ:"S",Ṣ:"S",Ṩ:"S",ẞ:"SS",Ť:"T",Ţ:"T",Ṱ:"T",Ț:"T",Ⱦ:"T",Ṫ:"T",Ṭ:"T",Ƭ:"T",Ṯ:"T",Ʈ:"T",Ŧ:"T",Ɐ:"A",Ꞁ:"L",Ɯ:"M",Ʌ:"V",Ꜩ:"TZ",Ú:"U",Ŭ:"U",Ǔ:"U",Û:"U",Ṷ:"U",Ü:"U",Ǘ:"U",Ǚ:"U",Ǜ:"U",Ǖ:"U",Ṳ:"U",Ụ:"U",Ű:"U",Ȕ:"U",Ù:"U",Ủ:"U",Ư:"U",Ứ:"U",Ự:"U",Ừ:"U",Ử:"U",Ữ:"U",Ȗ:"U",Ū:"U",Ṻ:"U",Ų:"U",Ů:"U",Ũ:"U",Ṹ:"U",Ṵ:"U",Ꝟ:"V",Ṿ:"V",Ʋ:"V",Ṽ:"V",Ꝡ:"VY",Ẃ:"W",Ŵ:"W",Ẅ:"W",Ẇ:"W",Ẉ:"W",Ẁ:"W",Ⱳ:"W",Ẍ:"X",Ẋ:"X",Ý:"Y",Ŷ:"Y",Ÿ:"Y",Ẏ:"Y",Ỵ:"Y",Ỳ:"Y",Ƴ:"Y",Ỷ:"Y",Ỿ:"Y",Ȳ:"Y",Ɏ:"Y",Ỹ:"Y",Ź:"Z",Ž:"Z",Ẑ:"Z",Ⱬ:"Z",Ż:"Z",Ẓ:"Z",Ȥ:"Z",Ẕ:"Z",Ƶ:"Z",IJ:"IJ",Œ:"OE",ᴀ:"A",ᴁ:"AE",ʙ:"B",ᴃ:"B",ᴄ:"C",ᴅ:"D",ᴇ:"E",ꜰ:"F",ɢ:"G",ʛ:"G",ʜ:"H",ɪ:"I",ʁ:"R",ᴊ:"J",ᴋ:"K",ʟ:"L",ᴌ:"L",ᴍ:"M",ɴ:"N",ᴏ:"O",ɶ:"OE",ᴐ:"O",ᴕ:"OU",ᴘ:"P",ʀ:"R",ᴎ:"N",ᴙ:"R",ꜱ:"S",ᴛ:"T",ⱻ:"E",ᴚ:"R",ᴜ:"U",ᴠ:"V",ᴡ:"W",ʏ:"Y",ᴢ:"Z",á:"a",ă:"a",ắ:"a",ặ:"a",ằ:"a",ẳ:"a",ẵ:"a",ǎ:"a",â:"a",ấ:"a",ậ:"a",ầ:"a",ẩ:"a",ẫ:"a",ä:"a",ǟ:"a",ȧ:"a",ǡ:"a",ạ:"a",ȁ:"a",à:"a",ả:"a",ȃ:"a",ā:"a",ą:"a",ᶏ:"a",ẚ:"a",å:"a",ǻ:"a",ḁ:"a",ⱥ:"a",ã:"a",ꜳ:"aa",æ:"ae",ǽ:"ae",ǣ:"ae",ꜵ:"ao",ꜷ:"au",ꜹ:"av",ꜻ:"av",ꜽ:"ay",ḃ:"b",ḅ:"b",ɓ:"b",ḇ:"b",ᵬ:"b",ᶀ:"b",ƀ:"b",ƃ:"b",ɵ:"o",ć:"c",č:"c",ç:"c",ḉ:"c",ĉ:"c",ɕ:"c",ċ:"c",ƈ:"c",ȼ:"c",ď:"d",ḑ:"d",ḓ:"d",ȡ:"d",ḋ:"d",ḍ:"d",ɗ:"d",ᶑ:"d",ḏ:"d",ᵭ:"d",ᶁ:"d",đ:"d",ɖ:"d",ƌ:"d",ı:"i",ȷ:"j",ɟ:"j",ʄ:"j",dz:"dz",dž:"dz",é:"e",ĕ:"e",ě:"e",ȩ:"e",ḝ:"e",ê:"e",ế:"e",ệ:"e",ề:"e",ể:"e",ễ:"e",ḙ:"e",ë:"e",ė:"e",ẹ:"e",ȅ:"e",è:"e",ẻ:"e",ȇ:"e",ē:"e",ḗ:"e",ḕ:"e",ⱸ:"e",ę:"e",ᶒ:"e",ɇ:"e",ẽ:"e",ḛ:"e",ꝫ:"et",ḟ:"f",ƒ:"f",ᵮ:"f",ᶂ:"f",ǵ:"g",ğ:"g",ǧ:"g",ģ:"g",ĝ:"g",ġ:"g",ɠ:"g",ḡ:"g",ᶃ:"g",ǥ:"g",ḫ:"h",ȟ:"h",ḩ:"h",ĥ:"h",ⱨ:"h",ḧ:"h",ḣ:"h",ḥ:"h",ɦ:"h",ẖ:"h",ħ:"h",ƕ:"hv",í:"i",ĭ:"i",ǐ:"i",î:"i",ï:"i",ḯ:"i",ị:"i",ȉ:"i",ì:"i",ỉ:"i",ȋ:"i",ī:"i",į:"i",ᶖ:"i",ɨ:"i",ĩ:"i",ḭ:"i",ꝺ:"d",ꝼ:"f",ᵹ:"g",ꞃ:"r",ꞅ:"s",ꞇ:"t",ꝭ:"is",ǰ:"j",ĵ:"j",ʝ:"j",ɉ:"j",ḱ:"k",ǩ:"k",ķ:"k",ⱪ:"k",ꝃ:"k",ḳ:"k",ƙ:"k",ḵ:"k",ᶄ:"k",ꝁ:"k",ꝅ:"k",ĺ:"l",ƚ:"l",ɬ:"l",ľ:"l",ļ:"l",ḽ:"l",ȴ:"l",ḷ:"l",ḹ:"l",ⱡ:"l",ꝉ:"l",ḻ:"l",ŀ:"l",ɫ:"l",ᶅ:"l",ɭ:"l",ł:"l",lj:"lj",ſ:"s",ẜ:"s",ẛ:"s",ẝ:"s",ḿ:"m",ṁ:"m",ṃ:"m",ɱ:"m",ᵯ:"m",ᶆ:"m",ń:"n",ň:"n",ņ:"n",ṋ:"n",ȵ:"n",ṅ:"n",ṇ:"n",ǹ:"n",ɲ:"n",ṉ:"n",ƞ:"n",ᵰ:"n",ᶇ:"n",ɳ:"n",ñ:"n",nj:"nj",ó:"o",ŏ:"o",ǒ:"o",ô:"o",ố:"o",ộ:"o",ồ:"o",ổ:"o",ỗ:"o",ö:"o",ȫ:"o",ȯ:"o",ȱ:"o",ọ:"o",ő:"o",ȍ:"o",ò:"o",ỏ:"o",ơ:"o",ớ:"o",ợ:"o",ờ:"o",ở:"o",ỡ:"o",ȏ:"o",ꝋ:"o",ꝍ:"o",ⱺ:"o",ō:"o",ṓ:"o",ṑ:"o",ǫ:"o",ǭ:"o",ø:"o",ǿ:"o",õ:"o",ṍ:"o",ṏ:"o",ȭ:"o",ƣ:"oi",ꝏ:"oo",ɛ:"e",ᶓ:"e",ɔ:"o",ᶗ:"o",ȣ:"ou",ṕ:"p",ṗ:"p",ꝓ:"p",ƥ:"p",ᵱ:"p",ᶈ:"p",ꝕ:"p",ᵽ:"p",ꝑ:"p",ꝙ:"q",ʠ:"q",ɋ:"q",ꝗ:"q",ŕ:"r",ř:"r",ŗ:"r",ṙ:"r",ṛ:"r",ṝ:"r",ȑ:"r",ɾ:"r",ᵳ:"r",ȓ:"r",ṟ:"r",ɼ:"r",ᵲ:"r",ᶉ:"r",ɍ:"r",ɽ:"r",ↄ:"c",ꜿ:"c",ɘ:"e",ɿ:"r",ś:"s",ṥ:"s",š:"s",ṧ:"s",ş:"s",ŝ:"s",ș:"s",ṡ:"s",ṣ:"s",ṩ:"s",ʂ:"s",ᵴ:"s",ᶊ:"s",ȿ:"s",ɡ:"g",ß:"ss",ᴑ:"o",ᴓ:"o",ᴝ:"u",ť:"t",ţ:"t",ṱ:"t",ț:"t",ȶ:"t",ẗ:"t",ⱦ:"t",ṫ:"t",ṭ:"t",ƭ:"t",ṯ:"t",ᵵ:"t",ƫ:"t",ʈ:"t",ŧ:"t",ᵺ:"th",ɐ:"a",ᴂ:"ae",ǝ:"e",ᵷ:"g",ɥ:"h",ʮ:"h",ʯ:"h",ᴉ:"i",ʞ:"k",ꞁ:"l",ɯ:"m",ɰ:"m",ᴔ:"oe",ɹ:"r",ɻ:"r",ɺ:"r",ⱹ:"r",ʇ:"t",ʌ:"v",ʍ:"w",ʎ:"y",ꜩ:"tz",ú:"u",ŭ:"u",ǔ:"u",û:"u",ṷ:"u",ü:"u",ǘ:"u",ǚ:"u",ǜ:"u",ǖ:"u",ṳ:"u",ụ:"u",ű:"u",ȕ:"u",ù:"u",ủ:"u",ư:"u",ứ:"u",ự:"u",ừ:"u",ử:"u",ữ:"u",ȗ:"u",ū:"u",ṻ:"u",ų:"u",ᶙ:"u",ů:"u",ũ:"u",ṹ:"u",ṵ:"u",ᵫ:"ue",ꝸ:"um",ⱴ:"v",ꝟ:"v",ṿ:"v",ʋ:"v",ᶌ:"v",ⱱ:"v",ṽ:"v",ꝡ:"vy",ẃ:"w",ŵ:"w",ẅ:"w",ẇ:"w",ẉ:"w",ẁ:"w",ⱳ:"w",ẘ:"w",ẍ:"x",ẋ:"x",ᶍ:"x",ý:"y",ŷ:"y",ÿ:"y",ẏ:"y",ỵ:"y",ỳ:"y",ƴ:"y",ỷ:"y",ỿ:"y",ȳ:"y",ẙ:"y",ɏ:"y",ỹ:"y",ź:"z",ž:"z",ẑ:"z",ʑ:"z",ⱬ:"z",ż:"z",ẓ:"z",ȥ:"z",ẕ:"z",ᵶ:"z",ᶎ:"z",ʐ:"z",ƶ:"z",ɀ:"z",ff:"ff",ffi:"ffi",ffl:"ffl",fi:"fi",fl:"fl",ij:"ij",œ:"oe",st:"st",ₐ:"a",ₑ:"e",ᵢ:"i",ⱼ:"j",ₒ:"o",ᵣ:"r",ᵤ:"u",ᵥ:"v",ₓ:"x",Ё:"YO",Й:"I",Ц:"TS",У:"U",К:"K",Е:"E",Н:"N",Г:"G",Ш:"SH",Щ:"SCH",З:"Z",Х:"H",Ъ:"",ё:"yo",й:"i",ц:"ts",у:"u",к:"k",е:"e",н:"n",г:"g",ш:"sh",щ:"sch",з:"z",х:"h",ъ:"",Ф:"F",Ы:"I",В:"V",А:"A",П:"P",Р:"R",О:"O",Л:"L",Д:"D",Ж:"ZH",Э:"E",ф:"f",ы:"i",в:"v",а:"a",п:"p",р:"r",о:"o",л:"l",д:"d",ж:"zh",э:"e",Я:"Ya",Ч:"CH",С:"S",М:"M",И:"I",Т:"T",Ь:"",Б:"B",Ю:"YU",я:"ya",ч:"ch",с:"s",м:"m",и:"i",т:"t",ь:"",б:"b",ю:"yu"}},6690:(e,t,s)=>{function n(e){return[...new Set(e)]}s.d(t,{Z:()=>n})},6519:(e,t,s)=>{function n(e,t,s,n){if("function"!=typeof s){const e=s;s=t=>t[e]}const i=s(t);if(void 0===n&&-1!==(n=e.indexOf(t))){const t=e[n-1],o=e[n+1];if((!t||s(t)>=i)&&(!o||s(o)<=i))return n;e.splice(n,1)}const o=e.length;if(!o||i<=s(e[o-1]))return e.push(t)-1;if(i>=s(e[0]))return e.unshift(t),0;for(let n=0;ns(e[n]))return e.splice(n,0,t),n;return console.error("wtf",e,t),e.indexOf(t)}s.d(t,{Z:()=>n})},8938:(e,t,s)=>{function n(e){}s.d(t,{Z:()=>n})},4484:(e,t,s)=>{function n(e,t){const s=e.length;if(s!==t.length)return!1;for(let n=0;nn})},3306:(e,t,s)=>{function n(e){const t=e.length,s=new Uint8Array(Math.ceil(t/2));let n=0;t%2&&(s[n++]=parseInt(e.charAt(0),16));for(let i=n;in})},3692:(e,t,s)=>{function n(e){return e instanceof Uint8Array?e:"string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}s.d(t,{Z:()=>n})},6654:(e,t,s)=>{function n(e,t){return e instanceof Promise?e.then(t):t(e)}s.d(t,{Z:()=>n})},3624:(e,t,s)=>{s.d(t,{k:()=>n});const n=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:t=>{const s=e;return()=>!s.cleaned&&(!t||t())}}}},7401:(e,t,s)=>{function n(e,t="asc"){if(!e)return[];const s=e instanceof Map?[...e.keys()]:Object.keys(e).map((e=>+e));return"asc"===t?s.sort(((e,t)=>e-t)):s.sort(((e,t)=>t-e))}s.d(t,{Z:()=>n})},5701:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(6761),i=s(319);function o(e,t,s=!0,o=!0){let r,l,c,u,a=!1;const h=t=>{const s=c,n=u;try{s(e.apply(null,t))}catch(e){console.error("debounce error",e),n(e)}},d=(...e)=>{l||(l=new Promise(((e,t)=>(c=e,u=t)))),r?(clearTimeout(r),a=!0,u(),l=new Promise(((e,t)=>(c=e,u=t)))):s&&(h(e),a=!1);const d=n.Z.setTimeout((()=>{!o||s&&!a||h(e),r===d&&(r=l=c=u=void 0,a=!1)}),t);return r=d,l.catch(i.Z),l};return d.clearTimeout=()=>{r&&(n.Z.clearTimeout(r),u(),r=l=c=u=void 0,a=!1)},d}},252:(e,t,s)=>{s.d(t,{D:()=>n,Z:()=>l});var n,i=s(410),o=s(1655);function r(e,t){if(e.toExponential){const s=e-t;return s<0?-1:s>0?1:0}return function(e,t){const s=e.length;if(s!==t.length){const e=s-t.length;return e<0?-1:e>0?1:0}for(let n=0;n=2)for(let t=0,s=this.slices.length;t=0)return{slice:t,offset:e===t[n]?n:n-1}}if(t&&t.isEnd(n.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let i=this.slice,o=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;i=t.slice,o=r=t.offset,i.includes(e)&&(r+=1)}let l=Math.max(r+t,0),c=r+t+s;const u=i.slice(l,c),a=t<0?s+t:s,h=Math.abs(t),d=i.length-r>=a||!!i.isEnd(n.Top)&&(u.setEnd(n.Top),!0),f=r-h>=0||!!i.isEnd(n.Bottom)&&(u.setEnd(n.Bottom),!0);return{slice:u,offsetIdOffset:o,fulfilled:n.None|(d&&f?n.Both:(d?n.Top:n.None)|(f?n.Bottom:n.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(n.Bottom)||(t=this.constructSlice(),t.setEnd(n.Bottom),this.slices.unshift(t)):t.setEnd(n.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(n.Top)||(t=this.constructSlice(),t.setEnd(n.Top),this.slices.push(t)):t.setEnd(n.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}deleteSlice(e){(0,o.Z)(this.slices,e)}toJSON(){const e={slices:this.slices.map((e=>({values:e.slice(),isEnd:e.getEnds()})))};return JSON.stringify(e)}static fromJSON(e){const t=JSON.parse(e),s=new l;return t.slices.forEach((e=>{const t=s.insertSlice(e.values)||s.first;e.isEnd.top&&t.setEnd(n.Top),e.isEnd.bottom&&t.setEnd(n.Bottom)})),s}}i.GO&&(i.GO.SlicedArray=l)},2566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2946);function i(e){return e.peer?(0,n.Z)(e.peer):e.user_id.toPeerId()}},7120:(e,t,s)=>{function n(e,t,s,n){if("chatEmpty"===e._)return!1;if(e.pFlags.deactivated&&"view_messages"!==t)return!1;const i=void 0===s;if(e.pFlags.creator&&i)return!0;if("chatForbidden"===e._||"channelForbidden"===e._||e.pFlags.left&&!e.pFlags.megagroup)return!1;if(!s&&!(s=e.admin_rights||e.banned_rights||e.default_banned_rights))return!1;let o={};switch(s&&(o=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!n&&e.pFlags.left)return!1;if("chatBannedRights"===s._&&o[t])return!1;if("channel"===e._&&!e.pFlags.megagroup&&!o.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!o[t];case"pin_messages":return"chatAdminRights"===s._?o[t]||!!o.post_messages:!o[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?o[t]:!o[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!o.ban_users;case"view_participants":return!("chat"!==e._&&e.pFlags.broadcast&&!e.pFlags.creator&&!e.admin_rights)}return!0}s.d(t,{Z:()=>n})},8050:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(3385);function i(e,t=(0,n.Z)(e.folder_id)){return e&&e[t]}},3385:(e,t,s)=>{function n(e){return`index_${e}`}s.d(t,{Z:()=>n})},515:(e,t,s)=>{function n(e,t){return e+"_"+t}s.d(t,{Z:()=>n})},6566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2342);function i(e,t,s){if("inputMessagesFilterEmpty"===e)return t;const i=[];if(!t.length)return i;let o=!0;const r={},l=[],c=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,l.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,l.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,l.push(void 0,"photo","pdf");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,l.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,l.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,l.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,l.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:o=!1}if(!o)return i;for(let e=0,o=t.length;ee.includes(t._)))||(0,n.Z)(o.message))&&(u=!0)}}else r.avatar&&o.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(o.action._)&&(u=!0);if(u&&(i.push(o),i.length>=s))break}return i}},2381:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(8938);function i(e){let t,s,i,o=0;for(const r of e)if((0,n.Z)(r),r.message){if(++o>1)break;t=r.message,s=r.totalEntities,i=r.entities}return o>1&&(t=void 0,s=void 0,i=void 0),{message:t,entities:i,totalEntities:s}}},2946:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(5880),i=s(1507);function o(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,n.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const s=e.channel_id||e.chat_id;return void 0!==s?s.toPeerId(!0):i.NM}if(!e)return i.NM;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}},8493:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1507);function i(e){return!e.pFlags.deleted&&e.id.toPeerId()!==n.hj}},9174:(e,t,s)=>{var n;s.d(t,{Q:()=>n}),function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(n||(n={}))},7746:(e,t,s)=>{function n(e,t){return e.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,((e,s,n)=>{if(t){const n=e.length;s+=n,t.forEach((e=>{const t=e.offset+e.length;t===s?e.length+=n:t>s&&(e.offset+=n)}))}return e+"️"}))}s.d(t,{Z:()=>n})},2342:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2423);function i(e){return e?e.match(n.it):null}},2821:(e,t,s)=>{s.d(t,{Z:()=>l});var n=s(2423),i=s(6875),o=s(8859),r=s(6241);function l(e,t,s){const l=[];let c=!1;const u=e=>(0,o.Z)(t,e)?c=!1:(l.push(e),c=!0),a=[];let h,d=0;for(;h=e.match(n.QB);){const t=d+h.index;a.push(e.substr(0,h.index));const s=h[3]||h[8]||h[11]||h[13];let i;if(d-=s.length,d+=s.length,c=!1,s.match(/^`*$/))a.push(h[0]);else if(h[3])i={_:"messageEntityPre",language:"",offset:t+h[1].length,length:s.length},u(i)&&("\n"===h[5]&&(h[5]="",d-=1),a.push(h[1]+s+h[5]),d-=h[2].length+h[4].length);else if(h[7]){const e=""===h[6];i={_:n.SC[h[7]],offset:t+(e?0:h[6].length),length:s.length},u(i)&&(e?a.push(s):a.push(h[6]+s+h[9]),d-=2*h[7].length+(e?2:0))}else h[11]?(i={_:"messageEntityMentionName",user_id:h[10].toUserId(),offset:t,length:s.length},u(i)&&(a.push(s),d-=h[0].length-s.length)):h[12]&&(i={_:"messageEntityTextUrl",url:h[14],offset:t,length:s.length},u(i)&&(a.push(s),d-=h[12].length-s.length));c||a.push(h[0]),e=e.substr(h.index+h[0].length),d+=h.index+h[0].length}a.push(e);let f=a.join("");f.replace(/\s+/g,"").length||(f=e,l.splice(0,l.length)),(0,r.Z)(t,l),(0,i.Z)(t);let g=f.length;if(!s){f=f.replace(/^\s*/,"");let e=g-f.length;e&&t.forEach((t=>{t.offset=Math.max(0,t.offset-e)})),f=f.replace(/\s*$/,""),e=g-f.length,g=f.length,e&&t.forEach((e=>{e.offset+e.length>g&&(e.length=g-e.offset)}))}return f}},2491:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1379);function i(e,t=[]){return t.forEach((t=>{"messageEntitySpoiler"===t._&&(e=(0,n.Z)(e,t).text)})),e}},5082:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(467);class i{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=(0,n.gV)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}_search(e){const t=[],s=this.fullTexts,n=e.split(" "),i=n.length;return s.forEach(((e,s)=>{let o=!0,r=0;for(let t=0;tthis._search(e))).reduce(((e,t)=>(e.push(...t),e)),[]);return t.sort(((e,t)=>e.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars)),new Set(t.map((e=>e.what)))}}}}]); -//# sourceMappingURL=27.0409c6d29d5c2ee62ee6.chunk.js.map \ No newline at end of file diff --git a/public/27.0409c6d29d5c2ee62ee6.chunk.js.map b/public/27.0409c6d29d5c2ee62ee6.chunk.js.map deleted file mode 100644 index e05244e2a..000000000 --- a/public/27.0409c6d29d5c2ee62ee6.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"27.0409c6d29d5c2ee62ee6.chunk.js","mappings":"6IAgBe,MAAMA,EAWnBC,YAAsBC,EAjBD,GAiBC,KAAAA,cAAAA,EAVf,KAAAC,QAAU,EACP,KAAAC,MAAoC,GACpC,KAAAC,UAAsC,IAAIC,IAE1C,KAAAC,YAA6B,KAC7B,KAAAC,cAA4B,KAE5B,KAAAC,KAAM,QAAO,KAAM,YAI3BC,KAAKC,cAAe,QAAS,IAAMD,KAAKE,iBAAiB,IAAI,GAGxDC,QACLH,KAAKL,UAAUQ,QAEfH,KAAKN,MAAMU,OAAS,EAOfC,OACFL,KAAKH,cAGRG,KAAKH,YAAc,IAAIS,SAAQ,CAACC,EAASC,KACvCR,KAAKF,cAAgBS,MAUlBE,SACDT,KAAKF,gBAETE,KAAKF,gBACLE,KAAKF,cAAgBE,KAAKH,YAAc,KAExCG,KAAKC,gBAGSS,YAAYC,G,qCAC1B,IAAGX,KAAKH,YAAR,CAIAG,KAAKL,UAAUiB,IAAID,GAMnB,UAIQX,KAAKa,SAASF,GACpB,MAAMG,GACF,CAAC,iBAAkB,mBAAmBC,SAASD,IACjDd,KAAKD,IAAIiB,MAAM,wBAAyBF,GAI5Cd,KAAKL,UAAUsB,OAAON,GAMtBX,KAAKC,iB,+RAGGY,SAASF,GACjB,OAAOA,EAAKO,OAGJC,UACR,OAAOnB,KAAKN,MAAM0B,QAGVC,WAAWC,EAA4BC,GAC/CvB,KAAKN,MAAM4B,GAAQC,GACnBvB,KAAKC,eAGGC,cAAcS,GACtB,MAAIX,KAAKN,MAAMU,QAAUJ,KAAKH,aAAgBG,KAAKR,cAAgB,GAAKQ,KAAKL,UAAU6B,MAAQxB,KAAKR,eAIpG,EAAG,CAOD,GANGmB,GACD,OAAiBX,KAAKN,MAAOiB,GAE7BA,EAAOX,KAAKmB,WAGXR,EAGD,MAFAX,KAAKU,YAAYC,GAKnBA,EAAO,WAEDX,KAAKL,UAAU6B,KAAOxB,KAAKR,eAAiBQ,KAAKN,MAAMU,QAI1DqB,KAAKF,GACVvB,KAAKqB,WAAW,OAAQE,GAGnBG,QAAQH,GACbvB,KAAKqB,WAAW,UAAWE,M,gCC9H/B,MAEA,EAF2C,CAAC,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAK,EAAK,MAAM,EAAK,MAAM,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,KAAK,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,IAAI,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,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","sources":["webpack://tweb/./src/components/lazyLoadQueueBase.ts","webpack://tweb/./src/config/latinizeMap.ts","webpack://tweb/./src/helpers/array/filterUnique.ts","webpack://tweb/./src/helpers/array/insertInDescendSortedArray.ts","webpack://tweb/./src/helpers/assumeType.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/helpers/callbackify.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/object/getObjectKeysAndSort.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/slicedArray.ts","webpack://tweb/./src/helpers/compareValue.ts","webpack://tweb/./src/helpers/long/compareLong.ts","webpack://tweb/./src/lib/appManagers/utils/chats/getParticipantPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/chats/hasRights.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndex.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndexKey.ts","webpack://tweb/./src/lib/appManagers/utils/inlineBots/generateQId.ts","webpack://tweb/./src/lib/appManagers/utils/messages/filterMessagesByInputFilter.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getAlbumText.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/users/canSendToUser.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/lib/richTextProcessor/fixEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrl.ts","webpack://tweb/./src/lib/richTextProcessor/parseMarkdown.ts","webpack://tweb/./src/lib/richTextProcessor/wrapPlainText.ts","webpack://tweb/./src/lib/searchIndex.ts","webpack://tweb/./src/helpers/array/flatten.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 indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\nimport throttle from \"../helpers/schedulers/throttle\";\nimport { logger, LogTypes } from \"../lib/logger\";\n\nconst PARALLEL_LIMIT = 8;\n\nexport type LazyLoadElementBase = {\n load: () => Promise\n};\n\nexport default class LazyLoadQueueBase {\n public queueId = 0;\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n protected lockPromise: Promise = null;\n protected unlockResolve: () => void = null;\n\n protected log = logger('LL', LogTypes.Error);\n protected processQueue: () => void;\n\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\n this.processQueue = throttle(() => this._processQueue(), 20, false);\n }\n\n public clear() {\n this.inProcess.clear(); // ацтеки забьются, будет плохо\n\n this.queue.length = 0;\n // unreachable code\n /* for(let item of this.inProcess) { \n this.lazyLoadMedia.push(item);\n } */\n }\n\n public lock() {\n if(this.lockPromise) return;\n\n //const perf = performance.now();\n this.lockPromise = new Promise((resolve, reject) => {\n this.unlockResolve = resolve;\n });\n\n /* if(DEBUG) {\n this.lockPromise.then(() => {\n this.log('was locked for:', performance.now() - perf);\n });\n } */\n }\n\n public unlock() {\n if(!this.unlockResolve) return;\n\n this.unlockResolve();\n this.unlockResolve = this.lockPromise = null;\n\n this.processQueue();\n }\n\n protected async processItem(item: LazyLoadElementBase) {\n if(this.lockPromise) {\n return;\n }\n\n this.inProcess.add(item);\n\n /* if(DEBUG) {\n this.log('will load media', this.lockPromise, item);\n } */\n\n try {\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\n //await item.load(item.div);\n await this.loadItem(item);\n } catch(err) {\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\n this.log.error('loadMediaQueue error:', err/* , item */);\n }\n }\n\n this.inProcess.delete(item);\n\n /* if(DEBUG) {\n this.log('loaded media', item);\n } */\n\n this.processQueue();\n }\n\n protected loadItem(item: LazyLoadElementBase) {\n return item.load();\n }\n\n protected getItem() {\n return this.queue.shift();\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\n this.queue[method](el);\n this.processQueue();\n }\n\n protected _processQueue(item?: LazyLoadElementBase) {\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\n\n //console.log('_processQueue start');\n let added = 0;\n do {\n if(item) {\n indexOfAndSplice(this.queue, item);\n } else {\n item = this.getItem();\n }\n \n if(item) {\n this.processItem(item);\n } else {\n break;\n }\n\n item = null;\n ++added;\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\n //console.log('_processQueue end, added', added, this.queue.length);\n }\n\n public push(el: LazyLoadElementBase) {\n this.addElement('push', el);\n }\n\n public unshift(el: LazyLoadElementBase) {\n this.addElement('unshift', 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 * 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// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nconst LatinizeMap: {[k: string]: string} = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','Ꝫ': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','ᴄ': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','ᴏ': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','ꜱ': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','ᴜ': 'U','ᴠ': 'V','ᴡ': 'W','ʏ': 'Y','ᴢ': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','ᶃ': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','ẝ': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','ᴑ': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','ꝸ': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','ᶌ': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\n\nexport default LatinizeMap;\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","export default function insertInDescendSortedArray(array: Array, element: T, getProperty: K, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: (element: T) => number, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: K | ((element: T) => T[K]), pos?: number): number {\n if(typeof(getProperty) !== 'function') {\n const property = getProperty;\n getProperty = (element) => element[property];\n }\n\n const sortProperty: number = getProperty(element);\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || getProperty(prev) >= sortProperty) && (!next || getProperty(next) <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n \n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= getProperty(array[len - 1])) {\n return array.push(element) - 1;\n } else if(sortProperty >= getProperty(array[0])) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > getProperty(array[i])) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\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","/*\n * 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 callbackify, R>(\n smth: T, \n callback: (result: Awaited) => R\n): R {\n if(smth instanceof Promise) {\n // @ts-ignore\n return smth.then(callback);\n } else {\n return callback(smth as any);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\r\n","export default function getObjectKeysAndSort(object: {[key: string]: any} | Map, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map((i) => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from \"../../environment/ctx\";\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\nimport noop from \"../noop\";\r\n\r\nexport type DebounceReturnType = { \r\n (...args: Parameters): Promise>>; \r\n clearTimeout(): void; \r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n \r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport indexOfAndSplice from \"./array/indexOfAndSplice\";\r\nimport compareValue from \"./compareValue\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number | string;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n getEnds: () => {top: boolean, bottom: boolean, both: boolean};\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n // new(...items: T[]): Slice;\r\n new(length: number): Slice;\r\n}\r\n\r\nexport type SliceSerialized = {\r\n values: Slice,\r\n isEnd: {\r\n top: boolean,\r\n bottom: boolean,\r\n both: boolean\r\n }\r\n};\r\n\r\nexport type SlicedArraySerialized = {\r\n slices: SliceSerialized[]\r\n};\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n\r\n getEnds() {\r\n return {\r\n top: this.isEnd(SliceEnd.Top),\r\n bottom: this.isEnd(SliceEnd.Bottom),\r\n both: this.isEnd(SliceEnd.Both)\r\n };\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end &= ~side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as ItemType[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: T[]) {\r\n //const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n \r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: T[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n \r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(compareValue(slice[0], s[0]) === 1) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n \r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n \r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // * \r\n \r\n get first() {\r\n return this.slices[0];\r\n }\r\n \r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: T) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: T) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n \r\n for(; offset < slice.length; ++offset) {\r\n if(compareValue(maxId, slice[offset]) >= 0) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice, \r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: T, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n // if(topFulfilled) sliced.isEnd(SliceEnd.Top);\r\n // if(bottomFulfilled) sliced.isEnd(SliceEnd.Bottom);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: T[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: T[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: T) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public deleteSlice(slice: Slice) {\r\n indexOfAndSplice(this.slices, slice);\r\n }\r\n\r\n public toJSON() {\r\n const slices: SlicedArraySerialized['slices'] = this.slices.map((slice) => {\r\n return {\r\n values: slice.slice(),\r\n isEnd: slice.getEnds()\r\n };\r\n });\r\n\r\n const serialized: SlicedArraySerialized = {\r\n slices\r\n };\r\n\r\n return JSON.stringify(serialized);\r\n }\r\n\r\n public static fromJSON(json: string) {\r\n const parsed: SlicedArraySerialized = JSON.parse(json);\r\n const sliced = new SlicedArray();\r\n parsed.slices.forEach((slice) => {\r\n const inserted = sliced.insertSlice(slice.values) || sliced.first;\r\n if(slice.isEnd.top) inserted.setEnd(SliceEnd.Top);\r\n if(slice.isEnd.bottom) inserted.setEnd(SliceEnd.Bottom);\r\n });\r\n\r\n return sliced;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","import compareLong from \"./long/compareLong\";\n\nexport default function compareValue(val1: string | number, val2: typeof val1) {\n if((val1 as number).toExponential) {\n const diff = (val1 as number) - (val2 as number);\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n return compareLong(val1 as string, val2 as string);\n}\n","/*\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 compareLong(str1: string, str2: string) {\n const str1Length = str1.length;\n if(str1Length !== str2.length) {\n const diff = str1Length - str2.length;\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n const maxPartLength = 15;\n for(let i = 0; i < str1Length; i += maxPartLength) {\n const v1 = +str1.slice(i, i + maxPartLength);\n const v2 = +str2.slice(i, i + maxPartLength);\n const diff = v1 - v2;\n if(diff) {\n return diff;\n }\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\nimport { ChannelParticipant, ChatParticipant } from \"../../../../layer\";\nimport getPeerId from \"../peers/getPeerId\";\n\nexport default function getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n}\n","/*\n * 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, ChatAdminRights, ChatBannedRights } from \"../../../../layer\";\nimport { ChatRights } from \"../../appChatsManager\";\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 */\nexport default function hasRights(chat: Chat, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n // (chat as any).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\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 { Dialog } from \"../../../../layer\";\nimport getDialogIndexKey from \"./getDialogIndexKey\";\n\nexport default function getDialogIndex(\n dialog: Dialog.dialog, \n indexKey: ReturnType = getDialogIndexKey(dialog.folder_id)\n) {\n return dialog && dialog[indexKey];\n}\n","/*\n * 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 } from \"../../../../layer\";\n\nexport default function getDialogIndexKey(orderIndex?: DialogFilter.dialogFilter['orderIndex']) {\n return `index_${orderIndex}` as const;\n // return filterId !== undefined && filterId > 1 ? `filter_${filterId}` as const : 'main' as const;\n // const indexStr = filterId > 1 ? \n // `index_${filterId}` as const : \n // 'index' as const;\n\n // return indexStr;\n}\n","import { MessagesBotResults } from \"../../../../layer\";\n\nexport default function generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\n return queryId + '_' + resultId;\n}\n","/*\n * 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, MessageMedia, MessageEntity, MessageAction } from \"../../../../layer\";\nimport matchUrl from \"../../../richTextProcessor/matchUrl\";\nimport type { MyDocument } from \"../../appDocsManager\";\nimport type { MyInputMessagesFilter, MyMessage } from \"../../appMessagesManager\";\n\nexport default function filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: Array, limit: number) {\n if(inputFilter === 'inputMessagesFilterEmpty') {\n return history;\n }\n\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n // excludeDocTypes.push('video');\n neededDocTypes.push(undefined, 'photo', 'pdf');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = history[i];\n if(!message) continue;\n\n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n\n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && \n (\n (neededDocTypes.length && !neededDocTypes.includes(doc.type)) || \n excludeDocTypes.includes(doc.type)\n )\n ) {\n continue;\n }\n\n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find((e) => goodEntities.includes(e._)) || matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find((flag) => message.pFlags[flag])) {\n found = true;\n } */\n\n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n}\n","import assumeType from \"../../../../helpers/assumeType\";\nimport { Message, MessageEntity } from \"../../../../layer\";\n\nexport default function getAlbumText(messages: Message.message[]) {\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const m of messages) {\n assumeType(m);\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n}\n","import isObject from \"../../../../helpers/object/isObject\";\nimport { 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 | 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 { User } from \"../../../../layer\";\nimport { REPLIES_PEER_ID } from \"../../../mtproto/mtproto_config\";\n\nexport default function canSendToUser(user: User.user) {\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\n\nexport default function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach((entity) => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n}\n","import { URL_REG_EXP } from \".\";\n\nexport default function matchUrl(text: string) {\n return !text ? null : text.match(URL_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 * 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 { MARKDOWN_ENTITIES, MARKDOWN_REG_EXP } from \".\";\nimport { MessageEntity } from \"../../layer\";\nimport combineSameEntities from \"./combineSameEntities\";\nimport findConflictingEntity from \"./findConflictingEntity\";\nimport mergeEntities from \"./mergeEntities\";\n\nexport default function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n  /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(MARKDOWN_REG_EXP)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n\n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: MARKDOWN_ENTITIES[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n //offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n\n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n \n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n}\n","/*\n * 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 encodeSpoiler from \"./encodeSpoiler\";\n\n/**\n * ! This function is still unsafe to use with .innerHTML\n */\nexport default function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n entities.forEach((entity) => {\n if(entity._ === 'messageEntitySpoiler') {\n text = encodeSpoiler(text, entity).text;\n }\n });\n\n return text;\n // if(entities?.length) {\n // entities = entities.filter((entity) => entity._ === 'messageEntitySpoiler');\n // }\n\n // return wrapRichText(text, {\n // entities, \n // noEncoding: true,\n // noTextFormat: true,\n // noLinebreaks: true,\n // noLinks: true\n // }).textContent;\n}\n","/*\n * 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 { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\nimport flatten from '../helpers/array/flatten';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n private _search(query: string) {\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const fullTexts = this.fullTexts;\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' '/* && !badCharsRe.test(fullText[idx - 1]) */)) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n return newFoundObjs;\n }\n\n public search(query: string) {\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const queries = query.split('\\x01');\n const newFoundObjs = flatten(queries.map((query) => this._search(query)));\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map((o) => o.what));\n\n return newFoundObjs2;\n }\n}\n","export default function flatten(arr: T[][]): T[] {\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\n}\n"],"names":["LazyLoadQueueBase","constructor","parallelLimit","queueId","queue","inProcess","Set","lockPromise","unlockResolve","log","this","processQueue","_processQueue","clear","length","lock","Promise","resolve","reject","unlock","processItem","item","add","loadItem","err","includes","error","delete","load","getItem","shift","addElement","method","el","size","push","unshift","filterUnique","arr","insertInDescendSortedArray","array","element","getProperty","pos","property","sortProperty","undefined","indexOf","prev","next","splice","len","i","console","assumeType","x","bytesCmp","bytes1","bytes2","bytesFromHex","hexString","bytes","Uint8Array","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","callbackify","smth","callback","then","getMiddleware","cleanupObj","cleaned","clean","get","additionalCallback","_cleanupObj","getObjectKeysAndSort","object","sort","ids","Map","keys","Object","map","a","b","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","args","_resolve","_reject","apply","clearTimeout","_waitingTimeout","catch","SliceEnd","compareValue","val1","val2","toExponential","diff","str1","str2","str1Length","slice","compareLong","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","static","slicedArray","Array","end","None","isEnd","side","Top","last","Bottom","Both","setEnd","getEnds","top","bottom","both","unsetEnd","deleteCount","items","ret","super","idx","insertSlice","flatten","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","s","prevSlice","nextSlice","findSlice","index","findSliceOffset","maxId","offset","sliceMe","offsetId","add_offset","limit","sliceOffset","sliceStart","max","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","found","deleteSlice","indexOfAndSplice","toJSON","serialized","values","JSON","stringify","json","parsed","parse","forEach","inserted","getParticipantPeerId","participant","peer","user_id","toPeerId","hasRights","chat","action","rights","isThread","_","pFlags","deactivated","isCheckingRightsForSelf","creator","left","megagroup","admin_rights","banned_rights","default_banned_rights","myFlags","post_messages","broadcast","getDialogIndex","dialog","indexKey","folder_id","getDialogIndexKey","orderIndex","generateQId","queryId","resultId","filterMessagesByInputFilter","inputFilter","history","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","message","media","doc","document","type","goodEntities","totalEntities","find","e","getAlbumText","messages","entities","foundMessages","m","getPeerId","peerId","isPeerId","userId","chatId","channel_id","chat_id","isUser","peerParams","split","canSendToUser","user","deleted","id","ConnectionStatus","fixEmoji","text","replace","match","string","entity","matchUrl","parseMarkdown","raw","currentEntities","noTrim","pushedEntity","pushEntity","newTextParts","rawOffset","matchIndex","language","isSOH","toUserId","url","newText","join","wrapPlainText","SearchIndex","options","minChars","fullTexts","indexObject","searchText","trim","set","_search","query","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","search","reduce","acc","val","o"],"sourceRoot":""} \ No newline at end of file diff --git a/public/292.fd1c65cea6105dcd77a3.chunk.js b/public/292.fd1c65cea6105dcd77a3.chunk.js new file mode 100644 index 000000000..caa4ae4ca --- /dev/null +++ b/public/292.fd1c65cea6105dcd77a3.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[292],{4421:(e,t,s)=>{s.d(t,{Z:()=>r});var n=s(1655),i=s(6724),o=s(5003);class r{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=(0,o.kg)("LL",o.v9.Error),this.processQueue=(0,i.Z)((()=>this._processQueue()),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise(((e,t)=>{this.unlockResolve=e})))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return t=this,s=void 0,i=function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(null==e?void 0:e.type)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}},new((n=void 0)||(n=Promise))((function(e,o){function r(e){try{c(i.next(e))}catch(e){o(e)}}function l(e){try{c(i.throw(e))}catch(e){o(e)}}function c(t){var s;t.done?e(t.value):(s=t.value,s instanceof n?s:new n((function(e){e(s)}))).then(r,l)}c((i=i.apply(t,s||[])).next())}));var t,s,n,i}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit))do{if(e?(0,n.Z)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.size{s.d(t,{Z:()=>n});const n={Á:"A",Ă:"A",Ắ:"A",Ặ:"A",Ằ:"A",Ẳ:"A",Ẵ:"A",Ǎ:"A",Â:"A",Ấ:"A",Ậ:"A",Ầ:"A",Ẩ:"A",Ẫ:"A",Ä:"A",Ǟ:"A",Ȧ:"A",Ǡ:"A",Ạ:"A",Ȁ:"A",À:"A",Ả:"A",Ȃ:"A",Ā:"A",Ą:"A",Å:"A",Ǻ:"A",Ḁ:"A",Ⱥ:"A",Ã:"A",Ꜳ:"AA",Æ:"AE",Ǽ:"AE",Ǣ:"AE",Ꜵ:"AO",Ꜷ:"AU",Ꜹ:"AV",Ꜻ:"AV",Ꜽ:"AY",Ḃ:"B",Ḅ:"B",Ɓ:"B",Ḇ:"B",Ƀ:"B",Ƃ:"B",Ć:"C",Č:"C",Ç:"C",Ḉ:"C",Ĉ:"C",Ċ:"C",Ƈ:"C",Ȼ:"C",Ď:"D",Ḑ:"D",Ḓ:"D",Ḋ:"D",Ḍ:"D",Ɗ:"D",Ḏ:"D",Dz:"D",Dž:"D",Đ:"D",Ƌ:"D",DZ:"DZ",DŽ:"DZ",É:"E",Ĕ:"E",Ě:"E",Ȩ:"E",Ḝ:"E",Ê:"E",Ế:"E",Ệ:"E",Ề:"E",Ể:"E",Ễ:"E",Ḙ:"E",Ë:"E",Ė:"E",Ẹ:"E",Ȅ:"E",È:"E",Ẻ:"E",Ȇ:"E",Ē:"E",Ḗ:"E",Ḕ:"E",Ę:"E",Ɇ:"E",Ẽ:"E",Ḛ:"E",Ꝫ:"ET",Ḟ:"F",Ƒ:"F",Ǵ:"G",Ğ:"G",Ǧ:"G",Ģ:"G",Ĝ:"G",Ġ:"G",Ɠ:"G",Ḡ:"G",Ǥ:"G",Ḫ:"H",Ȟ:"H",Ḩ:"H",Ĥ:"H",Ⱨ:"H",Ḧ:"H",Ḣ:"H",Ḥ:"H",Ħ:"H",Í:"I",Ĭ:"I",Ǐ:"I",Î:"I",Ï:"I",Ḯ:"I",İ:"I",Ị:"I",Ȉ:"I",Ì:"I",Ỉ:"I",Ȋ:"I",Ī:"I",Į:"I",Ɨ:"I",Ĩ:"I",Ḭ:"I",Ꝺ:"D",Ꝼ:"F",Ᵹ:"G",Ꞃ:"R",Ꞅ:"S",Ꞇ:"T",Ꝭ:"IS",Ĵ:"J",Ɉ:"J",Ḱ:"K",Ǩ:"K",Ķ:"K",Ⱪ:"K",Ꝃ:"K",Ḳ:"K",Ƙ:"K",Ḵ:"K",Ꝁ:"K",Ꝅ:"K",Ĺ:"L",Ƚ:"L",Ľ:"L",Ļ:"L",Ḽ:"L",Ḷ:"L",Ḹ:"L",Ⱡ:"L",Ꝉ:"L",Ḻ:"L",Ŀ:"L",Ɫ:"L",Lj:"L",Ł:"L",LJ:"LJ",Ḿ:"M",Ṁ:"M",Ṃ:"M",Ɱ:"M",Ń:"N",Ň:"N",Ņ:"N",Ṋ:"N",Ṅ:"N",Ṇ:"N",Ǹ:"N",Ɲ:"N",Ṉ:"N",Ƞ:"N",Nj:"N",Ñ:"N",NJ:"NJ",Ó:"O",Ŏ:"O",Ǒ:"O",Ô:"O",Ố:"O",Ộ:"O",Ồ:"O",Ổ:"O",Ỗ:"O",Ö:"O",Ȫ:"O",Ȯ:"O",Ȱ:"O",Ọ:"O",Ő:"O",Ȍ:"O",Ò:"O",Ỏ:"O",Ơ:"O",Ớ:"O",Ợ:"O",Ờ:"O",Ở:"O",Ỡ:"O",Ȏ:"O",Ꝋ:"O",Ꝍ:"O",Ō:"O",Ṓ:"O",Ṑ:"O",Ɵ:"O",Ǫ:"O",Ǭ:"O",Ø:"O",Ǿ:"O",Õ:"O",Ṍ:"O",Ṏ:"O",Ȭ:"O",Ƣ:"OI",Ꝏ:"OO",Ɛ:"E",Ɔ:"O",Ȣ:"OU",Ṕ:"P",Ṗ:"P",Ꝓ:"P",Ƥ:"P",Ꝕ:"P",Ᵽ:"P",Ꝑ:"P",Ꝙ:"Q",Ꝗ:"Q",Ŕ:"R",Ř:"R",Ŗ:"R",Ṙ:"R",Ṛ:"R",Ṝ:"R",Ȑ:"R",Ȓ:"R",Ṟ:"R",Ɍ:"R",Ɽ:"R",Ꜿ:"C",Ǝ:"E",Ś:"S",Ṥ:"S",Š:"S",Ṧ:"S",Ş:"S",Ŝ:"S",Ș:"S",Ṡ:"S",Ṣ:"S",Ṩ:"S",ẞ:"SS",Ť:"T",Ţ:"T",Ṱ:"T",Ț:"T",Ⱦ:"T",Ṫ:"T",Ṭ:"T",Ƭ:"T",Ṯ:"T",Ʈ:"T",Ŧ:"T",Ɐ:"A",Ꞁ:"L",Ɯ:"M",Ʌ:"V",Ꜩ:"TZ",Ú:"U",Ŭ:"U",Ǔ:"U",Û:"U",Ṷ:"U",Ü:"U",Ǘ:"U",Ǚ:"U",Ǜ:"U",Ǖ:"U",Ṳ:"U",Ụ:"U",Ű:"U",Ȕ:"U",Ù:"U",Ủ:"U",Ư:"U",Ứ:"U",Ự:"U",Ừ:"U",Ử:"U",Ữ:"U",Ȗ:"U",Ū:"U",Ṻ:"U",Ų:"U",Ů:"U",Ũ:"U",Ṹ:"U",Ṵ:"U",Ꝟ:"V",Ṿ:"V",Ʋ:"V",Ṽ:"V",Ꝡ:"VY",Ẃ:"W",Ŵ:"W",Ẅ:"W",Ẇ:"W",Ẉ:"W",Ẁ:"W",Ⱳ:"W",Ẍ:"X",Ẋ:"X",Ý:"Y",Ŷ:"Y",Ÿ:"Y",Ẏ:"Y",Ỵ:"Y",Ỳ:"Y",Ƴ:"Y",Ỷ:"Y",Ỿ:"Y",Ȳ:"Y",Ɏ:"Y",Ỹ:"Y",Ź:"Z",Ž:"Z",Ẑ:"Z",Ⱬ:"Z",Ż:"Z",Ẓ:"Z",Ȥ:"Z",Ẕ:"Z",Ƶ:"Z",IJ:"IJ",Œ:"OE",ᴀ:"A",ᴁ:"AE",ʙ:"B",ᴃ:"B",ᴄ:"C",ᴅ:"D",ᴇ:"E",ꜰ:"F",ɢ:"G",ʛ:"G",ʜ:"H",ɪ:"I",ʁ:"R",ᴊ:"J",ᴋ:"K",ʟ:"L",ᴌ:"L",ᴍ:"M",ɴ:"N",ᴏ:"O",ɶ:"OE",ᴐ:"O",ᴕ:"OU",ᴘ:"P",ʀ:"R",ᴎ:"N",ᴙ:"R",ꜱ:"S",ᴛ:"T",ⱻ:"E",ᴚ:"R",ᴜ:"U",ᴠ:"V",ᴡ:"W",ʏ:"Y",ᴢ:"Z",á:"a",ă:"a",ắ:"a",ặ:"a",ằ:"a",ẳ:"a",ẵ:"a",ǎ:"a",â:"a",ấ:"a",ậ:"a",ầ:"a",ẩ:"a",ẫ:"a",ä:"a",ǟ:"a",ȧ:"a",ǡ:"a",ạ:"a",ȁ:"a",à:"a",ả:"a",ȃ:"a",ā:"a",ą:"a",ᶏ:"a",ẚ:"a",å:"a",ǻ:"a",ḁ:"a",ⱥ:"a",ã:"a",ꜳ:"aa",æ:"ae",ǽ:"ae",ǣ:"ae",ꜵ:"ao",ꜷ:"au",ꜹ:"av",ꜻ:"av",ꜽ:"ay",ḃ:"b",ḅ:"b",ɓ:"b",ḇ:"b",ᵬ:"b",ᶀ:"b",ƀ:"b",ƃ:"b",ɵ:"o",ć:"c",č:"c",ç:"c",ḉ:"c",ĉ:"c",ɕ:"c",ċ:"c",ƈ:"c",ȼ:"c",ď:"d",ḑ:"d",ḓ:"d",ȡ:"d",ḋ:"d",ḍ:"d",ɗ:"d",ᶑ:"d",ḏ:"d",ᵭ:"d",ᶁ:"d",đ:"d",ɖ:"d",ƌ:"d",ı:"i",ȷ:"j",ɟ:"j",ʄ:"j",dz:"dz",dž:"dz",é:"e",ĕ:"e",ě:"e",ȩ:"e",ḝ:"e",ê:"e",ế:"e",ệ:"e",ề:"e",ể:"e",ễ:"e",ḙ:"e",ë:"e",ė:"e",ẹ:"e",ȅ:"e",è:"e",ẻ:"e",ȇ:"e",ē:"e",ḗ:"e",ḕ:"e",ⱸ:"e",ę:"e",ᶒ:"e",ɇ:"e",ẽ:"e",ḛ:"e",ꝫ:"et",ḟ:"f",ƒ:"f",ᵮ:"f",ᶂ:"f",ǵ:"g",ğ:"g",ǧ:"g",ģ:"g",ĝ:"g",ġ:"g",ɠ:"g",ḡ:"g",ᶃ:"g",ǥ:"g",ḫ:"h",ȟ:"h",ḩ:"h",ĥ:"h",ⱨ:"h",ḧ:"h",ḣ:"h",ḥ:"h",ɦ:"h",ẖ:"h",ħ:"h",ƕ:"hv",í:"i",ĭ:"i",ǐ:"i",î:"i",ï:"i",ḯ:"i",ị:"i",ȉ:"i",ì:"i",ỉ:"i",ȋ:"i",ī:"i",į:"i",ᶖ:"i",ɨ:"i",ĩ:"i",ḭ:"i",ꝺ:"d",ꝼ:"f",ᵹ:"g",ꞃ:"r",ꞅ:"s",ꞇ:"t",ꝭ:"is",ǰ:"j",ĵ:"j",ʝ:"j",ɉ:"j",ḱ:"k",ǩ:"k",ķ:"k",ⱪ:"k",ꝃ:"k",ḳ:"k",ƙ:"k",ḵ:"k",ᶄ:"k",ꝁ:"k",ꝅ:"k",ĺ:"l",ƚ:"l",ɬ:"l",ľ:"l",ļ:"l",ḽ:"l",ȴ:"l",ḷ:"l",ḹ:"l",ⱡ:"l",ꝉ:"l",ḻ:"l",ŀ:"l",ɫ:"l",ᶅ:"l",ɭ:"l",ł:"l",lj:"lj",ſ:"s",ẜ:"s",ẛ:"s",ẝ:"s",ḿ:"m",ṁ:"m",ṃ:"m",ɱ:"m",ᵯ:"m",ᶆ:"m",ń:"n",ň:"n",ņ:"n",ṋ:"n",ȵ:"n",ṅ:"n",ṇ:"n",ǹ:"n",ɲ:"n",ṉ:"n",ƞ:"n",ᵰ:"n",ᶇ:"n",ɳ:"n",ñ:"n",nj:"nj",ó:"o",ŏ:"o",ǒ:"o",ô:"o",ố:"o",ộ:"o",ồ:"o",ổ:"o",ỗ:"o",ö:"o",ȫ:"o",ȯ:"o",ȱ:"o",ọ:"o",ő:"o",ȍ:"o",ò:"o",ỏ:"o",ơ:"o",ớ:"o",ợ:"o",ờ:"o",ở:"o",ỡ:"o",ȏ:"o",ꝋ:"o",ꝍ:"o",ⱺ:"o",ō:"o",ṓ:"o",ṑ:"o",ǫ:"o",ǭ:"o",ø:"o",ǿ:"o",õ:"o",ṍ:"o",ṏ:"o",ȭ:"o",ƣ:"oi",ꝏ:"oo",ɛ:"e",ᶓ:"e",ɔ:"o",ᶗ:"o",ȣ:"ou",ṕ:"p",ṗ:"p",ꝓ:"p",ƥ:"p",ᵱ:"p",ᶈ:"p",ꝕ:"p",ᵽ:"p",ꝑ:"p",ꝙ:"q",ʠ:"q",ɋ:"q",ꝗ:"q",ŕ:"r",ř:"r",ŗ:"r",ṙ:"r",ṛ:"r",ṝ:"r",ȑ:"r",ɾ:"r",ᵳ:"r",ȓ:"r",ṟ:"r",ɼ:"r",ᵲ:"r",ᶉ:"r",ɍ:"r",ɽ:"r",ↄ:"c",ꜿ:"c",ɘ:"e",ɿ:"r",ś:"s",ṥ:"s",š:"s",ṧ:"s",ş:"s",ŝ:"s",ș:"s",ṡ:"s",ṣ:"s",ṩ:"s",ʂ:"s",ᵴ:"s",ᶊ:"s",ȿ:"s",ɡ:"g",ß:"ss",ᴑ:"o",ᴓ:"o",ᴝ:"u",ť:"t",ţ:"t",ṱ:"t",ț:"t",ȶ:"t",ẗ:"t",ⱦ:"t",ṫ:"t",ṭ:"t",ƭ:"t",ṯ:"t",ᵵ:"t",ƫ:"t",ʈ:"t",ŧ:"t",ᵺ:"th",ɐ:"a",ᴂ:"ae",ǝ:"e",ᵷ:"g",ɥ:"h",ʮ:"h",ʯ:"h",ᴉ:"i",ʞ:"k",ꞁ:"l",ɯ:"m",ɰ:"m",ᴔ:"oe",ɹ:"r",ɻ:"r",ɺ:"r",ⱹ:"r",ʇ:"t",ʌ:"v",ʍ:"w",ʎ:"y",ꜩ:"tz",ú:"u",ŭ:"u",ǔ:"u",û:"u",ṷ:"u",ü:"u",ǘ:"u",ǚ:"u",ǜ:"u",ǖ:"u",ṳ:"u",ụ:"u",ű:"u",ȕ:"u",ù:"u",ủ:"u",ư:"u",ứ:"u",ự:"u",ừ:"u",ử:"u",ữ:"u",ȗ:"u",ū:"u",ṻ:"u",ų:"u",ᶙ:"u",ů:"u",ũ:"u",ṹ:"u",ṵ:"u",ᵫ:"ue",ꝸ:"um",ⱴ:"v",ꝟ:"v",ṿ:"v",ʋ:"v",ᶌ:"v",ⱱ:"v",ṽ:"v",ꝡ:"vy",ẃ:"w",ŵ:"w",ẅ:"w",ẇ:"w",ẉ:"w",ẁ:"w",ⱳ:"w",ẘ:"w",ẍ:"x",ẋ:"x",ᶍ:"x",ý:"y",ŷ:"y",ÿ:"y",ẏ:"y",ỵ:"y",ỳ:"y",ƴ:"y",ỷ:"y",ỿ:"y",ȳ:"y",ẙ:"y",ɏ:"y",ỹ:"y",ź:"z",ž:"z",ẑ:"z",ʑ:"z",ⱬ:"z",ż:"z",ẓ:"z",ȥ:"z",ẕ:"z",ᵶ:"z",ᶎ:"z",ʐ:"z",ƶ:"z",ɀ:"z",ff:"ff",ffi:"ffi",ffl:"ffl",fi:"fi",fl:"fl",ij:"ij",œ:"oe",st:"st",ₐ:"a",ₑ:"e",ᵢ:"i",ⱼ:"j",ₒ:"o",ᵣ:"r",ᵤ:"u",ᵥ:"v",ₓ:"x",Ё:"YO",Й:"I",Ц:"TS",У:"U",К:"K",Е:"E",Н:"N",Г:"G",Ш:"SH",Щ:"SCH",З:"Z",Х:"H",Ъ:"",ё:"yo",й:"i",ц:"ts",у:"u",к:"k",е:"e",н:"n",г:"g",ш:"sh",щ:"sch",з:"z",х:"h",ъ:"",Ф:"F",Ы:"I",В:"V",А:"A",П:"P",Р:"R",О:"O",Л:"L",Д:"D",Ж:"ZH",Э:"E",ф:"f",ы:"i",в:"v",а:"a",п:"p",р:"r",о:"o",л:"l",д:"d",ж:"zh",э:"e",Я:"Ya",Ч:"CH",С:"S",М:"M",И:"I",Т:"T",Ь:"",Б:"B",Ю:"YU",я:"ya",ч:"ch",с:"s",м:"m",и:"i",т:"t",ь:"",б:"b",ю:"yu"}},6690:(e,t,s)=>{function n(e){return[...new Set(e)]}s.d(t,{Z:()=>n})},6519:(e,t,s)=>{function n(e,t,s,n){if("function"!=typeof s){const e=s;s=t=>t[e]}const i=s(t);if(void 0===n&&-1!==(n=e.indexOf(t))){const t=e[n-1],o=e[n+1];if((!t||s(t)>=i)&&(!o||s(o)<=i))return n;e.splice(n,1)}const o=e.length;if(!o||i<=s(e[o-1]))return e.push(t)-1;if(i>=s(e[0]))return e.unshift(t),0;for(let n=0;ns(e[n]))return e.splice(n,0,t),n;return console.error("wtf",e,t),e.indexOf(t)}s.d(t,{Z:()=>n})},8938:(e,t,s)=>{function n(e){}s.d(t,{Z:()=>n})},4484:(e,t,s)=>{function n(e,t){const s=e.length;if(s!==t.length)return!1;for(let n=0;nn})},3306:(e,t,s)=>{function n(e){const t=e.length,s=new Uint8Array(Math.ceil(t/2));let n=0;t%2&&(s[n++]=parseInt(e.charAt(0),16));for(let i=n;in})},3692:(e,t,s)=>{function n(e){return e instanceof Uint8Array?e:"string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}s.d(t,{Z:()=>n})},6654:(e,t,s)=>{function n(e,t){return e instanceof Promise?e.then(t):t(e)}s.d(t,{Z:()=>n})},3624:(e,t,s)=>{s.d(t,{k:()=>n});const n=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:t=>{const s=e;return()=>!s.cleaned&&(!t||t())}}}},7401:(e,t,s)=>{function n(e,t="asc"){if(!e)return[];const s=e instanceof Map?[...e.keys()]:Object.keys(e).map((e=>+e));return"asc"===t?s.sort(((e,t)=>e-t)):s.sort(((e,t)=>t-e))}s.d(t,{Z:()=>n})},5701:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(6761),i=s(319);function o(e,t,s=!0,o=!0){let r,l,c,u,a=!1;const h=t=>{const s=c,n=u;try{s(e.apply(null,t))}catch(e){console.error("debounce error",e),n(e)}},d=(...e)=>{l||(l=new Promise(((e,t)=>(c=e,u=t)))),r?(clearTimeout(r),a=!0,u(),l=new Promise(((e,t)=>(c=e,u=t)))):s&&(h(e),a=!1);const d=n.Z.setTimeout((()=>{!o||s&&!a||h(e),r===d&&(r=l=c=u=void 0,a=!1)}),t);return r=d,l.catch(i.Z),l};return d.clearTimeout=()=>{r&&(n.Z.clearTimeout(r),u(),r=l=c=u=void 0,a=!1)},d}},252:(e,t,s)=>{s.d(t,{D:()=>n,Z:()=>l});var n,i=s(410),o=s(1655);function r(e,t){if(e.toExponential){const s=e-t;return s<0?-1:s>0?1:0}return function(e,t){const s=e.length;if(s!==t.length){const e=s-t.length;return e<0?-1:e>0?1:0}for(let n=0;n=2)for(let t=0,s=this.slices.length;t=0)return{slice:t,offset:e===t[n]?n:n-1}}if(t&&t.isEnd(n.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let i=this.slice,o=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;i=t.slice,o=r=t.offset,i.includes(e)&&(r+=1)}const l=Math.max(r+t,0),c=r+t+s,u=i.slice(l,c),a=t<0?s+t:s,h=Math.abs(t),d=i.length-r>=a||!!i.isEnd(n.Top)&&(u.setEnd(n.Top),!0),f=r-h>=0||!!i.isEnd(n.Bottom)&&(u.setEnd(n.Bottom),!0);return{slice:u,offsetIdOffset:o,fulfilled:n.None|(d&&f?n.Both:(d?n.Top:n.None)|(f?n.Bottom:n.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(n.Bottom)||(t=this.constructSlice(),t.setEnd(n.Bottom),this.slices.unshift(t)):t.setEnd(n.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(n.Top)||(t=this.constructSlice(),t.setEnd(n.Top),this.slices.push(t)):t.setEnd(n.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}deleteSlice(e){(0,o.Z)(this.slices,e)}toJSON(){const e={slices:this.slices.map((e=>({values:e.slice(),isEnd:e.getEnds()})))};return JSON.stringify(e)}static fromJSON(e){const t=JSON.parse(e),s=new l;return t.slices.forEach((e=>{const t=s.insertSlice(e.values)||s.first;e.isEnd.top&&t.setEnd(n.Top),e.isEnd.bottom&&t.setEnd(n.Bottom)})),s}}i.GO&&(i.GO.SlicedArray=l)},2566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2946);function i(e){return e.peer?(0,n.Z)(e.peer):e.user_id.toPeerId()}},7120:(e,t,s)=>{function n(e,t,s,n){if("chatEmpty"===e._)return!1;if(e.pFlags.deactivated&&"view_messages"!==t)return!1;const i=void 0===s;if(e.pFlags.creator&&i)return!0;if("chatForbidden"===e._||"channelForbidden"===e._||e.pFlags.left&&!e.pFlags.megagroup)return!1;if(!s&&!(s=e.admin_rights||e.banned_rights||e.default_banned_rights))return!1;let o={};switch(s&&(o=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!n&&e.pFlags.left)return!1;if("chatBannedRights"===s._&&o[t])return!1;if("channel"===e._&&!e.pFlags.megagroup&&!o.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!o[t];case"pin_messages":return"chatAdminRights"===s._?o[t]||!!o.post_messages:!o[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?o[t]:!o[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!o.ban_users;case"view_participants":return!("chat"!==e._&&e.pFlags.broadcast&&!e.pFlags.creator&&!e.admin_rights)}return!0}s.d(t,{Z:()=>n})},8050:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(3385);function i(e,t=(0,n.Z)(e.folder_id)){return null==e?void 0:e[t]}},3385:(e,t,s)=>{function n(e){return`index_${e}`}s.d(t,{Z:()=>n})},515:(e,t,s)=>{function n(e,t){return e+"_"+t}s.d(t,{Z:()=>n})},6566:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2342);function i(e,t,s){if("inputMessagesFilterEmpty"===e)return t;const i=[];if(!t.length)return i;let o=!0;const r={},l=[],c=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,l.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,l.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,l.push(void 0,"photo","pdf");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,l.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,l.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,l.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,l.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:o=!1}if(!o)return i;for(let e=0,o=t.length;ee.includes(t._)))||(0,n.Z)(o.message))&&(u=!0)}}else r.avatar&&o.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(o.action._)&&(u=!0);if(u&&(i.push(o),i.length>=s))break}return i}},2381:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(8938);function i(e){let t,s,i,o=0;for(const r of e)if((0,n.Z)(r),r.message){if(++o>1)break;t=r.message,s=r.totalEntities,i=r.entities}return o>1&&(t=void 0,s=void 0,i=void 0),{message:t,entities:i,totalEntities:s}}},2946:(e,t,s)=>{s.d(t,{Z:()=>o});var n=s(5880),i=s(1507);function o(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,n.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const s=e.channel_id||e.chat_id;return void 0!==s?s.toPeerId(!0):i.NM}if(!e)return i.NM;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}},13:(e,t,s)=>{function n(e){var t;return null===(t=e.video_thumbs)||void 0===t?void 0:t[0]}s.d(t,{Z:()=>n})},8493:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1507);function i(e){return!e.pFlags.deleted&&e.id.toPeerId()!==n.hj}},9174:(e,t,s)=>{var n;s.d(t,{Q:()=>n}),function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(n||(n={}))},7746:(e,t,s)=>{function n(e,t){return e.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,((e,s,n)=>{if(t){const n=e.length;s+=n,t.forEach((e=>{const t=e.offset+e.length;t===s?e.length+=n:t>s&&(e.offset+=n)}))}return e+"️"}))}s.d(t,{Z:()=>n})},2342:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(2423);function i(e){return e?e.match(n.it):null}},2821:(e,t,s)=>{s.d(t,{Z:()=>l});var n=s(2423),i=s(6875),o=s(8859),r=s(6241);function l(e,t,s){const l=[];let c=!1;const u=e=>(0,o.Z)(t,e)?c=!1:(l.push(e),c=!0),a=[];let h,d=0;for(;h=e.match(n.QB);){const t=d+h.index;a.push(e.substr(0,h.index));const s=h[3]||h[8]||h[11]||h[13];let i;if(d-=s.length,d+=s.length,c=!1,s.match(/^`*$/))a.push(h[0]);else if(h[3])i={_:"messageEntityPre",language:"",offset:t+h[1].length,length:s.length},u(i)&&("\n"===h[5]&&(h[5]="",d-=1),a.push(h[1]+s+h[5]),d-=h[2].length+h[4].length);else if(h[7]){const e=""===h[6];i={_:n.SC[h[7]],offset:t+(e?0:h[6].length),length:s.length},u(i)&&(e?a.push(s):a.push(h[6]+s+h[9]),d-=2*h[7].length+(e?2:0))}else h[11]?(i={_:"messageEntityMentionName",user_id:h[10].toUserId(),offset:t,length:s.length},u(i)&&(a.push(s),d-=h[0].length-s.length)):h[12]&&(i={_:"messageEntityTextUrl",url:h[14],offset:t,length:s.length},u(i)&&(a.push(s),d-=h[12].length-s.length));c||a.push(h[0]),e=e.substr(h.index+h[0].length),d+=h.index+h[0].length}a.push(e);let f=a.join("");f.replace(/\s+/g,"").length||(f=e,l.splice(0,l.length)),(0,r.Z)(t,l),(0,i.Z)(t);let g=f.length;if(!s){f=f.replace(/^\s*/,"");let e=g-f.length;e&&t.forEach((t=>{t.offset=Math.max(0,t.offset-e)})),f=f.replace(/\s*$/,""),e=g-f.length,g=f.length,e&&t.forEach((e=>{e.offset+e.length>g&&(e.length=g-e.offset)}))}return f}},2491:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(1379);function i(e,t=[]){return t.forEach((t=>{"messageEntitySpoiler"===t._&&(e=(0,n.Z)(e,t).text)})),e}},5082:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(467);class i{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=(0,n.gV)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}_search(e){const t=[],s=this.fullTexts,n=e.split(" "),i=n.length;return s.forEach(((e,s)=>{let o=!0,r=0;for(let t=0;tthis._search(e))).reduce(((e,t)=>(e.push(...t),e)),[]);return t.sort(((e,t)=>e.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars)),new Set(t.map((e=>e.what)))}}}}]); +//# sourceMappingURL=292.fd1c65cea6105dcd77a3.chunk.js.map \ No newline at end of file diff --git a/public/292.fd1c65cea6105dcd77a3.chunk.js.map b/public/292.fd1c65cea6105dcd77a3.chunk.js.map new file mode 100644 index 000000000..05ebfd4de --- /dev/null +++ b/public/292.fd1c65cea6105dcd77a3.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"292.fd1c65cea6105dcd77a3.chunk.js","mappings":"8IAgBe,MAAMA,EAWnBC,YAAsBC,EAjBD,GAiBC,KAAAA,cAAAA,EAVf,KAAAC,QAAU,EACP,KAAAC,MAAoC,GACpC,KAAAC,UAAsC,IAAIC,IAE1C,KAAAC,YAA6B,KAC7B,KAAAC,cAA4B,KAE5B,KAAAC,KAAM,QAAO,KAAM,YAI3BC,KAAKC,cAAe,QAAS,IAAMD,KAAKE,iBAAiB,IAAI,GAGxDC,QACLH,KAAKL,UAAUQ,QAEfH,KAAKN,MAAMU,OAAS,EAOfC,OACFL,KAAKH,cAGRG,KAAKH,YAAc,IAAIS,SAAQ,CAACC,EAASC,KACvCR,KAAKF,cAAgBS,MAUlBE,SACDT,KAAKF,gBAETE,KAAKF,gBACLE,KAAKF,cAAgBE,KAAKH,YAAc,KAExCG,KAAKC,gBAGSS,YAAYC,G,qCAC1B,IAAGX,KAAKH,YAAR,CAIAG,KAAKL,UAAUiB,IAAID,GAMnB,UAIQX,KAAKa,SAASF,GACpB,MAAMG,GAC+B,IAAIlB,IAAI,CAAC,iBAAkB,oBAC/CmB,IAAKD,MAAAA,OAAG,EAAHA,EAAkBE,OACtChB,KAAKD,IAAIkB,MAAM,wBAAyBH,GAI5Cd,KAAKL,UAAUuB,OAAOP,GAMtBX,KAAKC,iB,+RAGGY,SAASF,GACjB,OAAOA,EAAKQ,OAGJC,UACR,OAAOpB,KAAKN,MAAM2B,QAGVC,WAAWC,EAA4BC,GAC/CxB,KAAKN,MAAM6B,GAAQC,GACnBxB,KAAKC,eAGGC,cAAcS,GACtB,MAAIX,KAAKN,MAAMU,QAAUJ,KAAKH,aAAgBG,KAAKR,cAAgB,GAAKQ,KAAKL,UAAU8B,MAAQzB,KAAKR,eAIpG,EAAG,CAOD,GANGmB,GACD,OAAiBX,KAAKN,MAAOiB,GAE7BA,EAAOX,KAAKoB,WAGXT,EAGD,MAFAX,KAAKU,YAAYC,GAKnBA,EAAO,WAEDX,KAAKL,UAAU8B,KAAOzB,KAAKR,eAAiBQ,KAAKN,MAAMU,QAI1DsB,KAAKF,GACVxB,KAAKsB,WAAW,OAAQE,GAGnBG,QAAQH,GACbxB,KAAKsB,WAAW,UAAWE,M,gCC/H/B,MAEA,EAF2C,CAAC,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,MAAO,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,E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","sources":["webpack://tweb/./src/components/lazyLoadQueueBase.ts","webpack://tweb/./src/config/latinizeMap.ts","webpack://tweb/./src/helpers/array/filterUnique.ts","webpack://tweb/./src/helpers/array/insertInDescendSortedArray.ts","webpack://tweb/./src/helpers/assumeType.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/helpers/callbackify.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/object/getObjectKeysAndSort.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/slicedArray.ts","webpack://tweb/./src/helpers/compareValue.ts","webpack://tweb/./src/helpers/long/compareLong.ts","webpack://tweb/./src/lib/appManagers/utils/chats/getParticipantPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/chats/hasRights.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndex.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndexKey.ts","webpack://tweb/./src/lib/appManagers/utils/inlineBots/generateQId.ts","webpack://tweb/./src/lib/appManagers/utils/messages/filterMessagesByInputFilter.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getAlbumText.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/stickers/getStickerEffectThumb.ts","webpack://tweb/./src/lib/appManagers/utils/users/canSendToUser.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/lib/richTextProcessor/fixEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrl.ts","webpack://tweb/./src/lib/richTextProcessor/parseMarkdown.ts","webpack://tweb/./src/lib/richTextProcessor/wrapPlainText.ts","webpack://tweb/./src/lib/searchIndex.ts","webpack://tweb/./src/helpers/array/flatten.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 indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport throttle from '../helpers/schedulers/throttle';\nimport {logger, LogTypes} from '../lib/logger';\n\nconst PARALLEL_LIMIT = 8;\n\nexport type LazyLoadElementBase = {\n load: () => Promise\n};\n\nexport default class LazyLoadQueueBase {\n public queueId = 0;\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n protected lockPromise: Promise = null;\n protected unlockResolve: () => void = null;\n\n protected log = logger('LL', LogTypes.Error);\n protected processQueue: () => void;\n\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\n this.processQueue = throttle(() => this._processQueue(), 20, false);\n }\n\n public clear() {\n this.inProcess.clear(); // ацтеки забьются, будет плохо\n\n this.queue.length = 0;\n // unreachable code\n /* for(let item of this.inProcess) {\n this.lazyLoadMedia.push(item);\n } */\n }\n\n public lock() {\n if(this.lockPromise) return;\n\n // const perf = performance.now();\n this.lockPromise = new Promise((resolve, reject) => {\n this.unlockResolve = resolve;\n });\n\n /* if(DEBUG) {\n this.lockPromise.then(() => {\n this.log('was locked for:', performance.now() - perf);\n });\n } */\n }\n\n public unlock() {\n if(!this.unlockResolve) return;\n\n this.unlockResolve();\n this.unlockResolve = this.lockPromise = null;\n\n this.processQueue();\n }\n\n protected async processItem(item: LazyLoadElementBase) {\n if(this.lockPromise) {\n return;\n }\n\n this.inProcess.add(item);\n\n /* if(DEBUG) {\n this.log('will load media', this.lockPromise, item);\n } */\n\n try {\n // await new Promise((resolve) => setTimeout(resolve, 2e3));\n // await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\n // await item.load(item.div);\n await this.loadItem(item);\n } catch(err) {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has((err as ApiError)?.type)) {\n this.log.error('loadMediaQueue error:', err/* , item */);\n }\n }\n\n this.inProcess.delete(item);\n\n /* if(DEBUG) {\n this.log('loaded media', item);\n } */\n\n this.processQueue();\n }\n\n protected loadItem(item: LazyLoadElementBase) {\n return item.load();\n }\n\n protected getItem() {\n return this.queue.shift();\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\n this.queue[method](el);\n this.processQueue();\n }\n\n protected _processQueue(item?: LazyLoadElementBase) {\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\n\n // console.log('_processQueue start');\n let added = 0;\n do {\n if(item) {\n indexOfAndSplice(this.queue, item);\n } else {\n item = this.getItem();\n }\n\n if(item) {\n this.processItem(item);\n } else {\n break;\n }\n\n item = null;\n ++added;\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\n // console.log('_processQueue end, added', added, this.queue.length);\n }\n\n public push(el: LazyLoadElementBase) {\n this.addElement('push', el);\n }\n\n public unshift(el: LazyLoadElementBase) {\n this.addElement('unshift', 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 * 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// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nconst LatinizeMap: {[k: string]: string} = {'Á': 'A', 'Ă': 'A', 'Ắ': 'A', 'Ặ': 'A', 'Ằ': 'A', 'Ẳ': 'A', 'Ẵ': 'A', 'Ǎ': 'A', 'Â': 'A', 'Ấ': 'A', 'Ậ': 'A', 'Ầ': 'A', 'Ẩ': 'A', 'Ẫ': 'A', 'Ä': 'A', 'Ǟ': 'A', 'Ȧ': 'A', 'Ǡ': 'A', 'Ạ': 'A', 'Ȁ': 'A', 'À': 'A', 'Ả': 'A', 'Ȃ': 'A', 'Ā': 'A', 'Ą': 'A', 'Å': 'A', 'Ǻ': 'A', 'Ḁ': 'A', 'Ⱥ': 'A', 'Ã': 'A', 'Ꜳ': 'AA', 'Æ': 'AE', 'Ǽ': 'AE', 'Ǣ': 'AE', 'Ꜵ': 'AO', 'Ꜷ': 'AU', 'Ꜹ': 'AV', 'Ꜻ': 'AV', 'Ꜽ': 'AY', 'Ḃ': 'B', 'Ḅ': 'B', 'Ɓ': 'B', 'Ḇ': 'B', 'Ƀ': 'B', 'Ƃ': 'B', 'Ć': 'C', 'Č': 'C', 'Ç': 'C', 'Ḉ': 'C', 'Ĉ': 'C', 'Ċ': 'C', 'Ƈ': 'C', 'Ȼ': 'C', 'Ď': 'D', 'Ḑ': 'D', 'Ḓ': 'D', 'Ḋ': 'D', 'Ḍ': 'D', 'Ɗ': 'D', 'Ḏ': 'D', 'Dz': 'D', 'Dž': 'D', 'Đ': 'D', 'Ƌ': 'D', 'DZ': 'DZ', 'DŽ': 'DZ', 'É': 'E', 'Ĕ': 'E', 'Ě': 'E', 'Ȩ': 'E', 'Ḝ': 'E', 'Ê': 'E', 'Ế': 'E', 'Ệ': 'E', 'Ề': 'E', 'Ể': 'E', 'Ễ': 'E', 'Ḙ': 'E', 'Ë': 'E', 'Ė': 'E', 'Ẹ': 'E', 'Ȅ': 'E', 'È': 'E', 'Ẻ': 'E', 'Ȇ': 'E', 'Ē': 'E', 'Ḗ': 'E', 'Ḕ': 'E', 'Ę': 'E', 'Ɇ': 'E', 'Ẽ': 'E', 'Ḛ': 'E', 'Ꝫ': 'ET', 'Ḟ': 'F', 'Ƒ': 'F', 'Ǵ': 'G', 'Ğ': 'G', 'Ǧ': 'G', 'Ģ': 'G', 'Ĝ': 'G', 'Ġ': 'G', 'Ɠ': 'G', 'Ḡ': 'G', 'Ǥ': 'G', 'Ḫ': 'H', 'Ȟ': 'H', 'Ḩ': 'H', 'Ĥ': 'H', 'Ⱨ': 'H', 'Ḧ': 'H', 'Ḣ': 'H', 'Ḥ': 'H', 'Ħ': 'H', 'Í': 'I', 'Ĭ': 'I', 'Ǐ': 'I', 'Î': 'I', 'Ï': 'I', 'Ḯ': 'I', 'İ': 'I', 'Ị': 'I', 'Ȉ': 'I', 'Ì': 'I', 'Ỉ': 'I', 'Ȋ': 'I', 'Ī': 'I', 'Į': 'I', 'Ɨ': 'I', 'Ĩ': 'I', 'Ḭ': 'I', 'Ꝺ': 'D', 'Ꝼ': 'F', 'Ᵹ': 'G', 'Ꞃ': 'R', 'Ꞅ': 'S', 'Ꞇ': 'T', 'Ꝭ': 'IS', 'Ĵ': 'J', 'Ɉ': 'J', 'Ḱ': 'K', 'Ǩ': 'K', 'Ķ': 'K', 'Ⱪ': 'K', 'Ꝃ': 'K', 'Ḳ': 'K', 'Ƙ': 'K', 'Ḵ': 'K', 'Ꝁ': 'K', 'Ꝅ': 'K', 'Ĺ': 'L', 'Ƚ': 'L', 'Ľ': 'L', 'Ļ': 'L', 'Ḽ': 'L', 'Ḷ': 'L', 'Ḹ': 'L', 'Ⱡ': 'L', 'Ꝉ': 'L', 'Ḻ': 'L', 'Ŀ': 'L', 'Ɫ': 'L', 'Lj': 'L', 'Ł': 'L', 'LJ': 'LJ', 'Ḿ': 'M', 'Ṁ': 'M', 'Ṃ': 'M', 'Ɱ': 'M', 'Ń': 'N', 'Ň': 'N', 'Ņ': 'N', 'Ṋ': 'N', 'Ṅ': 'N', 'Ṇ': 'N', 'Ǹ': 'N', 'Ɲ': 'N', 'Ṉ': 'N', 'Ƞ': 'N', 'Nj': 'N', 'Ñ': 'N', 'NJ': 'NJ', 'Ó': 'O', 'Ŏ': 'O', 'Ǒ': 'O', 'Ô': 'O', 'Ố': 'O', 'Ộ': 'O', 'Ồ': 'O', 'Ổ': 'O', 'Ỗ': 'O', 'Ö': 'O', 'Ȫ': 'O', 'Ȯ': 'O', 'Ȱ': 'O', 'Ọ': 'O', 'Ő': 'O', 'Ȍ': 'O', 'Ò': 'O', 'Ỏ': 'O', 'Ơ': 'O', 'Ớ': 'O', 'Ợ': 'O', 'Ờ': 'O', 'Ở': 'O', 'Ỡ': 'O', 'Ȏ': 'O', 'Ꝋ': 'O', 'Ꝍ': 'O', 'Ō': 'O', 'Ṓ': 'O', 'Ṑ': 'O', 'Ɵ': 'O', 'Ǫ': 'O', 'Ǭ': 'O', 'Ø': 'O', 'Ǿ': 'O', 'Õ': 'O', 'Ṍ': 'O', 'Ṏ': 'O', 'Ȭ': 'O', 'Ƣ': 'OI', 'Ꝏ': 'OO', 'Ɛ': 'E', 'Ɔ': 'O', 'Ȣ': 'OU', 'Ṕ': 'P', 'Ṗ': 'P', 'Ꝓ': 'P', 'Ƥ': 'P', 'Ꝕ': 'P', 'Ᵽ': 'P', 'Ꝑ': 'P', 'Ꝙ': 'Q', 'Ꝗ': 'Q', 'Ŕ': 'R', 'Ř': 'R', 'Ŗ': 'R', 'Ṙ': 'R', 'Ṛ': 'R', 'Ṝ': 'R', 'Ȑ': 'R', 'Ȓ': 'R', 'Ṟ': 'R', 'Ɍ': 'R', 'Ɽ': 'R', 'Ꜿ': 'C', 'Ǝ': 'E', 'Ś': 'S', 'Ṥ': 'S', 'Š': 'S', 'Ṧ': 'S', 'Ş': 'S', 'Ŝ': 'S', 'Ș': 'S', 'Ṡ': 'S', 'Ṣ': 'S', 'Ṩ': 'S', 'ẞ': 'SS', 'Ť': 'T', 'Ţ': 'T', 'Ṱ': 'T', 'Ț': 'T', 'Ⱦ': 'T', 'Ṫ': 'T', 'Ṭ': 'T', 'Ƭ': 'T', 'Ṯ': 'T', 'Ʈ': 'T', 'Ŧ': 'T', 'Ɐ': 'A', 'Ꞁ': 'L', 'Ɯ': 'M', 'Ʌ': 'V', 'Ꜩ': 'TZ', 'Ú': 'U', 'Ŭ': 'U', 'Ǔ': 'U', 'Û': 'U', 'Ṷ': 'U', 'Ü': 'U', 'Ǘ': 'U', 'Ǚ': 'U', 'Ǜ': 'U', 'Ǖ': 'U', 'Ṳ': 'U', 'Ụ': 'U', 'Ű': 'U', 'Ȕ': 'U', 'Ù': 'U', 'Ủ': 'U', 'Ư': 'U', 'Ứ': 'U', 'Ự': 'U', 'Ừ': 'U', 'Ử': 'U', 'Ữ': 'U', 'Ȗ': 'U', 'Ū': 'U', 'Ṻ': 'U', 'Ų': 'U', 'Ů': 'U', 'Ũ': 'U', 'Ṹ': 'U', 'Ṵ': 'U', 'Ꝟ': 'V', 'Ṿ': 'V', 'Ʋ': 'V', 'Ṽ': 'V', 'Ꝡ': 'VY', 'Ẃ': 'W', 'Ŵ': 'W', 'Ẅ': 'W', 'Ẇ': 'W', 'Ẉ': 'W', 'Ẁ': 'W', 'Ⱳ': 'W', 'Ẍ': 'X', 'Ẋ': 'X', 'Ý': 'Y', 'Ŷ': 'Y', 'Ÿ': 'Y', 'Ẏ': 'Y', 'Ỵ': 'Y', 'Ỳ': 'Y', 'Ƴ': 'Y', 'Ỷ': 'Y', 'Ỿ': 'Y', 'Ȳ': 'Y', 'Ɏ': 'Y', 'Ỹ': 'Y', 'Ź': 'Z', 'Ž': 'Z', 'Ẑ': 'Z', 'Ⱬ': 'Z', 'Ż': 'Z', 'Ẓ': 'Z', 'Ȥ': 'Z', 'Ẕ': 'Z', 'Ƶ': 'Z', 'IJ': 'IJ', 'Œ': 'OE', 'ᴀ': 'A', 'ᴁ': 'AE', 'ʙ': 'B', 'ᴃ': 'B', 'ᴄ': 'C', 'ᴅ': 'D', 'ᴇ': 'E', 'ꜰ': 'F', 'ɢ': 'G', 'ʛ': 'G', 'ʜ': 'H', 'ɪ': 'I', 'ʁ': 'R', 'ᴊ': 'J', 'ᴋ': 'K', 'ʟ': 'L', 'ᴌ': 'L', 'ᴍ': 'M', 'ɴ': 'N', 'ᴏ': 'O', 'ɶ': 'OE', 'ᴐ': 'O', 'ᴕ': 'OU', 'ᴘ': 'P', 'ʀ': 'R', 'ᴎ': 'N', 'ᴙ': 'R', 'ꜱ': 'S', 'ᴛ': 'T', 'ⱻ': 'E', 'ᴚ': 'R', 'ᴜ': 'U', 'ᴠ': 'V', 'ᴡ': 'W', 'ʏ': 'Y', 'ᴢ': 'Z', 'á': 'a', 'ă': 'a', 'ắ': 'a', 'ặ': 'a', 'ằ': 'a', 'ẳ': 'a', 'ẵ': 'a', 'ǎ': 'a', 'â': 'a', 'ấ': 'a', 'ậ': 'a', 'ầ': 'a', 'ẩ': 'a', 'ẫ': 'a', 'ä': 'a', 'ǟ': 'a', 'ȧ': 'a', 'ǡ': 'a', 'ạ': 'a', 'ȁ': 'a', 'à': 'a', 'ả': 'a', 'ȃ': 'a', 'ā': 'a', 'ą': 'a', 'ᶏ': 'a', 'ẚ': 'a', 'å': 'a', 'ǻ': 'a', 'ḁ': 'a', 'ⱥ': 'a', 'ã': 'a', 'ꜳ': 'aa', 'æ': 'ae', 'ǽ': 'ae', 'ǣ': 'ae', 'ꜵ': 'ao', 'ꜷ': 'au', 'ꜹ': 'av', 'ꜻ': 'av', 'ꜽ': 'ay', 'ḃ': 'b', 'ḅ': 'b', 'ɓ': 'b', 'ḇ': 'b', 'ᵬ': 'b', 'ᶀ': 'b', 'ƀ': 'b', 'ƃ': 'b', 'ɵ': 'o', 'ć': 'c', 'č': 'c', 'ç': 'c', 'ḉ': 'c', 'ĉ': 'c', 'ɕ': 'c', 'ċ': 'c', 'ƈ': 'c', 'ȼ': 'c', 'ď': 'd', 'ḑ': 'd', 'ḓ': 'd', 'ȡ': 'd', 'ḋ': 'd', 'ḍ': 'd', 'ɗ': 'd', 'ᶑ': 'd', 'ḏ': 'd', 'ᵭ': 'd', 'ᶁ': 'd', 'đ': 'd', 'ɖ': 'd', 'ƌ': 'd', 'ı': 'i', 'ȷ': 'j', 'ɟ': 'j', 'ʄ': 'j', 'dz': 'dz', 'dž': 'dz', 'é': 'e', 'ĕ': 'e', 'ě': 'e', 'ȩ': 'e', 'ḝ': 'e', 'ê': 'e', 'ế': 'e', 'ệ': 'e', 'ề': 'e', 'ể': 'e', 'ễ': 'e', 'ḙ': 'e', 'ë': 'e', 'ė': 'e', 'ẹ': 'e', 'ȅ': 'e', 'è': 'e', 'ẻ': 'e', 'ȇ': 'e', 'ē': 'e', 'ḗ': 'e', 'ḕ': 'e', 'ⱸ': 'e', 'ę': 'e', 'ᶒ': 'e', 'ɇ': 'e', 'ẽ': 'e', 'ḛ': 'e', 'ꝫ': 'et', 'ḟ': 'f', 'ƒ': 'f', 'ᵮ': 'f', 'ᶂ': 'f', 'ǵ': 'g', 'ğ': 'g', 'ǧ': 'g', 'ģ': 'g', 'ĝ': 'g', 'ġ': 'g', 'ɠ': 'g', 'ḡ': 'g', 'ᶃ': 'g', 'ǥ': 'g', 'ḫ': 'h', 'ȟ': 'h', 'ḩ': 'h', 'ĥ': 'h', 'ⱨ': 'h', 'ḧ': 'h', 'ḣ': 'h', 'ḥ': 'h', 'ɦ': 'h', 'ẖ': 'h', 'ħ': 'h', 'ƕ': 'hv', 'í': 'i', 'ĭ': 'i', 'ǐ': 'i', 'î': 'i', 'ï': 'i', 'ḯ': 'i', 'ị': 'i', 'ȉ': 'i', 'ì': 'i', 'ỉ': 'i', 'ȋ': 'i', 'ī': 'i', 'į': 'i', 'ᶖ': 'i', 'ɨ': 'i', 'ĩ': 'i', 'ḭ': 'i', 'ꝺ': 'd', 'ꝼ': 'f', 'ᵹ': 'g', 'ꞃ': 'r', 'ꞅ': 's', 'ꞇ': 't', 'ꝭ': 'is', 'ǰ': 'j', 'ĵ': 'j', 'ʝ': 'j', 'ɉ': 'j', 'ḱ': 'k', 'ǩ': 'k', 'ķ': 'k', 'ⱪ': 'k', 'ꝃ': 'k', 'ḳ': 'k', 'ƙ': 'k', 'ḵ': 'k', 'ᶄ': 'k', 'ꝁ': 'k', 'ꝅ': 'k', 'ĺ': 'l', 'ƚ': 'l', 'ɬ': 'l', 'ľ': 'l', 'ļ': 'l', 'ḽ': 'l', 'ȴ': 'l', 'ḷ': 'l', 'ḹ': 'l', 'ⱡ': 'l', 'ꝉ': 'l', 'ḻ': 'l', 'ŀ': 'l', 'ɫ': 'l', 'ᶅ': 'l', 'ɭ': 'l', 'ł': 'l', 'lj': 'lj', 'ſ': 's', 'ẜ': 's', 'ẛ': 's', 'ẝ': 's', 'ḿ': 'm', 'ṁ': 'm', 'ṃ': 'm', 'ɱ': 'm', 'ᵯ': 'm', 'ᶆ': 'm', 'ń': 'n', 'ň': 'n', 'ņ': 'n', 'ṋ': 'n', 'ȵ': 'n', 'ṅ': 'n', 'ṇ': 'n', 'ǹ': 'n', 'ɲ': 'n', 'ṉ': 'n', 'ƞ': 'n', 'ᵰ': 'n', 'ᶇ': 'n', 'ɳ': 'n', 'ñ': 'n', 'nj': 'nj', 'ó': 'o', 'ŏ': 'o', 'ǒ': 'o', 'ô': 'o', 'ố': 'o', 'ộ': 'o', 'ồ': 'o', 'ổ': 'o', 'ỗ': 'o', 'ö': 'o', 'ȫ': 'o', 'ȯ': 'o', 'ȱ': 'o', 'ọ': 'o', 'ő': 'o', 'ȍ': 'o', 'ò': 'o', 'ỏ': 'o', 'ơ': 'o', 'ớ': 'o', 'ợ': 'o', 'ờ': 'o', 'ở': 'o', 'ỡ': 'o', 'ȏ': 'o', 'ꝋ': 'o', 'ꝍ': 'o', 'ⱺ': 'o', 'ō': 'o', 'ṓ': 'o', 'ṑ': 'o', 'ǫ': 'o', 'ǭ': 'o', 'ø': 'o', 'ǿ': 'o', 'õ': 'o', 'ṍ': 'o', 'ṏ': 'o', 'ȭ': 'o', 'ƣ': 'oi', 'ꝏ': 'oo', 'ɛ': 'e', 'ᶓ': 'e', 'ɔ': 'o', 'ᶗ': 'o', 'ȣ': 'ou', 'ṕ': 'p', 'ṗ': 'p', 'ꝓ': 'p', 'ƥ': 'p', 'ᵱ': 'p', 'ᶈ': 'p', 'ꝕ': 'p', 'ᵽ': 'p', 'ꝑ': 'p', 'ꝙ': 'q', 'ʠ': 'q', 'ɋ': 'q', 'ꝗ': 'q', 'ŕ': 'r', 'ř': 'r', 'ŗ': 'r', 'ṙ': 'r', 'ṛ': 'r', 'ṝ': 'r', 'ȑ': 'r', 'ɾ': 'r', 'ᵳ': 'r', 'ȓ': 'r', 'ṟ': 'r', 'ɼ': 'r', 'ᵲ': 'r', 'ᶉ': 'r', 'ɍ': 'r', 'ɽ': 'r', 'ↄ': 'c', 'ꜿ': 'c', 'ɘ': 'e', 'ɿ': 'r', 'ś': 's', 'ṥ': 's', 'š': 's', 'ṧ': 's', 'ş': 's', 'ŝ': 's', 'ș': 's', 'ṡ': 's', 'ṣ': 's', 'ṩ': 's', 'ʂ': 's', 'ᵴ': 's', 'ᶊ': 's', 'ȿ': 's', 'ɡ': 'g', 'ß': 'ss', 'ᴑ': 'o', 'ᴓ': 'o', 'ᴝ': 'u', 'ť': 't', 'ţ': 't', 'ṱ': 't', 'ț': 't', 'ȶ': 't', 'ẗ': 't', 'ⱦ': 't', 'ṫ': 't', 'ṭ': 't', 'ƭ': 't', 'ṯ': 't', 'ᵵ': 't', 'ƫ': 't', 'ʈ': 't', 'ŧ': 't', 'ᵺ': 'th', 'ɐ': 'a', 'ᴂ': 'ae', 'ǝ': 'e', 'ᵷ': 'g', 'ɥ': 'h', 'ʮ': 'h', 'ʯ': 'h', 'ᴉ': 'i', 'ʞ': 'k', 'ꞁ': 'l', 'ɯ': 'm', 'ɰ': 'm', 'ᴔ': 'oe', 'ɹ': 'r', 'ɻ': 'r', 'ɺ': 'r', 'ⱹ': 'r', 'ʇ': 't', 'ʌ': 'v', 'ʍ': 'w', 'ʎ': 'y', 'ꜩ': 'tz', 'ú': 'u', 'ŭ': 'u', 'ǔ': 'u', 'û': 'u', 'ṷ': 'u', 'ü': 'u', 'ǘ': 'u', 'ǚ': 'u', 'ǜ': 'u', 'ǖ': 'u', 'ṳ': 'u', 'ụ': 'u', 'ű': 'u', 'ȕ': 'u', 'ù': 'u', 'ủ': 'u', 'ư': 'u', 'ứ': 'u', 'ự': 'u', 'ừ': 'u', 'ử': 'u', 'ữ': 'u', 'ȗ': 'u', 'ū': 'u', 'ṻ': 'u', 'ų': 'u', 'ᶙ': 'u', 'ů': 'u', 'ũ': 'u', 'ṹ': 'u', 'ṵ': 'u', 'ᵫ': 'ue', 'ꝸ': 'um', 'ⱴ': 'v', 'ꝟ': 'v', 'ṿ': 'v', 'ʋ': 'v', 'ᶌ': 'v', 'ⱱ': 'v', 'ṽ': 'v', 'ꝡ': 'vy', 'ẃ': 'w', 'ŵ': 'w', 'ẅ': 'w', 'ẇ': 'w', 'ẉ': 'w', 'ẁ': 'w', 'ⱳ': 'w', 'ẘ': 'w', 'ẍ': 'x', 'ẋ': 'x', 'ᶍ': 'x', 'ý': 'y', 'ŷ': 'y', 'ÿ': 'y', 'ẏ': 'y', 'ỵ': 'y', 'ỳ': 'y', 'ƴ': 'y', 'ỷ': 'y', 'ỿ': 'y', 'ȳ': 'y', 'ẙ': 'y', 'ɏ': 'y', 'ỹ': 'y', 'ź': 'z', 'ž': 'z', 'ẑ': 'z', 'ʑ': 'z', 'ⱬ': 'z', 'ż': 'z', 'ẓ': 'z', 'ȥ': 'z', 'ẕ': 'z', 'ᵶ': 'z', 'ᶎ': 'z', 'ʐ': 'z', 'ƶ': 'z', 'ɀ': 'z', 'ff': 'ff', 'ffi': 'ffi', 'ffl': 'ffl', 'fi': 'fi', 'fl': 'fl', 'ij': 'ij', 'œ': 'oe', 'st': 'st', 'ₐ': 'a', 'ₑ': 'e', 'ᵢ': 'i', 'ⱼ': 'j', 'ₒ': 'o', 'ᵣ': 'r', 'ᵤ': 'u', 'ᵥ': 'v', 'ₓ': 'x', 'Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\n\nexport default LatinizeMap;\n","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","export default function insertInDescendSortedArray(array: Array, element: T, getProperty: K, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: (element: T) => number, pos?: number): number;\nexport default function insertInDescendSortedArray(array: Array, element: T, getProperty: K | ((element: T) => T[K]), pos?: number): number {\n if(typeof(getProperty) !== 'function') {\n const property = getProperty;\n getProperty = (element) => element[property];\n }\n\n const sortProperty: number = getProperty(element);\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || getProperty(prev) >= sortProperty) && (!next || getProperty(next) <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n\n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= getProperty(array[len - 1])) {\n return array.push(element) - 1;\n } else if(sortProperty >= getProperty(array[0])) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > getProperty(array[i])) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\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","/*\n * 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 callbackify, R>(\n smth: T,\n callback: (result: Awaited) => R\n): R {\n if(smth instanceof Promise) {\n // @ts-ignore\n return smth.then(callback);\n } else {\n return callback(smth as any);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\r\n","export default function getObjectKeysAndSort(object: {[key: string]: any} | Map, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map((i) => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\n}\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from '../../environment/ctx';\r\nimport {AnyFunction, Awaited} from '../../types';\r\nimport noop from '../noop';\r\n\r\nexport type DebounceReturnType = {\r\n (...args: Parameters): Promise>>;\r\n clearTimeout(): void;\r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n\r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport indexOfAndSplice from './array/indexOfAndSplice';\r\nimport compareValue from './compareValue';\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number | string;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n // slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n getEnds: () => {top: boolean, bottom: boolean, both: boolean};\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n // new(...items: T[]): Slice;\r\n new(length: number): Slice;\r\n}\r\n\r\nexport type SliceSerialized = {\r\n values: Slice,\r\n isEnd: {\r\n top: boolean,\r\n bottom: boolean,\r\n both: boolean\r\n }\r\n};\r\n\r\nexport type SlicedArraySerialized = {\r\n slices: SliceSerialized[]\r\n};\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n // first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n // slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n\r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n\r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n\r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n\r\n return isEnd;\r\n }\r\n\r\n getEnds() {\r\n return {\r\n top: this.isEnd(SliceEnd.Top),\r\n bottom: this.isEnd(SliceEnd.Bottom),\r\n both: this.isEnd(SliceEnd.Both)\r\n };\r\n }\r\n\r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end &= ~side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as ItemType[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: T[]) {\r\n // const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n\r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: T[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(compareValue(slice[0], s[0]) === 1) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n\r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n\r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // *\r\n\r\n get first() {\r\n return this.slices[0];\r\n }\r\n\r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: T) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: T) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n\r\n for(; offset < slice.length; ++offset) {\r\n if(compareValue(maxId, slice[offset]) >= 0) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice,\r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: T, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n const sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n const sliceEnd = sliceOffset + add_offset + limit;\r\n // const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n // sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n // if(topFulfilled) sliced.isEnd(SliceEnd.Top);\r\n // if(bottomFulfilled) sliced.isEnd(SliceEnd.Bottom);\r\n\r\n return {\r\n slice: sliced,\r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: T[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: T[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: T) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public deleteSlice(slice: Slice) {\r\n indexOfAndSplice(this.slices, slice);\r\n }\r\n\r\n public toJSON() {\r\n const slices: SlicedArraySerialized['slices'] = this.slices.map((slice) => {\r\n return {\r\n values: slice.slice(),\r\n isEnd: slice.getEnds()\r\n };\r\n });\r\n\r\n const serialized: SlicedArraySerialized = {\r\n slices\r\n };\r\n\r\n return JSON.stringify(serialized);\r\n }\r\n\r\n public static fromJSON(json: string) {\r\n const parsed: SlicedArraySerialized = JSON.parse(json);\r\n const sliced = new SlicedArray();\r\n parsed.slices.forEach((slice) => {\r\n const inserted = sliced.insertSlice(slice.values) || sliced.first;\r\n if(slice.isEnd.top) inserted.setEnd(SliceEnd.Top);\r\n if(slice.isEnd.bottom) inserted.setEnd(SliceEnd.Bottom);\r\n });\r\n\r\n return sliced;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","import compareLong from './long/compareLong';\n\nexport default function compareValue(val1: string | number, val2: typeof val1) {\n if((val1 as number).toExponential) {\n const diff = (val1 as number) - (val2 as number);\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n return compareLong(val1 as string, val2 as string);\n}\n","/*\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 compareLong(str1: string, str2: string) {\n const str1Length = str1.length;\n if(str1Length !== str2.length) {\n const diff = str1Length - str2.length;\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n const maxPartLength = 15;\n for(let i = 0; i < str1Length; i += maxPartLength) {\n const v1 = +str1.slice(i, i + maxPartLength);\n const v2 = +str2.slice(i, i + maxPartLength);\n const diff = v1 - v2;\n if(diff) {\n return diff;\n }\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\nimport {ChannelParticipant, ChatParticipant} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ?\n getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) :\n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n}\n","/*\n * 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, ChatAdminRights, ChatBannedRights} from '../../../../layer';\nimport {ChatRights} from '../../appChatsManager';\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 */\nexport default function hasRights(chat: Chat, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n // (chat as any).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\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 {Dialog} from '../../../../layer';\nimport getDialogIndexKey from './getDialogIndexKey';\n\nexport default function getDialogIndex(\n dialog: Dialog.dialog,\n indexKey: ReturnType = getDialogIndexKey(dialog.folder_id)\n) {\n return dialog?.[indexKey];\n}\n","/*\n * 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} from '../../../../layer';\n\nexport default function getDialogIndexKey(localId?: DialogFilter.dialogFilter['localId']) {\n return `index_${localId}` as const;\n // return filterId !== undefined && filterId > 1 ? `filter_${filterId}` as const : 'main' as const;\n // const indexStr = filterId > 1 ?\n // `index_${filterId}` as const :\n // 'index' as const;\n\n // return indexStr;\n}\n","import {MessagesBotResults} from '../../../../layer';\n\nexport default function generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\n return queryId + '_' + resultId;\n}\n","/*\n * 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, MessageMedia, MessageEntity, MessageAction} from '../../../../layer';\nimport matchUrl from '../../../richTextProcessor/matchUrl';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyInputMessagesFilter, MyMessage} from '../../appMessagesManager';\n\nexport default function filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: Array, limit: number) {\n if(inputFilter === 'inputMessagesFilterEmpty') {\n return history;\n }\n\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [],\n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n // excludeDocTypes.push('video');\n neededDocTypes.push(undefined, 'photo', 'pdf');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = history[i];\n if(!message) continue;\n\n // || (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n\n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc &&\n (\n (neededDocTypes.length && !neededDocTypes.includes(doc.type)) ||\n excludeDocTypes.includes(doc.type)\n )\n ) {\n continue;\n }\n\n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find((e) => goodEntities.includes(e._)) || matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] &&\n message.action &&\n ([\n 'messageActionChannelEditPhoto' as const,\n 'messageActionChatEditPhoto' as const,\n 'messageActionChannelEditVideo' as const,\n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find((flag) => message.pFlags[flag])) {\n found = true;\n } */\n\n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n}\n","import assumeType from '../../../../helpers/assumeType';\nimport {Message, MessageEntity} from '../../../../layer';\n\nexport default function getAlbumText(messages: Message.message[]) {\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const m of messages) {\n assumeType(m);\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {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 | 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","import {MyDocument} from '../../appDocsManager';\n\nexport default function getStickerEffectThumb(doc: MyDocument) {\n return doc.video_thumbs?.[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 {User} from '../../../../layer';\nimport {REPLIES_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function canSendToUser(user: User.user) {\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus',\r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nexport default function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach((entity) => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n\n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n}\n","import {URL_REG_EXP} from '.';\n\nexport default function matchUrl(text: string) {\n return !text ? null : text.match(URL_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 * 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 {MARKDOWN_ENTITIES, MARKDOWN_REG_EXP} from '.';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from './combineSameEntities';\nimport findConflictingEntity from './findConflictingEntity';\nimport mergeEntities from './mergeEntities';\n\nexport default function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(MARKDOWN_REG_EXP)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n // text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n\n newTextParts.push(match[1] + text + match[5]);\n\n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: MARKDOWN_ENTITIES[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n // offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n\n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n}\n","/*\n * 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 encodeSpoiler from './encodeSpoiler';\n\n/**\n * ! This function is still unsafe to use with .innerHTML\n */\nexport default function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n entities.forEach((entity) => {\n if(entity._ === 'messageEntitySpoiler') {\n text = encodeSpoiler(text, entity).text;\n }\n });\n\n return text;\n // if(entities?.length) {\n // entities = entities.filter((entity) => entity._ === 'messageEntitySpoiler');\n // }\n\n // return wrapRichText(text, {\n // entities,\n // noEncoding: true,\n // noTextFormat: true,\n // noLinebreaks: true,\n // noLinks: true\n // }).textContent;\n}\n","/*\n * 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 {processSearchText, ProcessSearchTextOptions} from '../helpers/cleanSearchText';\nimport flatten from '../helpers/array/flatten';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n\n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n private _search(query: string) {\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const fullTexts = this.fullTexts;\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' '/* && !badCharsRe.test(fullText[idx - 1]) */)) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n return newFoundObjs;\n }\n\n public search(query: string) {\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const queries = query.split('\\x01');\n const newFoundObjs = flatten(queries.map((query) => this._search(query)));\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n // newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map((o) => o.what));\n\n return newFoundObjs2;\n }\n}\n","export default function flatten(arr: T[][]): T[] {\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\n}\n"],"names":["LazyLoadQueueBase","constructor","parallelLimit","queueId","queue","inProcess","Set","lockPromise","unlockResolve","log","this","processQueue","_processQueue","clear","length","lock","Promise","resolve","reject","unlock","processItem","item","add","loadItem","err","has","type","error","delete","load","getItem","shift","addElement","method","el","size","push","unshift","filterUnique","arr","insertInDescendSortedArray","array","element","getProperty","pos","property","sortProperty","undefined","indexOf","prev","next","splice","len","i","console","assumeType","x","bytesCmp","bytes1","bytes2","bytesFromHex","hexString","bytes","Uint8Array","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","callbackify","smth","callback","then","getMiddleware","cleanupObj","cleaned","clean","get","additionalCallback","_cleanupObj","getObjectKeysAndSort","object","sort","ids","Map","keys","Object","map","a","b","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","args","_resolve","_reject","apply","clearTimeout","_waitingTimeout","catch","SliceEnd","compareValue","val1","val2","toExponential","diff","str1","str2","str1Length","slice","compareLong","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","static","slicedArray","Array","end","None","isEnd","side","Top","last","includes","Bottom","Both","setEnd","getEnds","top","bottom","both","unsetEnd","deleteCount","items","ret","super","idx","insertSlice","flatten","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","s","prevSlice","nextSlice","findSlice","index","findSliceOffset","maxId","offset","sliceMe","offsetId","add_offset","limit","sliceOffset","sliceStart","max","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","found","deleteSlice","indexOfAndSplice","toJSON","serialized","values","JSON","stringify","json","parsed","parse","forEach","inserted","getParticipantPeerId","participant","peer","user_id","toPeerId","hasRights","chat","action","rights","isThread","_","pFlags","deactivated","isCheckingRightsForSelf","creator","left","megagroup","admin_rights","banned_rights","default_banned_rights","myFlags","post_messages","broadcast","getDialogIndex","dialog","indexKey","folder_id","getDialogIndexKey","localId","generateQId","queryId","resultId","filterMessagesByInputFilter","inputFilter","history","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","message","media","doc","document","goodEntities","totalEntities","find","e","getAlbumText","messages","entities","foundMessages","m","getPeerId","peerId","isPeerId","userId","chatId","channel_id","chat_id","isUser","peerParams","split","getStickerEffectThumb","video_thumbs","canSendToUser","user","deleted","id","ConnectionStatus","fixEmoji","text","replace","match","string","entity","matchUrl","parseMarkdown","raw","currentEntities","noTrim","pushedEntity","pushEntity","newTextParts","rawOffset","matchIndex","language","isSOH","toUserId","url","newText","join","wrapPlainText","SearchIndex","options","minChars","fullTexts","indexObject","searchText","trim","set","_search","query","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","search","reduce","acc","val","o"],"sourceRoot":""} \ No newline at end of file diff --git a/public/301.908ec7163f3671b91bdb.chunk.js.map b/public/301.908ec7163f3671b91bdb.chunk.js.map deleted file mode 100644 index a2cfef5fe..000000000 --- a/public/301.908ec7163f3671b91bdb.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"301.908ec7163f3671b91bdb.chunk.js","mappings":"yHAAA,MAuCA,EAvCa,CACX,cAAe,sBACf,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAClB,QAAW,UAGX,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,6DAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","sources":["webpack://tweb/./src/langSign.ts"],"sourcesContent":["const lang = {\r\n \"Login.Title\": \"Sign in to Telegram\",\r\n \"Login.PhoneLabel\": \"Phone Number\",\r\n \"Login.PhoneLabelInvalid\": \"Phone Number Invalid\",\r\n \"Login.KeepSigned\": \"Keep me signed in\",\r\n \"Login.StartText\": \"Please confirm your country and\\nenter your phone number.\",\r\n \"Login.Code.SentSms\": \"We have sent you an SMS\\nwith the code.\",\r\n \"Login.Code.SentInApp\": \"We have sent you a message in Telegram\\nwith the code.\",\r\n \"Login.Code.SentCall\": \"We will call you and voice\\nthe code.\",\r\n \"Login.Code.SentUnknown\": \"Please check everything\\nfor a code (type: %s)\",\r\n \"Login.Password.Title\": \"Enter Your Password\",\r\n \"Login.Password.Subtitle\": \"Your account is protected with\\nan additional password\",\r\n \"Login.Register.Subtitle\": \"Enter your name and add\\na profile picture\",\r\n \"PleaseWait\": \"Please wait...\",\r\n\r\n // * android\r\n \"Code\": \"Code\",\r\n \"LoginPassword\": \"Password\",\r\n \"YourName\": \"Your Name\",\r\n \"FirstName\": \"First name (required)\",\r\n \"LastName\": \"Last name (optional)\",\r\n \"StartMessaging\": \"Start Messaging\",\r\n \"Country\": \"Country\",\r\n\r\n // * macos\r\n \"Contacts.PhoneNumber.Placeholder\": \"Phone Number\",\r\n \"Login.Next\": \"Next\",\r\n \"Login.ContinueOnLanguage\": \"Continue in English\",\r\n \"Login.QR.Title\": \"Log in to Telegram by QR Code\",\r\n \"Login.QR.Help1\": \"Open Telegram on your phone\",\r\n \"Login.QR.Help2\": \"Go to **Settings** > **Devices** > **Link Desktop Device**\",\r\n \"Login.QR.Help3\": \"Point your phone at this screen to confirm login\",\r\n \"Login.QR.Cancel\": \"Log in by phone Number\",\r\n \"Login.QR.Login\": \"Log in by QR Code\",\r\n \"PHONE_CODE_INVALID\": \"Invalid code\",\r\n \"PHONE_CODE_EXPIRED\": \"Code expired\",\r\n \"PASSWORD_HASH_INVALID\": \"Incorrect password\"\r\n};\r\n\r\nexport default lang;\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/301.908ec7163f3671b91bdb.chunk.js b/public/301.ffb4a949577b521c6089.chunk.js similarity index 96% rename from public/301.908ec7163f3671b91bdb.chunk.js rename to public/301.ffb4a949577b521c6089.chunk.js index f8cd2673b..1b45f3fa2 100644 --- a/public/301.908ec7163f3671b91bdb.chunk.js +++ b/public/301.ffb4a949577b521c6089.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[301],{9301:(e,n,o)=>{o.r(n),o.d(n,{default:()=>i});const i={"Login.Title":"Sign in to Telegram","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging",Country:"Country","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Link Desktop Device**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); -//# sourceMappingURL=301.908ec7163f3671b91bdb.chunk.js.map \ No newline at end of file +//# sourceMappingURL=301.ffb4a949577b521c6089.chunk.js.map \ No newline at end of file diff --git a/public/301.ffb4a949577b521c6089.chunk.js.map b/public/301.ffb4a949577b521c6089.chunk.js.map new file mode 100644 index 000000000..51f626bc9 --- /dev/null +++ b/public/301.ffb4a949577b521c6089.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"301.ffb4a949577b521c6089.chunk.js","mappings":"yHAAA,MAuCA,EAvCa,CACX,cAAe,sBACf,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAClB,QAAW,UAGX,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,6DAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","sources":["webpack://tweb/./src/langSign.ts"],"sourcesContent":["const lang = {\r\n 'Login.Title': 'Sign in to Telegram',\r\n 'Login.PhoneLabel': 'Phone Number',\r\n 'Login.PhoneLabelInvalid': 'Phone Number Invalid',\r\n 'Login.KeepSigned': 'Keep me signed in',\r\n 'Login.StartText': 'Please confirm your country and\\nenter your phone number.',\r\n 'Login.Code.SentSms': 'We have sent you an SMS\\nwith the code.',\r\n 'Login.Code.SentInApp': 'We have sent you a message in Telegram\\nwith the code.',\r\n 'Login.Code.SentCall': 'We will call you and voice\\nthe code.',\r\n 'Login.Code.SentUnknown': 'Please check everything\\nfor a code (type: %s)',\r\n 'Login.Password.Title': 'Enter Your Password',\r\n 'Login.Password.Subtitle': 'Your account is protected with\\nan additional password',\r\n 'Login.Register.Subtitle': 'Enter your name and add\\na profile picture',\r\n 'PleaseWait': 'Please wait...',\r\n\r\n // * android\r\n 'Code': 'Code',\r\n 'LoginPassword': 'Password',\r\n 'YourName': 'Your Name',\r\n 'FirstName': 'First name (required)',\r\n 'LastName': 'Last name (optional)',\r\n 'StartMessaging': 'Start Messaging',\r\n 'Country': 'Country',\r\n\r\n // * macos\r\n 'Contacts.PhoneNumber.Placeholder': 'Phone Number',\r\n 'Login.Next': 'Next',\r\n 'Login.ContinueOnLanguage': 'Continue in English',\r\n 'Login.QR.Title': 'Log in to Telegram by QR Code',\r\n 'Login.QR.Help1': 'Open Telegram on your phone',\r\n 'Login.QR.Help2': 'Go to **Settings** > **Devices** > **Link Desktop Device**',\r\n 'Login.QR.Help3': 'Point your phone at this screen to confirm login',\r\n 'Login.QR.Cancel': 'Log in by phone Number',\r\n 'Login.QR.Login': 'Log in by QR Code',\r\n 'PHONE_CODE_INVALID': 'Invalid code',\r\n 'PHONE_CODE_EXPIRED': 'Code expired',\r\n 'PASSWORD_HASH_INVALID': 'Incorrect password'\r\n};\r\n\r\nexport default lang;\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/339.6f9573a4830d89de5c12.chunk.js b/public/339.10c5e684562141ca65db.chunk.js similarity index 98% rename from public/339.6f9573a4830d89de5c12.chunk.js rename to public/339.10c5e684562141ca65db.chunk.js index 1b3134a2b..5dbaf2ff8 100644 --- a/public/339.6f9573a4830d89de5c12.chunk.js +++ b/public/339.10c5e684562141ca65db.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[339],{2582:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(2325);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,n.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,n.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},8339:(e,t,a)=>{a.r(t),a.d(t,{default:()=>v});var n=a(4494),i=a(503),s=a(279),r=a(6765),p=a(2325),l=a(2582),u=a(4874),c=a(8799),o=a(5565),m=a(1168),d=a(8115),h=a(3512);let g=null;const v=new u.Z("page-signUp",!0,(()=>{const e=new l.Z({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const t=document.createElement("canvas");t.id="canvas-avatar",t.className="avatar-edit-canvas";const u=document.createElement("span");let v;u.className="tgico tgico-cameraadd",e.imageDiv.append(t,u),e.imageDiv.addEventListener("click",(()=>{m.Z.createPopup(r.Z).open(t,(e=>{v=e}))}));const b=t=>{const a=L.value||"",n=y.value||"",i=a||n?(a+" "+n).trim():"";i?(0,o.Z)(e.title,(0,d.Z)(i)):(0,o.Z)(e.title,(0,p.ag)("YourName"))},L=new i.Z({label:"FirstName",maxLength:70}),y=new i.Z({label:"LastName",maxLength:64}),Z=(0,n.Z)("btn-primary btn-color-primary"),w=new p.ZP.IntlElement({key:"StartMessaging"});return Z.append(w.element),e.inputWrapper.append(L.container,y.container,Z),L.input.addEventListener("input",b),y.input.addEventListener("input",b),Z.addEventListener("click",(function(e){if(L.input.classList.contains("error")||y.input.classList.contains("error"))return!1;if(!L.value.length)return L.input.classList.add("error"),!1;this.disabled=!0;const t=L.value.trim(),n=y.value.trim(),i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,first_name:t,last_name:n};w.update({key:"PleaseWait"});const r=(0,s.y)(this);h.Z.managers.apiManager.invokeApi("auth.signUp",i).then((e=>{"auth.authorization"===e._?(h.Z.managers.apiManager.setUser(e.user),new Promise(((e,t)=>{if(!v)return e();v().then((a=>{h.Z.managers.appProfileManager.uploadProfilePhoto(a).then(e,t)}),t)})).finally((()=>{a.e(781).then(a.bind(a,5436)).then((e=>{e.default.mount()}))}))):(w.update({key:e._}),this.removeAttribute("disabled"),r.remove())})).catch((e=>{this.removeAttribute("disabled"),r.remove(),e.type,w.update({key:e.type})}))})),(0,c.Z)(),new Promise((e=>{window.requestAnimationFrame(e)}))}),(e=>{g=e,h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignUp",authCode:e})}))}}]); -//# sourceMappingURL=339.6f9573a4830d89de5c12.chunk.js.map \ No newline at end of file +//# sourceMappingURL=339.10c5e684562141ca65db.chunk.js.map \ No newline at end of file diff --git a/public/339.10c5e684562141ca65db.chunk.js.map b/public/339.10c5e684562141ca65db.chunk.js.map new file mode 100644 index 000000000..e21f32d51 --- /dev/null +++ b/public/339.10c5e684562141ca65db.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"339.10c5e684562141ca65db.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport type {InputFile} from '../layer';\r\nimport type {AuthState} from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, {i18n} from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName ?\r\n (name + ' ' + lastName).trim() :\r\n '';\r\n\r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n const sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n // console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n // console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n // console.log('uploaded smthn', inputFile);\r\n\r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n // console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n // console.log('auth.signUp response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n\r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","classList","add","avatarPreview","id","addIco","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","length","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","then","response","_","user","Promise","resolve","reject","inputFile","finally","m","default","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/339.6f9573a4830d89de5c12.chunk.js.map b/public/339.6f9573a4830d89de5c12.chunk.js.map deleted file mode 100644 index 15662cc12..000000000 --- a/public/339.6f9573a4830d89de5c12.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"339.6f9573a4830d89de5c12.chunk.js","mappings":"0HAQe,MAAMA,EAQnBC,YAAYC,GAMVC,KAAKC,QAAUC,SAASC,KAAKC,cAAc,IAAML,EAAQM,WAIzDL,KAAKM,UAAYJ,SAASK,cAAc,OACxCP,KAAKM,UAAUD,UAAY,yBAE3BL,KAAKQ,SAAWN,SAASK,cAAc,OACvCP,KAAKQ,SAASH,UAAY,aAE1BL,KAAKS,MAAQP,SAASK,cAAc,MACjCR,EAAQW,cACTV,KAAKS,MAAME,QAAO,QAAKZ,EAAQW,eAGjCV,KAAKY,SAAWV,SAASK,cAAc,KACvCP,KAAKY,SAASP,UAAY,WACvBN,EAAQc,iBACTb,KAAKY,SAASD,QAAO,QAAKZ,EAAQc,kBAGpCb,KAAKM,UAAUK,OAAOX,KAAKQ,SAAUR,KAAKS,MAAOT,KAAKY,UAEnDb,EAAQe,mBACTd,KAAKe,aAAeb,SAASK,cAAc,OAC3CP,KAAKe,aAAaV,UAAY,gBAC9BL,KAAKM,UAAUK,OAAOX,KAAKe,eAG7Bf,KAAKC,QAAQU,OAAOX,KAAKM,c,uKC7B7B,IAAIU,EAAyC,KAE7C,MAoJA,EANa,IAAI,IAAK,eAAe,GA9IhB,KACnB,MAAMC,EAAO,IAAI,IAAU,CACzBZ,UAAW,cACXS,kBAAkB,EAClBJ,aAAc,WACdG,gBAAiB,4BAGnBI,EAAKT,SAASU,UAAUC,IAAI,eAE5BF,EAAKR,MAAMS,UAAUC,IAAI,YAEzB,MAAMC,EAAgBlB,SAASK,cAAc,UAC7Ca,EAAcC,GAAK,gBACnBD,EAAcf,UAAY,qBAE1B,MAAMiB,EAASpB,SAASK,cAAc,QAKtC,IAAIgB,EAJJD,EAAOjB,UAAY,wBAEnBY,EAAKT,SAASG,OAAOS,EAAeE,GAGpCL,EAAKT,SAASgB,iBAAiB,SAAS,KACtC,gBAAyB,KAAaC,KAAKL,GAAgBM,IACzDH,EAAeG,QAInB,MAAMC,EAAeC,IACnB,MAAMC,EAAOC,EAAeC,OAAS,GAC/BC,EAAWC,EAAmBF,OAAS,GAEvCG,EAAWL,GAAQG,GACpBH,EAAO,IAAMG,GAAUG,OACxB,GAEDD,GAAU,OAAejB,EAAKR,OAAO,OAAcyB,KACjD,OAAejB,EAAKR,OAAO,QAAK,cAiBjCqB,EAAiB,IAAI,IAAW,CACpCM,MAAO,YACPC,UAAW,KAGPJ,EAAqB,IAAI,IAAW,CACxCG,MAAO,WACPC,UAAW,KAGPC,GAAY,OAAO,iCACnBC,EAAU,IAAI,iBAAiB,CAACC,IAAK,mBAwE3C,OAvEAF,EAAU3B,OAAO4B,EAAQtC,SAEzBgB,EAAKF,aAAaJ,OAAOmB,EAAexB,UAAW2B,EAAmB3B,UAAWgC,GAEjFR,EAAeW,MAAMjB,iBAAiB,QAASG,GAC/CM,EAAmBQ,MAAMjB,iBAAiB,QAASG,GAEnDW,EAAUd,iBAAiB,SAAS,SAAiCI,GACnE,GAAGE,EAAeW,MAAMvB,UAAUwB,SAAS,UAAYT,EAAmBQ,MAAMvB,UAAUwB,SAAS,SACjG,OAAO,EAGT,IAAIZ,EAAeC,MAAMY,OAEvB,OADAb,EAAeW,MAAMvB,UAAUC,IAAI,UAC5B,EAGTnB,KAAK4C,UAAW,EAEhB,MAAMf,EAAOC,EAAeC,MAAMI,OAC5BH,EAAWC,EAAmBF,MAAMI,OAEpCU,EAAS,CACbC,aAAc9B,EAAS8B,aACvBC,gBAAiB/B,EAAS+B,gBAC1BC,WAAYnB,EACZoB,UAAWjB,GAKbO,EAAQW,OAAO,CAACV,IAAK,eACrB,MAAMW,GAAY,OAAanD,MAE/B,kCAAwC,cAAe6C,GACtDO,MAAMC,IAIE,uBADAA,EAASC,GAEZ,gCAAsCD,EAASE,MAlEhC,IAAIC,SAAc,CAACC,EAASC,KACjD,IAAInC,EAEF,OAAOkC,IAITlC,IAAe6B,MAAMO,IAGnB,kDAAwDA,GAAWP,KAAKK,EAASC,KAChFA,MAyDgBE,SAAQ,KACnB,8BAAmBR,MAAMS,IACvBA,EAAEC,QAAQC,gBAMdxB,EAAQW,OAAO,CAACV,IAAKa,EAASC,IAC9BtD,KAAKgE,gBAAgB,YACrBb,EAAUc,aAMbC,OAAOC,IACRnE,KAAKgE,gBAAgB,YACrBb,EAAUc,SAEHE,EAAIC,KAEP7B,EAAQW,OAAO,CAACV,IAAK2B,EAAIC,cAMjC,SACO,IAAIZ,SAASC,IAClBY,OAAOC,sBAAsBb,SAIyBc,IACxDvD,EAAWuD,EAEX,yCAA+C,YAAa,CAACjB,EAAG,kBAAmBtC,SAAUuD","sources":["webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, { i18n } from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["LoginPage","constructor","options","this","element","document","body","querySelector","className","container","createElement","imageDiv","title","titleLangKey","append","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","classList","add","avatarPreview","id","addIco","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","contains","length","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","then","response","_","user","Promise","resolve","reject","inputFile","finally","m","default","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode"],"sourceRoot":""} \ No newline at end of file diff --git a/public/392.8a7508144c4d4d66df01.chunk.js.map b/public/392.8a7508144c4d4d66df01.chunk.js.map deleted file mode 100644 index 02f7c30ec..000000000 --- a/public/392.8a7508144c4d4d66df01.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"392.8a7508144c4d4d66df01.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/pages/pageAuthCode.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then((m) => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","Promise","all","loop","autoplay","width","height","then","_animation","currentFrame","pause","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","sentCode","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/392.8a7508144c4d4d66df01.chunk.js b/public/392.c5f7e9130471b94d2250.chunk.js similarity index 97% rename from public/392.8a7508144c4d4d66df01.chunk.js rename to public/392.c5f7e9130471b94d2250.chunk.js index fa58853c7..81f4e9337 100644 --- a/public/392.8a7508144c4d4d66df01.chunk.js +++ b/public/392.c5f7e9130471b94d2250.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[392],{4489:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(503);class a extends i.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a}))}}},3083:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2384);class a{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 n=e.input;n.addEventListener("blur",(()=>{this.playAnimation(0)})),n.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.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),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([i.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(),i.Z.waitForFirstFrame(e)))),i.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.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.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),i.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>g});var i=n(4755),a=n(4874),s=n(810),o=n(3083),l=n(4489),h=n(2325),r=n(144),d=n(5565),u=n(3512);let c,p=null,m=null,y=null;const v=new a.Z("page-authCode",!0,(()=>{const e=p.type.length,t=new l.Z({label:"Code",name:(0,r.a)(),length:e,onFill:e=>{m(e)}});c=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container),v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return s.default.mount()}));const a=()=>{setTimeout((()=>{E.remove()}),300)},m=e=>{c.setAttribute("disabled","true");const i={phone_number:p.phone_number,phone_code_hash:p.phone_code_hash,phone_code:e};u.Z.managers.apiManager.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":u.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(765),n.e(339)]).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:p.phone_number,phone_code_hash:p.phone_code_hash})})),a()}})).catch((e=>{return i=void 0,a=void 0,o=function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(774).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{c.value=""}),300);break;case"PHONE_CODE_EXPIRED":c.classList.add("error"),(0,d.Z)(t.label,(0,h.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":c.classList.add("error"),(0,d.Z)(t.label,(0,h.ag)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),c.removeAttribute("disabled")},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{h(o.next(e))}catch(e){t(e)}}function l(e){try{h(o.throw(e))}catch(e){t(e)}}function h(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(n,l)}h((o=o.apply(i,a||[])).next())}));var i,a,s,o}))},y=v.pageEl.querySelector(".auth-image"),g=i.Z.isMobile?100:166,E=new o.Z(t,g);return y.append(E.container),E.load()}),(e=>{if(p=e,m){c.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),c.dispatchEvent(e)}else m=v.pageEl.getElementsByClassName("phone")[0],y=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(m.innerText=p.phone_number,p.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[p.type._]}(0,d.Z)(y,(0,h.ag)(t,n)),u.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{c.focus()})),g=v}}]); -//# sourceMappingURL=392.8a7508144c4d4d66df01.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[392],{4489:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(503);class a extends i.Z{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a}))}}},3083:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2384);class a{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 n=e.input;n.addEventListener("blur",(()=>{this.playAnimation(0)})),n.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.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),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([i.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(),i.Z.waitForFirstFrame(e)))),i.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.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.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")})),i.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6392:(e,t,n)=>{n.r(t),n.d(t,{default:()=>g});var i=n(4755),a=n(4874),s=n(810),o=n(3083),l=n(4489),h=n(2325),r=n(144),d=n(5565),u=n(3512);let c,p=null,m=null,y=null;const v=new a.Z("page-authCode",!0,(()=>{const e=p.type.length,t=new l.Z({label:"Code",name:(0,r.a)(),length:e,onFill:e=>{m(e)}});c=t.input,v.pageEl.querySelector(".input-wrapper").append(t.container),v.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return s.default.mount()}));const a=()=>{setTimeout((()=>{E.remove()}),300)},m=e=>{c.setAttribute("disabled","true");const i={phone_number:p.phone_number,phone_code_hash:p.phone_code_hash,phone_code:e};u.Z.managers.apiManager.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then((e=>{switch(e._){case"auth.authorization":u.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>{e.default.mount()})),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(765),n.e(339)]).then(n.bind(n,8339)).then((e=>{e.default.mount({phone_number:p.phone_number,phone_code_hash:p.phone_code_hash})})),a()}})).catch((e=>{return i=void 0,a=void 0,o=function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(836).then(n.bind(n,9437))).default.mount(),setTimeout((()=>{c.value=""}),300);break;case"PHONE_CODE_EXPIRED":c.classList.add("error"),(0,d.Z)(t.label,(0,h.ag)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":c.classList.add("error"),(0,d.Z)(t.label,(0,h.ag)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),c.removeAttribute("disabled")},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{h(o.next(e))}catch(e){t(e)}}function l(e){try{h(o.throw(e))}catch(e){t(e)}}function h(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(n,l)}h((o=o.apply(i,a||[])).next())}));var i,a,s,o}))},y=v.pageEl.querySelector(".auth-image"),g=i.Z.isMobile?100:166,E=new o.Z(t,g);return y.append(E.container),E.load()}),(e=>{if(p=e,m){c.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),c.dispatchEvent(e)}else m=v.pageEl.getElementsByClassName("phone")[0],y=v.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(m.innerText=p.phone_number,p.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[p.type._]}(0,d.Z)(y,(0,h.ag)(t,n)),u.Z.managers.appStateManager.pushToState("authState",{_:"authStateAuthCode",sentCode:e})}),(()=>{c.focus()})),g=v}}]); +//# sourceMappingURL=392.c5f7e9130471b94d2250.chunk.js.map \ No newline at end of file diff --git a/public/392.c5f7e9130471b94d2250.chunk.js.map b/public/392.c5f7e9130471b94d2250.chunk.js.map new file mode 100644 index 000000000..fa8d1a3e8 --- /dev/null +++ b/public/392.c5f7e9130471b94d2250.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"392.c5f7e9130471b94d2250.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/pages/pageAuthCode.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, {InputFieldOptions} from './inputField';\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n\r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n\r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n\r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from '../inputField';\r\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n\r\n frame = 0;\r\n }\r\n // animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n // console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n\r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n // animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n // console.log('enterFrame', currentFrame, needFrame);\r\n // let currentFrame = Math.round(e.currentTime);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n // animation.curFrame = 0;\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n // console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AuthSentCode, AuthSentCodeType, AuthSignIn} from '../layer';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport {randomLong} from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nconst onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n // console.log('invoking auth.signIn with params:', params);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n // console.log('auth.signIn response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n // console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then((m) => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n // console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp':\r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall':\r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","Promise","all","loop","autoplay","width","height","then","_animation","currentFrame","pause","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","sentCode","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/436.66de9e85049775fcc1d9.chunk.js.map b/public/436.66de9e85049775fcc1d9.chunk.js.map deleted file mode 100644 index 19c3f6a36..000000000 --- a/public/436.66de9e85049775fcc1d9.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"436.66de9e85049775fcc1d9.chunk.js","mappings":"yKAoDA,MAAMA,EAAO,I,QAAI,GAAK,cAAc,GAxCjB,KACjB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,kFACCR,MAAK,KACNS,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport I18n from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then((langPack) => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/436.66de9e85049775fcc1d9.chunk.js b/public/436.9cbf04ee8ad06e3a5339.chunk.js similarity index 64% rename from public/436.66de9e85049775fcc1d9.chunk.js rename to public/436.9cbf04ee8ad06e3a5339.chunk.js index 8c52f78a9..67bd98648 100644 --- a/public/436.66de9e85049775fcc1d9.chunk.js +++ b/public/436.9cbf04ee8ad06e3a5339.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[436,781],{5436:(e,a,t)=>{t.r(a),t.d(a,{default:()=>l});var n=t(8799),s=t(4541),g=t(2325),h=t(3512);const u=new(t(4874).Z)("page-chats",!1,(()=>(h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),g.ZP.requestedServerLanguage||g.ZP.getCacheLangPack().then((e=>{e.local&&g.ZP.getLangPack(e.lang_code)})),u.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.all([t.e(458),t.e(665),t.e(765),t.e(27),t.e(126)]).then(t.bind(t,2126))]).then((()=>{setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),l=u}}]); -//# sourceMappingURL=436.66de9e85049775fcc1d9.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[436,781],{5436:(e,a,t)=>{t.r(a),t.d(a,{default:()=>l});var n=t(8799),s=t(4541),g=t(2325),h=t(3512);const u=new(t(4874).Z)("page-chats",!1,(()=>(h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),g.ZP.requestedServerLanguage||g.ZP.getCacheLangPack().then((e=>{e.local&&g.ZP.getLangPack(e.lang_code)})),u.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.all([t.e(458),t.e(665),t.e(765),t.e(292),t.e(911)]).then(t.bind(t,3911))]).then((()=>{setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),l=u}}]); +//# sourceMappingURL=436.9cbf04ee8ad06e3a5339.chunk.js.map \ No newline at end of file diff --git a/public/436.9cbf04ee8ad06e3a5339.chunk.js.map b/public/436.9cbf04ee8ad06e3a5339.chunk.js.map new file mode 100644 index 000000000..cbcb8c324 --- /dev/null +++ b/public/436.9cbf04ee8ad06e3a5339.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"436.9cbf04ee8ad06e3a5339.chunk.js","mappings":"yKAYA,MAwCMA,EAAO,I,QAAI,GAAK,cAAc,GAxCf,KACnB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,mFACCR,MAAK,KACNS,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport loadFonts from '../helpers/dom/loadFonts';\r\nimport I18n from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport Page from './page';\r\n\r\nconst onFirstMount = () => {\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then((langPack) => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n\r\n // AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n // (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/437.613a8ab2d0385dea0bb4.chunk.js b/public/437.613a8ab2d0385dea0bb4.chunk.js deleted file mode 100644 index 50c04765d..000000000 --- a/public/437.613a8ab2d0385dea0bb4.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[437,442,774],{4494:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);const a=(e,t={})=>{const i=document.createElement(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}},4425:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2384);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.onVisibilityClickAdditional=()=>{this.passwordInputField.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()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),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()};const t=this.input;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"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},279:(e,t,i)=>{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},1405:(e,t,i)=>{i.d(t,{Z:()=>d});var s=i(8497),n=i(9674),a=i(5432),r=i(3512),o=i(5975);let l=0;function d(e,t=(()=>Promise.resolve()),i=null,d=!1,c=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let p,h=document.createElement("div");h.classList.add("c-ripple"),e.classList.contains("rp-square")&&h.classList.add("is-square"),e[d?"prepend":"append"](h);const u=(e,s)=>{const r=Date.now(),o=document.createElement("div"),d=l++,c=1e3*+window.getComputedStyle(h).getPropertyValue("--ripple-duration").replace("s","");p=()=>{let e=Date.now()-r;const t=()=>{n.Z.mutate((()=>{o.remove()})),i&&i(d)};if(eo.classList.add("hiding")),Math.max(i-c/2,0)),setTimeout(t,i)}else o.classList.add("hiding"),setTimeout(t,c/2);a.Z||window.removeEventListener("contextmenu",p),p=null,w=!1},t&&t(d),window.requestAnimationFrame((()=>{const t=h.getBoundingClientRect();o.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)),r=i-a/2,l=n-a/2;o.style.width=o.style.height=a+"px",o.style.left=r+"px",o.style.top=l+"px",h.append(o)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==h)&&(c===e||!(0,o.Z)(t.target,c));let w=!1;if(a.Z){let e=()=>{p&&p()};c.addEventListener("touchstart",(t=>{if(!r.Z.settings.animationsEnabled)return;if(t.touches.length>1||w||m(t))return;w=!0;let{clientX:i,clientY:s}=t.touches[0];u(i,s),c.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),c.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else c.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!r.Z.settings.animationsEnabled)return;if("0"===c.dataset.ripple||m(e))return;if(w)return void(w=!1);let{clientX:t,clientY:i}=e;u(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{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})},9674:(e,t,i)=>{i.d(t,{Z:()=>l});var s=i(3035),n=i(3725),a=i(410),r=i(8487);const o=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,r.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?t():s.then((()=>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=o);const l=o},2582:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2325);class n{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>L});var s=i(279),n=i(4755),a=i(4874),r=i(4494),o=i(6830),l=i(4425),d=i(2325),c=i(2582),p=i(3910),h=i(2738),u=i(2614),m=i(5565),w=i(1656),g=i(8115),v=i(3512);let b;const L=new a.Z("page-password",!0,(()=>{const e=new c.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),a=new d.ZP.IntlElement({key:"Login.Next"});t.append(a.element);const L=new o.Z({label:"LoginPassword",name:"password"});let y;b=L.input,e.inputWrapper.append(L.container,t);let Z,f=()=>(y||(y=window.setInterval(f,1e4)),v.Z.managers.passwordManager.getState().then((e=>{Z=e,Z.hint?(0,m.Z)(L.label,(0,u.Z)((0,g.Z)(Z.hint))):L.setLabel()})));const E=e=>{if(e&&(0,p.Z)(e),!b.value.length)return void b.classList.add("error");const n=(0,w.Z)([b,t],!0);let r=b.value;a.update({key:"PleaseWait"});const o=(0,s.y)(t);L.setValueSilently(""+Math.random()),L.setValueSilently(r),v.Z.managers.passwordManager.check(r,Z).then((e=>{"auth.authorization"===e._?(clearInterval(y),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),x&&x.remove()):(t.removeAttribute("disabled"),a.update({key:e._}),o.remove())})).catch((e=>{n(),L.input.classList.add("error"),e.type,a.update({key:"PASSWORD_HASH_INVALID"}),b.select(),o.remove(),f()}))};(0,h.fc)(t,E),b.addEventListener("keypress",(function(e){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const k=n.Z.isMobile?100:166,x=new l.Z(L,k);return e.imageDiv.append(x.container),Promise.all([x.load(),f()])}),null,(()=>{b.focus(),v.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); -//# sourceMappingURL=437.613a8ab2d0385dea0bb4.chunk.js.map \ No newline at end of file diff --git a/public/437.613a8ab2d0385dea0bb4.chunk.js.map b/public/437.613a8ab2d0385dea0bb4.chunk.js.map deleted file mode 100644 index eb6fd519f..000000000 --- a/public/437.613a8ab2d0385dea0bb4.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"437.613a8ab2d0385dea0bb4.chunk.js","mappings":"4IAmBA,MA2BA,EA3Be,CAACA,EAAmBC,EAAyB,MAC1D,MAAMC,EAA4BC,SAASC,cAAcH,EAAQI,MAAQ,MAAQ,UAuBjF,OAtBAH,EAAOF,UAAYA,GAAaC,EAAQK,KAAO,UAAYL,EAAQK,KAAO,IAEtEL,EAAQM,WACPN,EAAQO,cACTN,EAAOO,UAAUC,IAAI,cAGvB,OAAOR,IAGND,EAAQU,YACTT,EAAOO,UAAUC,IAAI,kBAGpBT,EAAQW,UACTV,EAAOW,aAAa,WAAY,QAG/BZ,EAAQa,MACTZ,EAAOa,QAAO,QAAKd,EAAQa,OAGtBZ,I,8CCjCM,MAAMc,EAMnBC,YAAsBC,EAAkDC,GAAlD,KAAAD,mBAAAA,EAAkD,KAAAC,KAAAA,EAHjE,KAAAC,UAAY,EAIjBC,KAAKC,UAAYnB,SAASC,cAAc,OACxCiB,KAAKC,UAAUb,UAAUC,IAAI,yBAGxBa,OACL,OAAGF,KAAKG,YAAoBH,KAAKG,YAC1BH,KAAKG,YAAc,yBAAkC,CAC1DF,UAAWD,KAAKC,UAChBG,MAAM,EACNC,UAAU,EACVC,MAAON,KAAKF,KACZS,OAAQP,KAAKF,KACbU,SAAS,GAER,4BAA4BC,MAAMC,IAEnCV,KAAKW,UAAYD,EACjBV,KAAKW,UAAUC,iBAAiB,cAAcC,KAGX,IAA7Bb,KAAKW,UAAUG,WAAmBD,GAAgBb,KAAKD,YAC1B,IAA9BC,KAAKW,UAAUG,WAAoBD,GAAgBb,KAAKD,aACvDC,KAAKW,UAAUI,SAAS,GACxBf,KAAKW,UAAUK,YAIrBhB,KAAKH,mBAAmBoB,4BAA8B,KACjDjB,KAAKH,mBAAmBqB,iBACzBlB,KAAKW,UAAUQ,aAAa,GAC5BnB,KAAKW,UAAUS,SAAW,EAC1BpB,KAAKD,UAAY,GACjBC,KAAKW,UAAUU,SAEfrB,KAAKW,UAAUQ,cAAc,GAC7BnB,KAAKW,UAAUS,SAAW,GAC1BpB,KAAKD,UAAY,EACjBC,KAAKW,UAAUU,SAIZ,sBAA+BX,MAInCY,SACFtB,KAAKW,WACNX,KAAKW,UAAUW,Y,uDCtDN,MAAMC,UAA2B,IAK9C3B,YAAYhB,EAA6B,IACvC4C,MAAM,OAAD,QACHC,WAAW,GACR7C,IAPA,KAAAsC,iBAAkB,EAyClB,KAAAQ,kBAAqBC,KAC1B,OAAYA,GACZ3B,KAAKkB,iBAAmBlB,KAAKkB,gBAE7BlB,KAAK4B,cAAcxC,UAAUyC,OAAO,aAAc7B,KAAKkB,iBACtDlB,KAAK8B,MAA2BC,KAAO/B,KAAKkB,gBAAkB,OAAS,WACxElB,KAAKiB,6BAA+BjB,KAAKiB,+BArCzC,MAAMa,EAAQ9B,KAAK8B,MACnBA,EAAMC,KAAO,WACbD,EAAMtC,aAAa,WAAY,IAC/BsC,EAAME,KAAO,qBACbF,EAAMG,aAAe,MAUrB,MAAMC,EAAWpD,SAASC,cAAc,SACxCmD,EAAS9C,UAAUC,IAAI,YACvB6C,EAASC,UAAY,EACrBD,EAASH,KAAO,WAChBD,EAAMM,cAAcC,QAAQH,GAC5BJ,EAAMM,cAAcE,aAAaJ,EAASK,YAAaT,EAAMU,aAE7D,MAAMZ,EAAgB5B,KAAK4B,cAAgB9C,SAASC,cAAc,QAClE6C,EAAcxC,UAAUC,IAAI,iBAAkB,SAE9CW,KAAKC,UAAUb,UAAUC,IAAI,wBAC7BW,KAAKC,UAAUP,OAAOkC,GAEtBA,EAAchB,iBAAiB,QAASZ,KAAK0B,mBAC7CE,EAAchB,iBAAiB,WAAYZ,KAAK0B,sB,cCzC7C,SAASe,EAAaC,EAAeC,GAAY,GACtD,MAAMC,EAAO,wMAKb,GAAGD,EAAW,CACZ,MAAME,EAAM/D,SAASC,cAAc,OAQnC,OAPA8D,EAAIzD,UAAUC,IAAI,aAClBwD,EAAIC,UAAYF,EAEbF,GACDA,EAAKK,YAAYF,GAGZA,EAIT,OADAH,EAAKM,mBAAmB,YAAaJ,GAC9BF,EAAKO,iBAKP,SAASC,EAAgBR,EAAyBzD,EAAO,SAK9D,OAJAyD,EAAKtD,UAAUkC,OAAO,SAAWrC,GACjCyD,EAAKnD,UAAW,EAChBkD,EAAaC,GAEN,KACLA,EAAKI,UAAY,GACjBJ,EAAKtD,UAAUC,IAAI,SAAWJ,GAC9ByD,EAAKS,gBAAgB,a,gCAVzB,gBAA8BV,G,sFClB9B,IAAIW,EAAgB,EACL,SAASC,EACtBX,EACAY,EAAoD,KAAMC,QAAQC,WAClEC,EAA8B,KAC9BpB,GAAU,EACVqB,EAAmBhB,GAGnB,GAAGA,EAAKiB,cAAc,aAAc,OACpCjB,EAAKtD,UAAUC,IAAI,MAEnB,IAUIuE,EAVAC,EAAI/E,SAASC,cAAc,OAC/B8E,EAAEzE,UAAUC,IAAI,YAECqD,EAAKtD,UAAU0E,SAAS,cAEvCD,EAAEzE,UAAUC,IAAI,aAGlBqD,EAAKL,EAAU,UAAY,UAAUwB,GAIrC,MAAME,EAAa,CAACC,EAAiBC,KACnC,MAAMC,EAAYC,KAAKC,MACjB1B,EAAO5D,SAASC,cAAc,OAE9BsF,EAAUjB,IAIVkB,EAAgG,KAApFC,OAAOC,iBAAiBX,GAAGY,iBAAiB,qBAAqBC,QAAQ,IAAK,IAGhGd,EAAU,KAMR,IAAIe,EAAcR,KAAKC,MAAQF,EAC/B,MAAMU,EAAK,KAET,YAAqB,KACnBlC,EAAKpB,YAGJmC,GAAOA,EAAMY,IAElB,GAAGM,EAAcL,EAAU,CACzB,IAAIO,EAAQC,KAAKC,IAAIT,EAAWK,EAAaL,EAAW,GACxDU,YAAW,IAAMtC,EAAKtD,UAAUC,IAAI,WAAWyF,KAAKC,IAAIF,EAAQP,EAAW,EAAG,IAE9EU,WAAWJ,EAAIC,QAEfnC,EAAKtD,UAAUC,IAAI,UACnB2F,WAAWJ,EAAIN,EAAW,GAGxB,KACFC,OAAOU,oBAAoB,cAAerB,GAG5CA,EAAU,KACVsB,GAAkB,GAIpB5B,GAAYA,EAASe,GAenBE,OAAOY,uBAAsB,KAC3B,MAAMC,EAAOvB,EAAEwB,wBACf3C,EAAKtD,UAAUC,IAAI,oBAEnB,MAAMiG,EAAStB,EAAUoB,EAAKG,KACxBC,EAASvB,EAAUmB,EAAKK,IAGxB3F,EADSgF,KAAKY,KAAK,SAACZ,KAAKa,IAAIH,EAASJ,EAAK7E,OAAS,GAAK6E,EAAK7E,OAAS,EAAM,GAAI,SAACuE,KAAKa,IAAIL,EAASF,EAAK9E,MAAQ,GAAK8E,EAAK9E,MAAQ,EAAM,IAIzIsF,EAAIN,EAASxF,EAAO,EACpB+F,EAAIL,EAAS1F,EAAO,EAI1B4C,EAAKoD,MAAMxF,MAAQoC,EAAKoD,MAAMvF,OAAST,EAAO,KAC9C4C,EAAKoD,MAAMP,KAAOK,EAAI,KACtBlD,EAAKoD,MAAML,IAAMI,EAAI,KAgBrBhC,EAAEnE,OAAOgD,OAQTqD,EAAoBpE,GAAaA,EAAEqE,SAAWtD,IAChD,CAAC,SAAU,KAAKuD,SAAUtE,EAAEqE,OAAuBE,WAChD,OAAgBvE,EAAEqE,OAAuB,cAAgBnC,KAE5DH,IAAqBhB,KACjB,OAAcf,EAAEqE,OAAQtC,IAIhC,IAAIwB,GAAkB,EACtB,GAAG,IAAoB,CACrB,IAAIiB,EAAW,KACbvC,GAAWA,KAGbF,EAAiB9C,iBAAiB,cAAee,IAC/C,IAAI,+BACF,OAIF,GAAGA,EAAEyE,QAAQC,OAAS,GAAKnB,GAAmBa,EAAiBpE,GAC7D,OAIFuD,GAAkB,EAElB,IAAI,QAAClB,EAAO,QAAEC,GAAWtC,EAAEyE,QAAQ,GACnCrC,EAAWC,EAASC,GACpBP,EAAiB9C,iBAAiB,WAAYuF,EAAU,CAACG,MAAM,IAE/D/B,OAAO3D,iBAAiB,aAAce,IACpCA,EAAE4E,cAAe,EACjB5E,EAAE6E,kBACFL,IACAzC,EAAiBuB,oBAAoB,WAAYkB,KAChD,CAACG,MAAM,MACT,CAACG,SAAS,SAEb/C,EAAiB9C,iBAAiB,aAAce,IAC9C,IAAI,CAAC,EAAG,GAAGsE,SAAStE,EAAE9C,QACpB,OAGF,IAAI,+BACF,OAIF,GAAuC,MAApC6E,EAAiBgD,QAAQrD,QAAkB0C,EAAiBpE,GAC7D,OACK,GAAGuD,EAER,YADAA,GAAkB,GAIpB,IAAI,QAAClB,EAAO,QAAEC,GAAWtC,EACzBoC,EAAWC,EAASC,GACpBM,OAAO3D,iBAAiB,UAAWgD,EAAS,CAAC0C,MAAM,EAAMG,SAAS,IAClElC,OAAO3D,iBAAiB,cAAegD,EAAS,CAAC0C,MAAM,EAAMG,SAAS,MACrE,CAACA,SAAS,M,eCjMF,SAASE,EAAW/D,GACjC,MAAMgE,EAAO9H,SAASC,cAAc,QAGpC,MAFoB,iBAAX,EAAqB6H,EAAK9D,UAAYF,EAC1CgE,EAAKlH,OAAOkD,GACVgE,E,iCCJM,SAASC,EAAiBC,EAAyBC,GAOhE,OANGA,EACDD,EAASE,SAASC,GAAOA,EAAGzH,aAAa,WAAY,UAErDsH,EAASE,SAASC,GAAOA,EAAG9D,gBAAgB,cAGvC,IAAM0D,EAAiBC,GAAWC,G,6FC+D3C,MAAMG,EAAgB,IAjEtB,oBACU,KAAAC,SAGH,GACG,KAAAC,IAAM,UAAa,MACnB,KAAAC,WAAY,EAEZC,GAAGC,EAAuCjE,GAChD,IAAIkE,EAAUxH,KAAKmH,SAASI,GAU5B,OATIC,IACFxH,KAAKyH,gBACLD,EAAUxH,KAAKmH,SAASI,IAAQ,eAGlBG,IAAbpE,GACDkE,EAAQ/G,MAAK,IAAM6C,MAGdkE,EAGFG,QAAQrE,GACb,OAAOtD,KAAKsH,GAAG,OAAQhE,GAGlBsE,OAAOtE,GACZ,OAAOtD,KAAKsH,GAAG,QAAShE,GAQnBuE,cAAcC,EAAsBxE,GACzC,MAAMyE,GAAc,OAAQD,GACtBN,EAAUO,EAAc/H,KAAK4H,SAAWrE,QAAQC,UAUtD,YARgBkE,IAAbpE,IACEyE,EACDzE,IAEAkE,EAAQ/G,MAAK,IAAM6C,OAIhBkE,EAGDC,gBACFzH,KAAKqH,YACPrH,KAAKqH,WAAY,EAEjBrH,KAAKoH,KAAI,KACPpH,KAAKmH,SAASa,MAAQhI,KAAKmH,SAASa,KAAKxE,UACzCxD,KAAKmH,SAASc,OAASjI,KAAKmH,SAASc,MAAMzE,UAE3CxD,KAAKqH,WAAY,EACjBrH,KAAKmH,SAAW,SAOxB,OAAmB,mBAA+BD,GAClD,W,8CCtEe,MAAMgB,EAQnBtI,YAAYhB,GAMVoB,KAAK8H,QAAUhJ,SAASqJ,KAAKxE,cAAc,IAAM/E,EAAQD,WAIzDqB,KAAKC,UAAYnB,SAASC,cAAc,OACxCiB,KAAKC,UAAUtB,UAAY,yBAE3BqB,KAAKoI,SAAWtJ,SAASC,cAAc,OACvCiB,KAAKoI,SAASzJ,UAAY,aAE1BqB,KAAKqI,MAAQvJ,SAASC,cAAc,MACjCH,EAAQ0J,cACTtI,KAAKqI,MAAM3I,QAAO,QAAKd,EAAQ0J,eAGjCtI,KAAKuI,SAAWzJ,SAASC,cAAc,KACvCiB,KAAKuI,SAAS5J,UAAY,WACvBC,EAAQ4J,iBACTxI,KAAKuI,SAAS7I,QAAO,QAAKd,EAAQ4J,kBAGpCxI,KAAKC,UAAUP,OAAOM,KAAKoI,SAAUpI,KAAKqI,MAAOrI,KAAKuI,UAEnD3J,EAAQ6J,mBACTzI,KAAK0I,aAAe5J,SAASC,cAAc,OAC3CiB,KAAK0I,aAAa/J,UAAY,gBAC9BqB,KAAKC,UAAUP,OAAOM,KAAK0I,eAG7B1I,KAAK8H,QAAQpI,OAAOM,KAAKC,c,sMC3B7B,IAAI0I,EAuHJ,MAQA,EARa,IAAI,IAAK,iBAAiB,GArHpB,KACjB,MAAMC,EAAO,IAAI,IAAU,CACzBjK,UAAW,gBACX8J,kBAAkB,EAClBH,aAAc,uBACdE,gBAAiB,4BAGbK,GAAU,OAAO,iCACjBC,EAAc,IAAI,iBAAiB,CAACC,IAAK,eAE/CF,EAAQnJ,OAAOoJ,EAAYhB,SAE3B,MAAMjI,EAAqB,IAAI,IAAmB,CAChDmJ,MAAO,gBACPhH,KAAM,aAOR,IAAIiH,EAJJN,EAAgB9I,EAAmBiC,MAEnC8G,EAAKF,aAAahJ,OAAOG,EAAmBI,UAAW4I,GAIvD,IAiBIK,EAjBAC,EAAW,KAETF,IACFA,EAAmB1E,OAAO6E,YAAYD,EAAU,MAGlC,wCAA8C1I,MAAM4I,IAClEH,EAAQG,EAELH,EAAMI,MACP,OAAezJ,EAAmBmJ,OAAO,QAAW,OAAcE,EAAMI,QAExEzJ,EAAmB0J,eAOzB,MAAMC,EAAY7H,IAKhB,GAJGA,IACD,OAAYA,IAGVgH,EAAcc,MAAMpD,OAEtB,YADAsC,EAAcvJ,UAAUC,IAAI,SAI9B,MAAMwC,GAAS,OAAiB,CAAC8G,EAAeE,IAAU,GAC1D,IAAIY,EAAQd,EAAcc,MAE1BX,EAAYY,OAAO,CAACX,IAAK,eACzB,MAAMY,GAAY,OAAad,GAE/BhJ,EAAmB+J,iBAAiB,GAAK9E,KAAK+E,UAC9ChK,EAAmB+J,iBAAiBH,GAEpC,mCAAyCA,EAAOP,GAAOzI,MAAMqJ,IAIpD,uBADAA,EAASC,GAEZC,cAAcf,GACd,8BAAmBxI,MAAMwJ,IACvBA,EAAEC,QAAQC,WAETC,GAAQA,EAAO9I,WAGlBuH,EAAQ1F,gBAAgB,YACxB2F,EAAYY,OAAO,CAACX,IAAKe,EAASC,IAClCJ,EAAUrI,aAGb+I,OAAOC,IACRzI,IACAhC,EAAmBiC,MAAM1C,UAAUC,IAAI,SAEhCiL,EAAIvI,KAGP+G,EAAYY,OAAO,CAACX,IAAK,0BACzBJ,EAAc4B,SAIlBZ,EAAUrI,SAEV6H,SAIJ,QAAiBN,EAASW,GAE1Bb,EAAc/H,iBAAiB,YAAY,SAAee,GAIxD,GAHA3B,KAAKZ,UAAUkC,OAAO,SACtBwH,EAAYY,OAAO,CAACX,IAAK,eAEZ,UAAVpH,EAAEoH,IACH,OAAOS,OAIX,MAAM1J,EAAO,aAAsB,IAAM,IACnCsK,EAAS,IAAI,IAAevK,EAAoBC,GAEtD,OADA8I,EAAKR,SAAS1I,OAAO0K,EAAOnK,WACrBsD,QAAQiH,IAAI,CACjBJ,EAAOlK,OACPiJ,QAIuD,MAAM,KAE7DR,EAAc8B,QAGhB,yCAA+C,YAAa,CAACV,EAAG","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","Promise","resolve","onEnd","attachListenerTo","querySelector","handler","r","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","touches","length","once","cancelBubble","stopPropagation","passive","dataset","htmlToSpan","span","toggleDisability","elements","disable","forEach","el","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","LoginPage","body","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","state","getState","setInterval","_state","hint","setLabel","onSubmit","value","update","preloader","setValueSilently","random","response","_","clearInterval","m","default","mount","monkey","catch","err","select","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/437.8cd31f38250954e80fcd.bundle.js b/public/437.8cd31f38250954e80fcd.bundle.js new file mode 100644 index 000000000..a179358fc --- /dev/null +++ b/public/437.8cd31f38250954e80fcd.bundle.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[437],{410:(s,t,e)=>{e.d(t,{GO:()=>n,ZP:()=>o});const i=e(1267).Z.debug,n="undefined"!=typeof window?window:self,o=i},1267:(s,t,e)=>{e.d(t,{Z:()=>n});const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};i.http=location.search.indexOf("http=1")>0,i.http&&(i.transport="https");const n=i},6761:(s,t,e)=>{e.d(t,{Z:()=>i});const i="undefined"!=typeof window?window:self},4064:(s,t,e)=>{function i(s,t){const e=s.findIndex(t);return-1!==e?s.splice(e,1)[0]:void 0}e.d(t,{Z:()=>i})},1655:(s,t,e)=>{function i(s,t){const e=s.indexOf(t),i=-1!==e&&s.splice(e,1);return i&&i[0]}e.d(t,{Z:()=>i})},5289:(s,t,e)=>{e.d(t,{Z:()=>n});const i=Date.now();function n(){return"["+((Date.now()-i)/1e3).toFixed(3)+"]"}},3241:(s,t,e)=>{e.d(t,{Z:()=>n});var i=e(4064);class n{constructor(s){this._constructor(s)}_constructor(s=!1){this.reuseResults=s,this.listeners={},this.listenerResults={}}addEventListener(s,t,e){var i;(null!==(i=this.listeners[s])&&void 0!==i?i:this.listeners[s]=[]).push({callback:t,options:e}),this.listenerResults.hasOwnProperty(s)&&(t(...this.listenerResults[s]),null==e?void 0:e.once)&&this.listeners[s].pop()}addMultipleEventsListeners(s){for(const t in s)this.addEventListener(t,s[t])}removeEventListener(s,t,e){this.listeners[s]&&(0,i.Z)(this.listeners[s],(s=>s.callback===t))}invokeListenerCallback(s,t,...e){var i;let n;try{n=t.callback(...e)}catch(s){console.error(s)}return(null===(i=t.options)||void 0===i?void 0:i.once)&&this.removeEventListener(s,t.callback),n}_dispatchEvent(s,t,...e){this.reuseResults&&(this.listenerResults[s]=e);const i=t&&[],n=this.listeners[s];return n&&n.slice().forEach((t=>{if(-1===n.findIndex((s=>s.callback===t.callback)))return;const o=this.invokeListenerCallback(s,t,...e);i&&i.push(o)})),i}dispatchResultableEvent(s,...t){return this._dispatchEvent(s,!0,...t)}dispatchEvent(s,...t){this._dispatchEvent(s,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},153:(s,t,e)=>{e.d(t,{Z:()=>h});var i=e(410),n=e(6761),o=e(1655),r=e(1352),a=e(3241),c=e(5003);class h extends a.Z{constructor(s){super(!1),this.onMessage=s=>{const t=s.data,e=s.source||s.currentTarget;this.processTaskMap[t.type](t,e,s)},this.processResultTask=s=>{const{taskId:t,result:e,error:i}=s.payload,n=this.awaiting[t];n&&(this.debug&&this.log.debug("done",n.taskType,e,i),"error"in s.payload?n.reject(i):n.resolve(e),delete this.awaiting[t])},this.processAckTask=s=>{const t=s.payload,e=this.awaiting[t.taskId];e&&((0,e.resolve)({cached:t.cached,result:t.cached?"result"in t?Promise.resolve(t.result):Promise.reject(t.error):new Promise(((s,t)=>{e.resolve=s,e.reject=t}))}),t.cached&&delete this.awaiting[t.taskId])},this.processPingTask=(s,t,e)=>{this.pushTask(this.createTask("pong",void 0),e.source)},this.processPongTask=(s,t,e)=>{const i=this.pingResolves.get(t);i&&(this.pingResolves.delete(t),i())},this.processCloseTask=(s,t,e)=>{this.detachPort(t)},this.processInvokeTask=(s,t,e)=>{return i=this,n=void 0,r=function*(){const i=s.id,n=s.payload;let o,r,a,c;n.void||(o={taskId:i},r=this.createTask("result",o)),n.withAck&&(a=this.createTask("ack",{taskId:i,cached:!0}));try{const s=this.listeners[n.type];if(!(null==s?void 0:s.length))throw new Error("no listener");const i=s[0];let r=this.invokeListenerCallback(n.type,i,n.payload,t,e);if(n.void)return;if(c=r instanceof Promise,a){const s=!c;if(a.payload.cached=s,s&&(a.payload.result=r),this.pushTask(a,t),s)return}c&&(r=yield r),o.result=r}catch(e){if(this.log.error("worker task error:",e,s),n.void)return;if(a&&a.payload.cached)return a.payload.error=e,void this.pushTask(a,t);o.error=e}this.pushTask(r,t)},new((o=void 0)||(o=Promise))((function(s,t){function e(s){try{c(r.next(s))}catch(s){t(s)}}function a(s){try{c(r.throw(s))}catch(s){t(s)}}function c(t){var i;t.done?s(t.value):(i=t.value,i instanceof o?i:new o((function(s){s(i)}))).then(e,a)}c((r=r.apply(i,n||[])).next())}));var i,n,o,r},this.listenPorts=[],this.sendPorts=[],this.pingResolves=new Map,this.taskId=0,this.awaiting={},this.pending=new Map,this.log=(0,c.kg)("MP"+(s?"-"+s:"")),this.debug=i.ZP,"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{const s=this.createTask("close",void 0);this.postMessage(void 0,s)})),this.processTaskMap={result:this.processResultTask,ack:this.processAckTask,invoke:this.processInvokeTask,ping:this.processPingTask,pong:this.processPongTask,close:this.processCloseTask}}setOnPortDisconnect(s){this.onPortDisconnect=s}attachPort(s){this.attachListenPort(s),this.attachSendPort(s)}attachListenPort(s){this.listenPorts.push(s),s.addEventListener("message",this.onMessage)}attachSendPort(s){var t,e;this.log.warn("attaching send port"),null===(e=(t=s).start)||void 0===e||e.call(t),this.sendPorts.push(s),this.releasePending()}detachPort(s){var t,e,i,n;this.log.warn("disconnecting port"),(0,o.Z)(this.listenPorts,s),(0,o.Z)(this.sendPorts,s),null===(t=s.removeEventListener)||void 0===t||t.call(s,"message",this.onMessage),null===(i=(e=s).close)||void 0===i||i.call(e),null===(n=this.onPortDisconnect)||void 0===n||n.call(this,s);const r=new Error("PORT_DISCONNECTED");for(const t in this.awaiting){const e=this.awaiting[t];e.port===s&&(e.reject(r),delete this.awaiting[t])}}postMessage(s,t){(Array.isArray(s)?s:s?[s]:this.sendPorts).forEach((s=>{s.postMessage(t,t.transfer)}))}releasePending(){this.releasingPending||(this.releasingPending=!0,this.debug&&this.log.debug("releasing tasks, length:",this.pending.size),this.pending.forEach(((s,t)=>{const e=s,i=t?[t]:this.sendPorts;i.length&&(e.forEach((s=>{try{this.postMessage(i,s)}catch(t){this.log.error("postMessage error:",t,s,i)}})),this.pending.delete(t))})),this.debug&&this.log.debug("released tasks"),this.releasingPending=!1)}createTask(s,t,e){return{type:s,payload:t,id:this.taskId++,transfer:e}}createInvokeTask(s,t,e,i,n){return this.createTask("invoke",{type:s,payload:t,withAck:e,void:i},n)}pushTask(s,t){let e=this.pending.get(t);e||this.pending.set(t,e=[]),e.push(s),this.releasePending()}invokeVoid(s,t,e,i){const n=this.createInvokeTask(s,t,void 0,!0,i);this.pushTask(n,e)}invoke(s,t,e,i,o){let a;this.debug&&this.log.debug("start",s,t);const c=new Promise(((n,r)=>{a=this.createInvokeTask(s,t,e,void 0,o),this.awaiting[a.id]={resolve:n,reject:r,taskType:s,port:i},this.pushTask(a,i)}));if(r.kC){c.finally((()=>{clearInterval(s)}));const s=n.Z.setInterval((()=>{this.log.error("task still has no result",a,i)}),5e3)}return c}invokeExceptSource(s,t,e){const i=this.sendPorts.slice();(0,o.Z)(i,e),i.forEach((e=>{this.invokeVoid(s,t,e)}))}}}}]); +//# sourceMappingURL=437.8cd31f38250954e80fcd.bundle.js.map \ No newline at end of file diff --git a/public/437.8cd31f38250954e80fcd.bundle.js.map b/public/437.8cd31f38250954e80fcd.bundle.js.map new file mode 100644 index 000000000..fd885615f --- /dev/null +++ b/public/437.8cd31f38250954e80fcd.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"437.8cd31f38250954e80fcd.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/helpers/array/findAndSplice.ts","webpack://tweb/./src/helpers/array/indexOfAndSplice.ts","webpack://tweb/./src/helpers/dT.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/lib/mtproto/superMessagePort.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from './modes';\r\n\r\nexport const DEBUG = (process.env.NODE_ENV !== 'production' || Modes.debug)/* && false */;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n// let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n\r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\r\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\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 {TransportType} from '../lib/mtproto/dcConfigurator';\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","export default function findAndSplice(array: Array, verify: (value: T, index?: number, array?: Array) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\n};\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\n}\n","const _logTimer = Date.now();\r\nexport default function dT() {\r\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type {ArgumentTypes, SuperReturnType} from '../types';\r\nimport findAndSplice from './array/findAndSplice';\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n\r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous.\r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\ntype ListenerObject = {callback: T, options: boolean | AddEventListenerOptions};\r\n\r\n// type EventLitenerCallback = (data: T) =>\r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n\r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n\r\n // e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n findAndSplice(this.listeners[name], l => l.callback === callback);\r\n }\r\n // e.remove(this, name, callback);\r\n }\r\n\r\n protected invokeListenerCallback>(name: T, listener: L, ...args: ArgumentTypes) {\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n const result = this.invokeListenerCallback(name, listener, ...args);\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\n * 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 ctx from '../../environment/ctx';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {IS_WORKER} from '../../helpers/context';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {Awaited, WorkerTaskTemplate, WorkerTaskVoidTemplate} from '../../types';\nimport {logger} from '../logger';\n\ntype SuperMessagePortTask = WorkerTaskTemplate & {\n transfer?: Transferable[]\n};\n\ninterface InvokeTask extends SuperMessagePortTask {\n type: 'invoke',\n payload: WorkerTaskVoidTemplate & {withAck?: boolean, void?: boolean}\n}\n\ninterface ResultTask extends SuperMessagePortTask {\n type: 'result',\n payload: {\n taskId: number,\n result?: any,\n error?: any\n }\n}\n\ninterface AckTask extends SuperMessagePortTask {\n type: 'ack',\n payload: {\n cached: boolean,\n taskId: number\n result?: any,\n error?: any,\n }\n}\n\ninterface PingTask extends SuperMessagePortTask {\n type: 'ping'\n}\n\ninterface PongTask extends SuperMessagePortTask {\n type: 'pong'\n}\n\ninterface BatchTask extends SuperMessagePortTask {\n type: 'batch',\n payload: Task[]\n}\n\ninterface CloseTask extends SuperMessagePortTask {\n type: 'close'\n}\n\n// interface OpenTask extends SuperMessagePortTask {\n// type: 'open'\n// }\n\ntype Task = InvokeTask | ResultTask | AckTask | PingTask | PongTask | BatchTask | CloseTask/* | OpenTask */;\ntype TaskMap = {\n [type in Task as type['type']]?: (task: Extract, source: MessageEventSource, event: MessageEvent) => void | Promise\n};\n\nexport type AckedResult = {\n cached: boolean,\n result: Promise\n};\n// export type AckedResult = {\n// cached: true,\n// result: T\n// } | {\n// cached: false,\n// result: Promise\n// };\n\ntype ListenPort = WindowProxy | MessagePort | ServiceWorker | Worker | ServiceWorkerContainer;\ntype SendPort = Pick/* WindowProxy | MessagePort | ServiceWorker | Worker */;\n\nexport type MessageListenPort = ListenPort;\nexport type MessageSendPort = SendPort;\n\ntype ListenerCallback = (payload: any, source: MessageEventSource, event: MessageEvent) => any;\ntype Listeners = Record;\n\n// const PING_INTERVAL = DEBUG && false ? 0x7FFFFFFF : 5000;\n// const PING_TIMEOUT = DEBUG && false ? 0x7FFFFFFF : 10000;\n\nexport default class SuperMessagePort<\n Workers extends Listeners,\n Masters extends Listeners,\n IsMaster extends boolean,\n Receive extends Listeners = IsMaster extends true ? Masters : Workers,\n Send extends Listeners = IsMaster extends true ? Workers : Masters\n> extends EventListenerBase {\n protected listenPorts: Array;\n protected sendPorts: Array;\n protected pingResolves: Map void>;\n\n protected taskId: number;\n protected awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskType: string,\n port?: SendPort\n }\n };\n protected pending: Map;\n\n protected log: ReturnType;\n protected debug: boolean;\n protected releasingPending: boolean;\n\n protected processTaskMap: TaskMap;\n\n protected onPortDisconnect: (source: MessageEventSource) => void;\n // protected onPortConnect: (source: MessageEventSource) => void;\n\n constructor(logSuffix?: string) {\n super(false);\n\n this.listenPorts = [];\n this.sendPorts = [];\n this.pingResolves = new Map();\n this.taskId = 0;\n this.awaiting = {};\n this.pending = new Map();\n this.log = logger('MP' + (logSuffix ? '-' + logSuffix : ''));\n this.debug = DEBUG;\n\n if(typeof(window) !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n const task = this.createTask('close', undefined);\n this.postMessage(undefined, task);\n });\n }\n\n this.processTaskMap = {\n result: this.processResultTask,\n ack: this.processAckTask,\n invoke: this.processInvokeTask,\n ping: this.processPingTask,\n pong: this.processPongTask,\n close: this.processCloseTask\n // open: this.processOpenTask\n };\n }\n\n public setOnPortDisconnect(callback: (source: MessageEventSource) => void) {\n this.onPortDisconnect = callback;\n }\n\n // public setOnPortConnect(callback: (source: MessageEventSource) => void) {\n // this.onPortConnect = callback;\n // }\n\n public attachPort(port: MessageEventSource) {\n this.attachListenPort(port);\n this.attachSendPort(port);\n }\n\n public attachListenPort(port: ListenPort) {\n this.listenPorts.push(port);\n port.addEventListener('message', this.onMessage as any);\n }\n\n public attachSendPort(port: SendPort) {\n this.log.warn('attaching send port');\n\n (port as MessagePort).start?.();\n\n this.sendPorts.push(port);\n // this.sendPing(port);\n\n // const task = this.createTask('open', undefined);\n // this.postMessage(port, task);\n\n this.releasePending();\n }\n\n // ! Can't rely on ping because timers can be suspended\n // protected sendPing(port: SendPort, loop = IS_WORKER) {\n // let timeout: number;\n // const promise = new Promise((resolve, reject) => {\n // this.pingResolves.set(port, resolve);\n // this.pushTask(this.createTask('ping', undefined), port);\n\n // timeout = ctx.setTimeout(() => {\n // reject();\n // }, PING_TIMEOUT);\n // });\n\n // promise.then(() => {\n // // this.log('got pong');\n\n // clearTimeout(timeout);\n // this.pingResolves.delete(port);\n\n // if(loop) {\n // this.sendPingWithTimeout(port);\n // }\n // }, () => {\n // this.pingResolves.delete(port);\n // this.detachPort(port);\n // });\n // }\n\n // protected sendPingWithTimeout(port: SendPort, timeout = PING_INTERVAL) {\n // ctx.setTimeout(() => {\n // if(!this.sendPorts.includes(port)) {\n // return;\n // }\n\n // this.sendPing(port);\n // }, timeout);\n // }\n\n public detachPort(port: ListenPort) {\n this.log.warn('disconnecting port');\n\n indexOfAndSplice(this.listenPorts, port);\n indexOfAndSplice(this.sendPorts, port as any);\n\n port.removeEventListener?.('message', this.onMessage as any);\n (port as MessagePort).close?.();\n\n this.onPortDisconnect?.(port as any);\n\n const error = new Error('PORT_DISCONNECTED');\n for(const id in this.awaiting) {\n const task = this.awaiting[id];\n if(task.port === port) {\n task.reject(error);\n delete this.awaiting[id];\n }\n }\n }\n\n protected postMessage(port: SendPort | SendPort[], task: Task) {\n const ports = Array.isArray(port) ? port : (port ? [port] : this.sendPorts);\n ports.forEach((port) => {\n port.postMessage(task, task.transfer as any);\n });\n }\n\n protected onMessage = (event: MessageEvent) => {\n const task: Task = event.data;\n // this.log('got message', task);\n\n const source: MessageEventSource = event.source || event.currentTarget as any; // can have no source\n /* if(task.type === 'batch') {\n const newEvent: MessageEvent = {data: event.data, source: event.source, currentTarget: event.currentTarget} as any;\n task.payload.forEach((task) => {\n // @ts-ignore\n newEvent.data = task;\n this.onMessage(newEvent);\n });\n } */\n\n // @ts-ignore\n this.processTaskMap[task.type](task, source, event);\n };\n\n protected /* async */ releasePending() {\n // return;\n\n if(/* !this.listenPorts.length || !this.sendPorts.length || */this.releasingPending) {\n return;\n }\n\n this.releasingPending = true;\n // const perf = performance.now();\n // await pause(0);\n\n this.debug && this.log.debug('releasing tasks, length:', this.pending.size/* , performance.now() - perf */);\n\n this.pending.forEach((portTasks, port) => {\n // let batchTask: BatchTask;\n // const tasks: Task[] = [];\n // portTasks.forEach((task) => {\n // if(task.transfer) {\n // batchTask = undefined;\n // tasks.push(task);\n // } else {\n // if(!batchTask) {\n // batchTask = this.createTask('batch', []);\n // tasks.push(batchTask);\n // }\n\n // batchTask.payload.push(task);\n // }\n // });\n\n const tasks = portTasks;\n const ports = port ? [port] : this.sendPorts;\n if(!ports.length) {\n return;\n }\n\n tasks.forEach((task) => {\n // if(task.type === 'batch') {\n // this.log(`batching ${task.payload.length} tasks`);\n // }\n\n try {\n // if(IS_SERVICE_WORKER && !port) {\n // notifyAll(task);\n // } else {\n this.postMessage(ports, task);\n // }\n } catch(err) {\n this.log.error('postMessage error:', err, task, ports);\n }\n });\n\n this.pending.delete(port);\n });\n\n this.debug && this.log.debug('released tasks');\n\n this.releasingPending = false;\n }\n\n protected processResultTask = (task: ResultTask) => {\n const {taskId, result, error} = task.payload;\n const deferred = this.awaiting[taskId];\n if(!deferred) {\n return;\n }\n\n this.debug && this.log.debug('done', deferred.taskType, result, error);\n 'error' in task.payload ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n };\n\n protected processAckTask = (task: AckTask) => {\n const payload = task.payload;\n const deferred = this.awaiting[payload.taskId];\n if(!deferred) {\n return;\n }\n\n // * will finish the init promise with incoming result\n const previousResolve: (acked: AckedResult) => void = deferred.resolve;\n // const previousReject = deferred.reject;\n\n // if(payload.cached) {\n // if('result' in payload) {\n // previousResolve({\n // cached: true,\n // result: payload.result\n // });\n // } else {\n // previousReject(payload.error);\n // }\n // } else {\n // const ret: AckedResult = {\n // cached: false,\n // result: new Promise((resolve, reject) => {\n // deferred.resolve = resolve;\n // deferred.reject = reject;\n // })\n // };\n\n // previousResolve(ret);\n // }\n\n const ret: AckedResult = {\n cached: payload.cached,\n result: payload.cached ? ('result' in payload ? Promise.resolve(payload.result) : Promise.reject(payload.error)) : new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n })\n };\n\n previousResolve(ret);\n\n if(payload.cached) {\n delete this.awaiting[payload.taskId];\n }\n };\n\n protected processPingTask = (task: PingTask, source: MessageEventSource, event: MessageEvent) => {\n this.pushTask(this.createTask('pong', undefined), event.source);\n };\n\n protected processPongTask = (task: PongTask, source: MessageEventSource, event: MessageEvent) => {\n const pingResolve = this.pingResolves.get(source);\n if(pingResolve) {\n this.pingResolves.delete(source);\n pingResolve();\n }\n };\n\n protected processCloseTask = (task: CloseTask, source: MessageEventSource, event: MessageEvent) => {\n this.detachPort(source);\n };\n\n // * it's just an 'open' callback, DO NOT attach port from here\n // protected processOpenTask = (task: OpenTask, source: MessageEventSource, event: MessageEvent) => {\n // this.onPortConnect?.(source);\n // };\n\n protected processInvokeTask = async(task: InvokeTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.id;\n const innerTask = task.payload;\n\n let resultTaskPayload: ResultTask['payload'];\n let resultTask: ResultTask, ackTask: AckTask;\n if(!innerTask.void) {\n resultTaskPayload = {taskId: id};\n resultTask = this.createTask('result', resultTaskPayload);\n }\n\n if(innerTask.withAck) {\n ackTask = this.createTask('ack', {\n taskId: id,\n cached: true\n });\n }\n\n let isPromise: boolean;\n try {\n const listeners = this.listeners[innerTask.type];\n if(!listeners?.length) {\n throw new Error('no listener');\n }\n\n const listener = listeners[0];\n\n // @ts-ignore\n let result = this.invokeListenerCallback(innerTask.type, listener, innerTask.payload, source, event);\n if(innerTask.void) {\n return;\n }\n\n isPromise = result instanceof Promise;\n\n if(ackTask) {\n const cached = !isPromise;\n ackTask.payload.cached = cached;\n if(cached) ackTask.payload.result = result;\n this.pushTask(ackTask, source);\n\n if(cached) {\n return;\n }\n }\n\n if(isPromise) {\n result = await result;\n }\n\n resultTaskPayload.result = result;\n } catch(error) {\n this.log.error('worker task error:', error, task);\n if(innerTask.void) {\n return;\n }\n\n if(ackTask && ackTask.payload.cached) {\n ackTask.payload.error = error;\n this.pushTask(ackTask, source);\n return;\n }\n\n resultTaskPayload.error = error;\n }\n\n this.pushTask(resultTask, source);\n };\n\n protected createTask[0]>(type: T, payload: K['payload'], transfer?: Transferable[]): K {\n return {\n type,\n payload,\n id: this.taskId++,\n transfer\n } as K;\n }\n\n protected createInvokeTask(type: string, payload: any, withAck?: boolean, _void?: boolean, transfer?: Transferable[]): InvokeTask {\n return this.createTask('invoke', {\n type,\n payload,\n withAck,\n void: _void\n }, transfer);\n }\n\n protected pushTask(task: Task, port?: SendPort) {\n let tasks = this.pending.get(port);\n if(!tasks) {\n this.pending.set(port, tasks = []);\n }\n\n tasks.push(task);\n this.releasePending();\n }\n\n public invokeVoid(type: T, payload: Parameters[0], port?: SendPort, transfer?: Transferable[]) {\n const task = this.createInvokeTask(type as string, payload, undefined, true, transfer);\n this.pushTask(task, port);\n }\n\n public invoke(type: T, payload: Parameters[0], withAck?: false, port?: SendPort, transfer?: Transferable[]): Promise>>;\n public invoke(type: T, payload: Parameters[0], withAck?: true, port?: SendPort, transfer?: Transferable[]): Promise>>>;\n public invoke(type: T, payload: Parameters[0], withAck?: boolean, port?: SendPort, transfer?: Transferable[]) {\n this.debug && this.log.debug('start', type, payload);\n\n let task: InvokeTask;\n const promise = new Promise>>((resolve, reject) => {\n task = this.createInvokeTask(type as string, payload, withAck, undefined, transfer);\n this.awaiting[task.id] = {resolve, reject, taskType: type as string, port};\n this.pushTask(task, port);\n });\n\n if(IS_WORKER) {\n promise.finally(() => {\n clearInterval(interval);\n });\n\n const interval = ctx.setInterval(() => {\n this.log.error('task still has no result', task, port);\n }, 5e3);\n } else if(false) {\n // let timedOut = false;\n const startTime = Date.now();\n promise.finally(() => {\n const elapsedTime = Date.now() - startTime;\n if(elapsedTime >= TIMEOUT) {\n this.log.error(`task was processing ${Date.now() - startTime}ms`, task.payload.payload, port);\n }/* else {\n clearTimeout(timeout);\n } */\n });\n\n const TIMEOUT = 10;\n // const timeout = ctx.setTimeout(() => {\n // timedOut = true;\n // // this.log.error(`task is processing more than ${TIMEOUT} milliseconds`, task, port);\n // }, TIMEOUT);\n }\n\n return promise;\n }\n\n public invokeExceptSource(type: T, payload: Parameters[0], source?: SendPort) {\n const ports = this.sendPorts.slice();\n indexOfAndSplice(ports, source);\n\n ports.forEach((target) => {\n this.invokeVoid(type, payload, target);\n });\n }\n}\n"],"names":["DEBUG","MOUNT_CLASS_TO","window","self","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","findAndSplice","array","verify","index","findIndex","splice","undefined","indexOfAndSplice","item","idx","spliced","_logTimer","Date","now","dT","toFixed","EventListenerBase","constructor","reuseResults","this","_constructor","listeners","listenerResults","addEventListener","name","callback","options","push","hasOwnProperty","once","pop","addMultipleEventsListeners","obj","i","removeEventListener","l","invokeListenerCallback","listener","args","result","err","console","error","_dispatchEvent","collectResults","arr","slice","forEach","dispatchResultableEvent","dispatchEvent","cleanup","SuperMessagePort","logSuffix","super","onMessage","event","task","data","source","currentTarget","processTaskMap","type","processResultTask","taskId","payload","deferred","awaiting","log","taskType","reject","resolve","processAckTask","previousResolve","cached","Promise","processPingTask","pushTask","createTask","processPongTask","pingResolve","pingResolves","get","delete","processCloseTask","detachPort","processInvokeTask","id","innerTask","resultTaskPayload","resultTask","ackTask","isPromise","void","withAck","length","Error","listenPorts","sendPorts","Map","pending","postMessage","ack","invoke","ping","pong","close","setOnPortDisconnect","onPortDisconnect","attachPort","port","attachListenPort","attachSendPort","warn","start","releasePending","Array","isArray","transfer","releasingPending","size","portTasks","tasks","ports","createInvokeTask","_void","set","invokeVoid","promise","finally","clearInterval","interval","invokeExceptSource","target"],"sourceRoot":""} \ No newline at end of file diff --git a/public/442.43a09c275fa800a5a70a.chunk.js b/public/442.43a09c275fa800a5a70a.chunk.js new file mode 100644 index 000000000..18b4931e5 --- /dev/null +++ b/public/442.43a09c275fa800a5a70a.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[442,774,836],{4494:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);const a=(e,t={})=>{const i=document.createElement(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}},4425:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2384);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.onVisibilityClickAdditional=()=>{this.passwordInputField.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()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),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()};const t=this.input;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"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},279:(e,t,i)=>{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},1405:(e,t,i)=>{i.d(t,{Z:()=>l});var s=i(8497),n=i(9674),a=i(5432),r=i(3512),o=i(5975);let d=0;function l(e,t=(()=>Promise.resolve()),i=null,l=!1,c=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const p=document.createElement("div");let h;p.classList.add("c-ripple"),e.classList.contains("rp-square")&&p.classList.add("is-square"),e[l?"prepend":"append"](p);const u=(e,s)=>{const r=Date.now(),o=document.createElement("div"),l=d++,c=1e3*+window.getComputedStyle(p).getPropertyValue("--ripple-duration").replace("s","");h=()=>{const e=Date.now()-r,t=()=>{n.Z.mutate((()=>{o.remove()})),i&&i(l)};if(eo.classList.add("hiding")),Math.max(i-c/2,0)),setTimeout(t,i)}else o.classList.add("hiding"),setTimeout(t,c/2);a.Z||window.removeEventListener("contextmenu",h),h=null,w=!1},t&&t(l),window.requestAnimationFrame((()=>{const t=p.getBoundingClientRect();o.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)),r=i-a/2,d=n-a/2;o.style.width=o.style.height=a+"px",o.style.left=r+"px",o.style.top=d+"px",p.append(o)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==p)&&(c===e||!(0,o.Z)(t.target,c));let w=!1;if(a.Z){const e=()=>{h&&h()};c.addEventListener("touchstart",(t=>{if(!r.Z.settings.animationsEnabled)return;if(t.touches.length>1||w||m(t))return;w=!0;const{clientX:i,clientY:s}=t.touches[0];u(i,s),c.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),c.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else c.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!r.Z.settings.animationsEnabled)return;if("0"===c.dataset.ripple||m(e))return;if(w)return void(w=!1);const{clientX:t,clientY:i}=e;u(t,i),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})}),{passive:!0})}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{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})},9674:(e,t,i)=>{i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),r=i(8487);const o=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,r.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?t():s.then((()=>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=o);const d=o},2582:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(2325);class n{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>L});var s=i(279),n=i(4755),a=i(4874),r=i(4494),o=i(6830),d=i(4425),l=i(2325),c=i(2582),p=i(3910),h=i(2738),u=i(2614),m=i(5565),w=i(1656),g=i(8115),v=i(3512);let b;const L=new a.Z("page-password",!0,(()=>{const e=new c.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),a=new l.ZP.IntlElement({key:"Login.Next"});t.append(a.element);const L=new o.Z({label:"LoginPassword",name:"password"});let y;b=L.input,e.inputWrapper.append(L.container,t);const Z=()=>(y||(y=window.setInterval(Z,1e4)),v.Z.managers.passwordManager.getState().then((e=>{f=e,f.hint?(0,m.Z)(L.label,(0,u.Z)((0,g.Z)(f.hint))):L.setLabel()})));let f;const E=e=>{if(e&&(0,p.Z)(e),!b.value.length)return void b.classList.add("error");const n=(0,w.Z)([b,t],!0),r=b.value;a.update({key:"PleaseWait"});const o=(0,s.y)(t);L.setValueSilently(""+Math.random()),L.setValueSilently(r),v.Z.managers.passwordManager.check(r,f).then((e=>{"auth.authorization"===e._?(clearInterval(y),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),x&&x.remove()):(t.removeAttribute("disabled"),a.update({key:e._}),o.remove())})).catch((e=>{n(),L.input.classList.add("error"),e.type,a.update({key:"PASSWORD_HASH_INVALID"}),b.select(),o.remove(),Z()}))};(0,h.fc)(t,E),b.addEventListener("keypress",(function(e){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const k=n.Z.isMobile?100:166,x=new d.Z(L,k);return e.imageDiv.append(x.container),Promise.all([x.load(),Z()])}),null,(()=>{b.focus(),v.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); +//# sourceMappingURL=442.43a09c275fa800a5a70a.chunk.js.map \ No newline at end of file diff --git a/public/442.43a09c275fa800a5a70a.chunk.js.map b/public/442.43a09c275fa800a5a70a.chunk.js.map new file mode 100644 index 000000000..703429a1d --- /dev/null +++ b/public/442.43a09c275fa800a5a70a.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"442.43a09c275fa800a5a70a.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport ripple from './ripple';\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true,\r\n onlyMobile: true,\r\n icon: string,\r\n rippleSquare: true,\r\n text: LangPackKey,\r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\nimport PasswordInputField from '../passwordInputField';\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n // return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n // console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport InputField, {InputFieldOptions} from './inputField';\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport rootScope from '../lib/rootScope';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement,\r\n callback: (id: number) => Promise = () => Promise.resolve(),\r\n onEnd: (id: number) => void = null,\r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n // return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n\r\n const r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n // let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n\r\n // console.log('ripple drawRipple');\r\n\r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n // console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n // handler = () => animationEndPromise.then((duration) => {\r\n // console.log('ripple animation was:', duration);\r\n\r\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n // return;\r\n const elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n\r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n const delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n // });\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n // console.log('ripple after promise', Date.now() - startTime);\r\n // console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n\r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n // r.classList.add('active');\r\n // handler();\r\n });\r\n // });\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\r\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem ||\r\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n const touchEnd = () => {\r\n handler && handler();\r\n };\r\n\r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n // console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n\r\n // console.log('touchstart', e);\r\n touchStartFired = true;\r\n\r\n const {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n\r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n\r\n const {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element\r\n * @param callback\r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AccountPassword} from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nconst onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n const getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n const value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n // console.log('passwordManager response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n\r\n switch(err.type) {\r\n default:\r\n // btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n\r\n getState();\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n // if(!isAppleMobile) {\r\n passwordInput.focus();\r\n // }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","Promise","resolve","onEnd","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","touches","length","once","cancelBubble","stopPropagation","passive","dataset","htmlToSpan","span","toggleDisability","elements","disable","forEach","el","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","LoginPage","body","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","getState","setInterval","_state","state","hint","setLabel","onSubmit","value","update","preloader","setValueSilently","random","response","_","clearInterval","m","default","mount","monkey","catch","err","select","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/442.7c20450a077c518900a1.chunk.js b/public/442.7c20450a077c518900a1.chunk.js deleted file mode 100644 index 834925020..000000000 --- a/public/442.7c20450a077c518900a1.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[442,774],{4425:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2384);class a{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.onVisibilityClickAdditional=()=>{this.passwordInputField.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()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(3910),a=i(503);class n extends a.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),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()};const t=this.input;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 a=this.toggleVisible=document.createElement("span");a.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(a),a.addEventListener("click",this.onVisibilityClick),a.addEventListener("touchend",this.onVisibilityClick)}}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},1656:(e,t,i)=>{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})},2582:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2325);class a{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var s=i(279),a=i(4755),n=i(4874),r=i(4494),o=i(6830),l=i(4425),d=i(2325),c=i(2582),p=i(3910),h=i(2738),u=i(2614),m=i(5565),b=i(1656),g=i(8115),w=i(3512);let y;const v=new n.Z("page-password",!0,(()=>{const e=new c.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),n=new d.ZP.IntlElement({key:"Login.Next"});t.append(n.element);const v=new o.Z({label:"LoginPassword",name:"password"});let L;y=v.input,e.inputWrapper.append(v.container,t);let Z,k=()=>(L||(L=window.setInterval(k,1e4)),w.Z.managers.passwordManager.getState().then((e=>{Z=e,Z.hint?(0,m.Z)(v.label,(0,u.Z)((0,g.Z)(Z.hint))):v.setLabel()})));const E=e=>{if(e&&(0,p.Z)(e),!y.value.length)return void y.classList.add("error");const a=(0,b.Z)([y,t],!0);let r=y.value;n.update({key:"PleaseWait"});const o=(0,s.y)(t);v.setValueSilently(""+Math.random()),v.setValueSilently(r),w.Z.managers.passwordManager.check(r,Z).then((e=>{"auth.authorization"===e._?(clearInterval(L),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),f&&f.remove()):(t.removeAttribute("disabled"),n.update({key:e._}),o.remove())})).catch((e=>{a(),v.input.classList.add("error"),e.type,n.update({key:"PASSWORD_HASH_INVALID"}),y.select(),o.remove(),k()}))};(0,h.fc)(t,E),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),n.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const V=a.Z.isMobile?100:166,f=new l.Z(v,V);return e.imageDiv.append(f.container),Promise.all([f.load(),k()])}),null,(()=>{y.focus(),w.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); -//# sourceMappingURL=442.7c20450a077c518900a1.chunk.js.map \ No newline at end of file diff --git a/public/442.7c20450a077c518900a1.chunk.js.map b/public/442.7c20450a077c518900a1.chunk.js.map deleted file mode 100644 index 091def7fd..000000000 --- a/public/442.7c20450a077c518900a1.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"442.7c20450a077c518900a1.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","toggleDisability","elements","disable","forEach","el","removeAttribute","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","state","getState","window","setInterval","_state","hint","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","catch","err","select","Promise","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/458.05455564683cc3681625.chunk.js b/public/458.05455564683cc3681625.chunk.js new file mode 100644 index 000000000..636e57300 --- /dev/null +++ b/public/458.05455564683cc3681625.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[458],{503:(t,e,n)=>{n.d(e,{I:()=>p,Z:()=>g});var i=n(6669),s=n(1544),l=n(8763),a=n(3735),o=n(1293),r=n(130),h=n(2325),u=n(6241),c=n(6535),d=n(3066);let f=()=>{document.addEventListener("paste",(t=>{const e=(0,l.Z)(t.target,'contenteditable="true"');if(!e)return;const n=!!e.dataset.noLinebreaks;let i,o;t.preventDefault();let r=(t.originalEvent||t).clipboardData.getData("text/plain"),h=!0,f=(t.originalEvent||t).clipboardData.getData("text/html");const p=t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._&&!n;if(n){const t=/[\r\n]/g;r=r.replace(t,""),f=f.replace(t,"")}if(f.trim()){f=f.replace(//,""),f=f.replace(//,"");const t=f.match(/([\s\S]*)<\/body>/);t&&(f=t[1].trim());const e=document.createElement("span");e.innerHTML=f;let n=e.firstChild;for(;n;){const t=n.nextSibling;3===n.nodeType&&(n.nodeValue.trim()||n.remove()),n=t}const s=(0,a.Z)(e,!0);if(s.value.replace(/\s/g,"").length===r.replace(/\s/g,"").length){i=s.value,o=s.entities,h=!1;let t=(0,c.Z)(i);t=t.filter(p),(0,u.Z)(o,t)}}h&&(i=r,o=(0,c.Z)(i),o=o.filter(p));const g=(0,d.Z)(i,{entities:o});i=(0,s.Z)(g),window.document.execCommand("insertHTML",!1,i)})),f=null};var p;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(p||(p={}));class g{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:n,showLengthOn:i,name:s,plainText:l,canBeEdited:r=!0,autocomplete:u}=t,c=t.label||t.labelText,d=[];let p;if(l?(this.container.innerHTML=`\n \n `,p=this.container.firstElementChild):(f&&f(),this.container.innerHTML=`\n
\n `,p=this.container.firstElementChild,d.push((()=>{(0,o.Z)(p)&&(p.textContent="")}))),p.setAttribute("dir","auto"),t.inputMode&&(p.inputMode=t.inputMode),e&&(0,h.$d)(p,e,void 0,"placeholder"),c||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(c&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const t=this.container.lastElementChild;let e=!1;const s=()=>{const s=p.classList.contains("error"),o=l?p.value.length:[...(0,a.Z)(p,!1).value].length,r=n-o,h=r<0;p.classList.toggle("error",h),h||r<=i?(this.setLabel(),t.append(` (${n-o})`),e||(e=!0)):(s&&!h||e)&&(this.setLabel(),e=!1)};d.push(s)}!t.withLinebreaks&&!l&&(p.dataset.noLinebreaks="1",p.addEventListener("keypress",(t=>{if("Enter"===t.key)return t.preventDefault(),!1}))),d.length&&p.addEventListener("input",(()=>{d.forEach((t=>t()))})),this.input=p}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const n=window.getSelection();n.removeAllRanges(),n.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,r.Z)(this.label,this.options.labelText):this.label.append((0,h.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,a.Z)(this.input,!1).value}set value(t){this.setValueSilently(t,!0),(0,i.Z)(this.input,"input")}setValueSilently(t,e){this.options.plainText?this.input.value=t:this.input.innerHTML=t}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,o.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e){this.options.plainText||(t=(0,s.Z)((0,d.Z)(t))),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e?(this.label.textContent="",this.label.append((0,h.ag)(e,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(t&p.Error)),this.input.classList.toggle("valid",!!(t&p.Valid))}setError(t){this.setState(p.Error,t)}}},1544:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(4056);function s(t){return Array.from(t.childNodes).map((t=>3===t.nodeType?(0,i.Z)(t.textContent):t.outerHTML)).join("")}},8763:(t,e,n)=>{function i(t,e){return t.closest(`[${e}]`)}n.d(e,{Z:()=>i})},9041:(t,e,n)=>{n.d(e,{Z:()=>l,o:()=>i});const i={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"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function l(t,e,n,a,o,r,h={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?n.push(e.substr(0,o)+""+e.substr(o)):n.push(e),r&&e.length&&t.parentNode){const n=t.parentElement;for(const t in i){const s=i[t],l=n.closest(s.match+", [contenteditable]");null===(null==l?void 0:l.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?r.push({_:s.entityName,url:l.href,offset:h.offset,length:e.length}):"messageEntityMentionName"===s.entityName?r.push({_:s.entityName,offset:h.offset,length:e.length,user_id:l.dataset.follow.toUserId()}):r.push({_:s.entityName,offset:h.offset,length:e.length}))}}return void(h.offset+=e.length)}if(1!==t.nodeType)return;const u=a===t,c=s.has(t.tagName);if(c&&n.length)e.push(n.join("")),n.splice(0,n.length),++h.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(n.push(e),h.offset+=e.length)}u&&!o&&n.push("");const d=t.matches('[style*="table-cell"], th, td'),f=null==r?void 0:r.length;let p=t.firstChild;for(;p;)l(p,e,n,a,o,r,h),p=p.nextSibling;if(u&&o&&n.push(""),d&&t.nextSibling&&(n.push(" "),++h.offset,void 0!==f))for(let t=f,e=r.length;t{n.d(e,{Z:()=>o});var i=n(410),s=n(6875),l=n(1346),a=n(9041);function o(t,e=!0){const n=[],i=[],o=e?[]:void 0;(0,a.Z)(t,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&((0,s.Z)(o),(0,l.Z)(o)),{value:r,entities:o}}i.GO.getRichValue=o},1293:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(3735);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!(0,i.Z)(t,!1).value.trim():!t.value.trim()}},5565:(t,e,n)=>{function i(t,e){if("string"==typeof e)return void(t.innerHTML=e);const n=t.firstChild;n?t.lastChild===n?n.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}n.d(e,{Z:()=>i})},130:(t,e,n)=>{function i(t,e){t.setAttribute("dir","auto"),"string"==typeof e?e?t.innerHTML=e:t.textContent="":(t.textContent="",t.append(e))}n.d(e,{Z:()=>i})},6875:(t,e,n)=>{n.d(e,{Z:()=>s});const i=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function s(t){for(let e=0;ei.has(t._)&&s!==e&&t._===n._&&t.offset-n.length===n.offset)),-1!==s){const e=t[s];n.length+=e.length,t.splice(s,1)}}while(-1!==s)}}},8859:(t,e,n)=>{n.d(e,{Z:()=>l});var i=n(2423);const s=new Set(["messageEntityPre","messageEntityCode"]);function l(t,e){let n=-1;return t.find((t=>(s.has(t._)&&(n=t.offset+t.length),e.offset=t.offset&&e.length+e.offset<=t.length+t.offset))))}},6241:(t,e,n)=>{n.d(e,{Z:()=>l});var i=n(8859),s=n(1346);function l(t,e){const n=e.filter((e=>!(0,i.Z)(t,e)));t.push(...n),(0,s.Z)(t);for(let e=0;e{function i(t){t.sort(((t,e)=>t.offset-e.offset||e.length-t.length))}n.d(e,{Z:()=>i})},3066:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(3178);function s(t,e={}){return t?(0,i.Z)(t,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):(0,i.Z)("")}}}]); +//# sourceMappingURL=458.05455564683cc3681625.chunk.js.map \ No newline at end of file diff --git a/public/458.05455564683cc3681625.chunk.js.map b/public/458.05455564683cc3681625.chunk.js.map new file mode 100644 index 000000000..fb5e1ed1e --- /dev/null +++ b/public/458.05455564683cc3681625.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"458.05455564683cc3681625.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValue.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport simulateEvent from '../helpers/dom/dispatchEvent';\r\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\r\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\r\nimport getRichValue from '../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\r\nimport selectElementContents from '../helpers/dom/selectElementContents';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport {MessageEntity} from '../layer';\r\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\r\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\r\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\r\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\r\n if(!input) {\r\n return;\r\n }\r\n\r\n const noLinebreaks = !!input.dataset.noLinebreaks;\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\r\n if(noLinebreaks) {\r\n const regExp = /[\\r\\n]/g;\r\n plainText = plainText.replace(regExp, '');\r\n html = html.replace(regExp, '');\r\n }\r\n\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n const span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n const nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n\r\n let entities2 = parseEntities(text);\r\n entities2 = entities2.filter(filterEntity);\r\n mergeEntities(entities, entities2);\r\n }\r\n }\r\n\r\n if(usePlainText) {\r\n text = plainText;\r\n entities = parseEntities(text);\r\n entities = entities.filter(filterEntity);\r\n }\r\n\r\n const fragment = wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey,\r\n label?: LangPackKey,\r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string,\r\n maxLength?: number,\r\n showLengthOn?: number,\r\n plainText?: true,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean,\r\n inputMode?: 'tel' | 'numeric',\r\n withLinebreaks?: boolean,\r\n autocomplete?: string\r\n};\r\n\r\nexport default class InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\r\n const label = options.label || options.labelText;\r\n\r\n const onInputCallbacks: Array<() => void> = [];\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n // const observer = new MutationObserver(() => {\r\n // //checkAndSetRTL(input);\r\n\r\n // if(processInput) {\r\n // processInput();\r\n // }\r\n // });\r\n\r\n onInputCallbacks.push(() => {\r\n // * because if delete all characters there will br left\r\n if(isInputEmpty(input)) {\r\n input.textContent = '';\r\n }\r\n });\r\n\r\n // ! childList for paste first symbol\r\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n // input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(options.inputMode) {\r\n input.inputMode = options.inputMode;\r\n }\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n const onInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n onInputCallbacks.push(onInput);\r\n }\r\n\r\n const noLinebreaks = !options.withLinebreaks;\r\n if(noLinebreaks && !plainText) {\r\n input.dataset.noLinebreaks = '1';\r\n input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n e.preventDefault();\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n if(onInputCallbacks.length) {\r\n input.addEventListener('input', () => {\r\n onInputCallbacks.forEach((callback) => callback());\r\n });\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n // return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, true);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fromSet?: boolean) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') &&\r\n (!this.validate || this.validate()) &&\r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent?: boolean) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false);\r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n } else {\r\n this.setLabel();\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\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","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null)\r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MessageEntity} from '../../layer';\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n\r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {MessageEntity} from '../../layer';\r\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\r\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\r\nimport getRichElementValue from './getRichElementValue';\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n combineSameEntities(entities);\r\n sortEntities(entities);\r\n }\r\n\r\n // console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from './getRichValue';\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n // entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n // return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PASS_CONFLICTING_ENTITIES} from '.';\nimport {MessageEntity} from '../../layer';\n\nconst SINGLE_ENTITIES: Set = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n\n const isConflictingTypes = newEntity._ === currentEntity._ ||\n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset &&\n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * 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 findConflictingEntity from './findConflictingEntity';\nimport sortEntities from './sortEntities';\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","import {MessageEntity} from '../../layer';\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","/*\n * 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 './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n}> = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n return wrapRichText(text, {\n entities: options.entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n}\n"],"names":["init","document","addEventListener","e","input","findUpAttribute","target","noLinebreaks","dataset","text","entities","preventDefault","plainText","originalEvent","clipboardData","getData","usePlainText","html","filterEntity","_","regExp","replace","trim","match","span","createElement","innerHTML","curChild","firstChild","nextSibling","nodeType","nodeValue","remove","richValue","getRichValue","value","length","entities2","parseEntities","filter","mergeEntities","fragment","wrapDraftText","documentFragmentToHTML","window","execCommand","InputState","InputField","constructor","options","this","container","classList","add","required","validate","undefined","maxLength","showLengthOn","Math","min","round","placeholder","name","canBeEdited","autocomplete","label","labelText","onInputCallbacks","firstElementChild","String","push","isInputEmpty","textContent","setAttribute","inputMode","border","append","setLabel","labelEl","lastElementChild","showingLength","onInput","wasError","contains","inputLength","diff","isError","toggle","withLinebreaks","key","forEach","callback","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","setInnerHTML","labelOptions","setValueSilently","fromSet","isChanged","originalValue","isValid","isValidToChange","setDraftValue","silent","setOriginalValue","setState","state","Error","Valid","setError","Array","from","childNodes","map","node","outerHTML","join","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","offset","substr","parentNode","parentElement","type","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","field","withEntities","element","hasAttribute","replaceContent","elem","lastChild","replaceWith","CAN_COMBINE_ENTITIES","combineSameEntities","entity","nextEntityIdx","findIndex","_i","nextEntity","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","find","currentEntity","newEntities","filtered","sortEntities","sort","a","b","noLinks","wrappingDraft","passEntities","messageEntityTextUrl","messageEntityMentionName"],"sourceRoot":""} \ No newline at end of file diff --git a/public/458.b31331308efe622d392d.chunk.js b/public/458.b31331308efe622d392d.chunk.js deleted file mode 100644 index e77873033..000000000 --- a/public/458.b31331308efe622d392d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[458],{503:(t,e,n)=>{n.d(e,{I:()=>p,Z:()=>g});var i=n(6669),s=n(1544),l=n(8763),a=n(3735),o=n(1293),r=n(130),h=n(2325),u=n(6241),d=n(6535),c=n(3066);let f=()=>{document.addEventListener("paste",(t=>{const e=(0,l.Z)(t.target,'contenteditable="true"');if(!e)return;const n=!!e.dataset.noLinebreaks;let i,o;t.preventDefault();let r=(t.originalEvent||t).clipboardData.getData("text/plain"),h=!0,f=(t.originalEvent||t).clipboardData.getData("text/html");const p=t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._&&!n;if(n){const t=/[\r\n]/g;r=r.replace(t,""),f=f.replace(t,"")}if(f.trim()){f=f.replace(//,""),f=f.replace(//,"");const t=f.match(/([\s\S]*)<\/body>/);t&&(f=t[1].trim());let e=document.createElement("span");e.innerHTML=f;let n=e.firstChild;for(;n;){let t=n.nextSibling;3===n.nodeType&&(n.nodeValue.trim()||n.remove()),n=t}const s=(0,a.Z)(e,!0);if(s.value.replace(/\s/g,"").length===r.replace(/\s/g,"").length){i=s.value,o=s.entities,h=!1;let t=(0,d.Z)(i);t=t.filter(p),(0,u.Z)(o,t)}}h&&(i=r,o=(0,d.Z)(i),o=o.filter(p));const g=(0,c.Z)(i,{entities:o});i=(0,s.Z)(g),window.document.execCommand("insertHTML",!1,i)})),f=null};var p;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(p||(p={}));class g{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:n,showLengthOn:i,name:s,plainText:l,canBeEdited:r=!0,autocomplete:u}=t,d=t.label||t.labelText,c=[];let p;if(l?(this.container.innerHTML=`\n \n `,p=this.container.firstElementChild):(f&&f(),this.container.innerHTML=`\n
\n `,p=this.container.firstElementChild,c.push((()=>{(0,o.Z)(p)&&(p.textContent="")}))),p.setAttribute("dir","auto"),t.inputMode&&(p.inputMode=t.inputMode),e&&(0,h.$d)(p,e,void 0,"placeholder"),d||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(d&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const t=this.container.lastElementChild;let e=!1;const s=()=>{const s=p.classList.contains("error"),o=l?p.value.length:[...(0,a.Z)(p,!1).value].length,r=n-o,h=r<0;p.classList.toggle("error",h),h||r<=i?(this.setLabel(),t.append(` (${n-o})`),e||(e=!0)):(s&&!h||e)&&(this.setLabel(),e=!1)};c.push(s)}!t.withLinebreaks&&!l&&(p.dataset.noLinebreaks="1",p.addEventListener("keypress",(t=>{if("Enter"===t.key)return t.preventDefault(),!1}))),c.length&&p.addEventListener("input",(()=>{c.forEach((t=>t()))})),this.input=p}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const n=window.getSelection();n.removeAllRanges(),n.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,r.Z)(this.label,this.options.labelText):this.label.append((0,h.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,a.Z)(this.input,!1).value}set value(t){this.setValueSilently(t,!0),(0,i.Z)(this.input,"input")}setValueSilently(t,e){this.options.plainText?this.input.value=t:this.input.innerHTML=t}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,o.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e){this.options.plainText||(t=(0,s.Z)((0,c.Z)(t))),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e?(this.label.textContent="",this.label.append((0,h.ag)(e,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(t&p.Error)),this.input.classList.toggle("valid",!!(t&p.Valid))}setError(t){this.setState(p.Error,t)}}},1544:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(4056);function s(t){return Array.from(t.childNodes).map((t=>3===t.nodeType?(0,i.Z)(t.textContent):t.outerHTML)).join("")}},8763:(t,e,n)=>{function i(t,e){return t.closest(`[${e}]`)}n.d(e,{Z:()=>i})},9041:(t,e,n)=>{n.d(e,{Z:()=>l,o:()=>i});const i={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"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function l(t,e,n,a,o,r,h={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(a===t?n.push(e.substr(0,o)+""+e.substr(o)):n.push(e),r&&e.length&&t.parentNode){const n=t.parentElement;for(const t in i){const s=i[t],l=n.closest(s.match+", [contenteditable]");null===(null==l?void 0:l.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?r.push({_:s.entityName,url:l.href,offset:h.offset,length:e.length}):"messageEntityMentionName"===s.entityName?r.push({_:s.entityName,offset:h.offset,length:e.length,user_id:l.dataset.follow.toUserId()}):r.push({_:s.entityName,offset:h.offset,length:e.length}))}}return void(h.offset+=e.length)}if(1!==t.nodeType)return;const u=a===t,d=s.has(t.tagName);if(d&&n.length)e.push(n.join("")),n.splice(0,n.length),++h.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(n.push(e),h.offset+=e.length)}u&&!o&&n.push("");const c=t.matches('[style*="table-cell"], th, td'),f=null==r?void 0:r.length;let p=t.firstChild;for(;p;)l(p,e,n,a,o,r,h),p=p.nextSibling;if(u&&o&&n.push(""),c&&t.nextSibling&&(n.push(" "),++h.offset,void 0!==f))for(let t=f,e=r.length;t{n.d(e,{Z:()=>o});var i=n(410),s=n(6875),l=n(1346),a=n(9041);function o(t,e=!0){const n=[],i=[],o=e?[]:void 0;(0,a.Z)(t,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&((0,s.Z)(o),(0,l.Z)(o)),{value:r,entities:o}}i.GO.getRichValue=o},1293:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(3735);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!(0,i.Z)(t,!1).value.trim():!t.value.trim()}},5565:(t,e,n)=>{function i(t,e){if("string"==typeof e)return void(t.innerHTML=e);const n=t.firstChild;n?t.lastChild===n?n.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}n.d(e,{Z:()=>i})},130:(t,e,n)=>{function i(t,e){t.setAttribute("dir","auto"),"string"==typeof e?e?t.innerHTML=e:t.textContent="":(t.textContent="",t.append(e))}n.d(e,{Z:()=>i})},6875:(t,e,n)=>{n.d(e,{Z:()=>s});const i=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function s(t){for(let e=0;ei.has(t._)&&s!==e&&t._===n._&&t.offset-n.length===n.offset)),-1!==s){const e=t[s];n.length+=e.length,t.splice(s,1)}}while(-1!==s)}}},8859:(t,e,n)=>{n.d(e,{Z:()=>l});var i=n(2423);const s=new Set(["messageEntityPre","messageEntityCode"]);function l(t,e){let n=-1;return t.find((t=>(s.has(t._)&&(n=t.offset+t.length),e.offset=t.offset&&e.length+e.offset<=t.length+t.offset))))}},6241:(t,e,n)=>{n.d(e,{Z:()=>l});var i=n(8859),s=n(1346);function l(t,e){const n=e.filter((e=>!(0,i.Z)(t,e)));t.push(...n),(0,s.Z)(t);for(let e=0;e{function i(t){t.sort(((t,e)=>t.offset-e.offset||e.length-t.length))}n.d(e,{Z:()=>i})},3066:(t,e,n)=>{n.d(e,{Z:()=>s});var i=n(3178);function s(t,e={}){return t?(0,i.Z)(t,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):(0,i.Z)("")}}}]); -//# sourceMappingURL=458.b31331308efe622d392d.chunk.js.map \ No newline at end of file diff --git a/public/458.b31331308efe622d392d.chunk.js.map b/public/458.b31331308efe622d392d.chunk.js.map deleted file mode 100644 index db3d4b9b3..000000000 --- a/public/458.b31331308efe622d392d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"458.b31331308efe622d392d.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValue.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport documentFragmentToHTML from \"../helpers/dom/documentFragmentToHTML\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport mergeEntities from \"../lib/richTextProcessor/mergeEntities\";\r\nimport parseEntities from \"../lib/richTextProcessor/parseEntities\";\r\nimport wrapDraftText from \"../lib/richTextProcessor/wrapDraftText\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\r\n if(!input) {\r\n return;\r\n }\r\n\r\n const noLinebreaks = !!input.dataset.noLinebreaks;\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\r\n if(noLinebreaks) {\r\n const regExp = /[\\r\\n]/g;\r\n plainText = plainText.replace(regExp, '');\r\n html = html.replace(regExp, '');\r\n }\r\n\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = parseEntities(text);\r\n entities2 = entities2.filter(filterEntity);\r\n mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = parseEntities(text);\r\n entities = entities.filter(filterEntity);\r\n }\r\n\r\n const fragment = wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean,\r\n inputMode?: 'tel' | 'numeric',\r\n withLinebreaks?: boolean,\r\n autocomplete?: string\r\n};\r\n\r\nexport default class InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\r\n const label = options.label || options.labelText;\r\n\r\n const onInputCallbacks: Array<() => void> = [];\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n // const observer = new MutationObserver(() => {\r\n // //checkAndSetRTL(input);\r\n\r\n // if(processInput) {\r\n // processInput();\r\n // }\r\n // });\r\n\r\n onInputCallbacks.push(() => {\r\n // * because if delete all characters there will br left\r\n if(isInputEmpty(input)) {\r\n input.textContent = '';\r\n }\r\n });\r\n\r\n // ! childList for paste first symbol\r\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n \r\n if(options.inputMode) {\r\n input.inputMode = options.inputMode;\r\n }\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n const onInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n onInputCallbacks.push(onInput);\r\n }\r\n\r\n const noLinebreaks = !options.withLinebreaks;\r\n if(noLinebreaks && !plainText) {\r\n input.dataset.noLinebreaks = '1';\r\n input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n e.preventDefault();\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n if(onInputCallbacks.length) {\r\n input.addEventListener('input', () => {\r\n onInputCallbacks.forEach((callback) => callback());\r\n });\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, true);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fromSet?: boolean) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent?: boolean) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n } else {\r\n this.setLabel();\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\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","import encodeEntities from \"../string/encodeEntities\";\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport combineSameEntities from \"../../lib/richTextProcessor/combineSameEntities\";\r\nimport sortEntities from \"../../lib/richTextProcessor/sortEntities\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n combineSameEntities(entities);\r\n sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PASS_CONFLICTING_ENTITIES } from \".\";\nimport { MessageEntity } from \"../../layer\";\n\nconst SINGLE_ENTITIES: Set = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n \n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n \n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * 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 findConflictingEntity from \"./findConflictingEntity\";\nimport sortEntities from \"./sortEntities\";\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","import { MessageEntity } from \"../../layer\";\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","/*\n * 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 \"./wrapRichText\";\n\nexport default function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n}> = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n}\n"],"names":["init","document","addEventListener","e","input","findUpAttribute","target","noLinebreaks","dataset","text","entities","preventDefault","plainText","originalEvent","clipboardData","getData","usePlainText","html","filterEntity","_","regExp","replace","trim","match","span","createElement","innerHTML","curChild","firstChild","nextSibling","nodeType","nodeValue","remove","richValue","getRichValue","value","length","entities2","parseEntities","filter","mergeEntities","fragment","wrapDraftText","documentFragmentToHTML","window","execCommand","InputState","InputField","constructor","options","this","container","classList","add","required","validate","undefined","maxLength","showLengthOn","Math","min","round","placeholder","name","canBeEdited","autocomplete","label","labelText","onInputCallbacks","firstElementChild","String","push","isInputEmpty","textContent","setAttribute","inputMode","border","append","setLabel","labelEl","lastElementChild","showingLength","onInput","wasError","contains","inputLength","diff","isError","toggle","withLinebreaks","key","forEach","callback","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","setInnerHTML","labelOptions","setValueSilently","fromSet","isChanged","originalValue","isValid","isValidToChange","setDraftValue","silent","setOriginalValue","setState","state","Error","Valid","setError","Array","from","childNodes","map","node","outerHTML","join","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","offset","substr","parentNode","parentElement","type","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","field","withEntities","element","hasAttribute","replaceContent","elem","lastChild","replaceWith","CAN_COMBINE_ENTITIES","combineSameEntities","entity","nextEntityIdx","findIndex","_i","nextEntity","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","find","currentEntity","newEntities","filtered","sortEntities","sort","a","b","noLinks","wrappingDraft","passEntities","messageEntityTextUrl","messageEntityMentionName"],"sourceRoot":""} \ No newline at end of file diff --git a/public/53.6410540cf22127bc7705.chunk.js b/public/53.6410540cf22127bc7705.chunk.js deleted file mode 100644 index 6ab0be580..000000000 --- a/public/53.6410540cf22127bc7705.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[53,810],{810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>C});var a=n(279),i=n(4874),o=n(9807),r=n(4494),s=n(5432),c=n(4159),d=n(2325),l=n(2384),u=n(1405),h=n(9709),g=n(9638),p=n(3910),v=n(2738),y=n(5565),m=n(1656),Z=n(7487),b=n(2398),k=n(6669),L=n(7922),f=n(3512),_=n(709),S=n(3789),w=n(5431);let x,E=null;const N=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new w.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(C.value=C.lastValue="+"+n.country_code,setTimeout((()=>{P.focus(),(0,b.Z)(P,!0)}),0))}}),C=new _.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{};let o=n?n.name||n.default_name:"";o===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,o),n||C.value.length-1>1?E.style.visibility="":E.style.visibility="hidden"}}),P=C.input;P.addEventListener("keypress",(e=>{if(!E.style.visibility&&"Enter"===e.key)return M()}));const T=new o.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;f.Z.managers.appStateManager.pushToState("keepSigned",e),S.Z.toggleStorages(e,!0)})),S.Z.getState().then((e=>{L.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),E=(0,r.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),E.style.visibility="hidden";const M=e=>{e&&(0,p.Z)(e);const t=(0,m.Z)([E,x],!0);(0,y.Z)(E,(0,d.ag)("PleaseWait")),(0,a.y)(E);let i=C.value;f.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:c.Z.id,api_hash:c.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(C.setError(),(0,y.Z)(C.label,(0,d.ag)("Login.PhoneLabelInvalid")),P.classList.add("error"),(0,y.Z)(E,(0,d.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),E.innerText=e.type)}))};(0,v.fc)(E,M),x=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),x.addEventListener("click",(()=>{h.default.mount()})),e.append(u.container,C.container,T.label,E,x);const A=document.createElement("h4");A.classList.add("text-center"),(0,d.$d)(A,"Login.Title");const I=document.createElement("div");I.classList.add("subtitle","text-center"),(0,d.$d)(I,"Login.StartText"),N.pageEl.querySelector(".container").append(A,I,e),s.Z||setTimeout((()=>{P.focus()}),0),(0,g.Z)(e),f.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=L.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&d.ZP.getLangPack(n.lang_code).then((()=>{(0,k.Z)(P,"input")}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=f.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(o||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,o=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield Z.Z.get(a))return t();setTimeout((()=>{f.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function r(e){try{c(o.next(e))}catch(e){t(e)}}function s(e){try{c(o.throw(e))}catch(e){t(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,s)}c((o=o.apply(n,a||[])).next())}));var n,a,i,o};t()})),e})).then((e=>{u.value.length||C.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{E&&((0,y.Z)(E,(0,d.ag)("Login.Next")),(0,u.Z)(E,void 0,void 0,!0),E.removeAttribute("disabled")),x&&x.removeAttribute("disabled"),f.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),C=N}}]); -//# sourceMappingURL=53.6410540cf22127bc7705.chunk.js.map \ No newline at end of file diff --git a/public/53.6410540cf22127bc7705.chunk.js.map b/public/53.6410540cf22127bc7705.chunk.js.map deleted file mode 100644 index 3a24f7064..000000000 --- a/public/53.6410540cf22127bc7705.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"53.6410540cf22127bc7705.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/putPreloader\";\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport ripple from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\nimport CountryInputField from \"../components/countryInputField\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n countryInputField.override(country, code, countryName);\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","classList","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","e","key","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","append","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","push","Promise","resolve","forEach","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/53.64ea484cf91c9ae29792.chunk.js b/public/53.64ea484cf91c9ae29792.chunk.js new file mode 100644 index 000000000..8b25f2602 --- /dev/null +++ b/public/53.64ea484cf91c9ae29792.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[53,810],{810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>C});var a=n(279),i=n(4874),o=n(9807),r=n(4494),s=n(5432),c=n(4159),d=n(2325),l=n(2384),u=n(1405),h=n(9709),g=n(9638),p=n(3910),v=n(2738),y=n(5565),m=n(1656),Z=n(7487),b=n(2398),k=n(6669),L=n(7922),f=n(3512),_=n(709),S=n(3789),w=n(5431);let x,E=null;const N=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new w.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(C.value=C.lastValue="+"+n.country_code,setTimeout((()=>{P.focus(),(0,b.Z)(P,!0)}),0))}}),C=new _.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{},o=n?n.name||n.default_name:"";o===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,o),n||C.value.length-1>1?E.style.visibility="":E.style.visibility="hidden"}}),P=C.input;P.addEventListener("keypress",(e=>{if(!E.style.visibility&&"Enter"===e.key)return M()}));const T=new o.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;f.Z.managers.appStateManager.pushToState("keepSigned",e),S.Z.toggleStorages(e,!0)})),S.Z.getState().then((e=>{L.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),E=(0,r.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),E.style.visibility="hidden";const M=e=>{e&&(0,p.Z)(e);const t=(0,m.Z)([E,x],!0);(0,y.Z)(E,(0,d.ag)("PleaseWait")),(0,a.y)(E);const i=C.value;f.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:c.Z.id,api_hash:c.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(C.setError(),(0,y.Z)(C.label,(0,d.ag)("Login.PhoneLabelInvalid")),P.classList.add("error"),(0,y.Z)(E,(0,d.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),E.innerText=e.type)}))};(0,v.fc)(E,M),x=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),x.addEventListener("click",(()=>{h.default.mount()})),e.append(u.container,C.container,T.label,E,x);const A=document.createElement("h4");A.classList.add("text-center"),(0,d.$d)(A,"Login.Title");const I=document.createElement("div");I.classList.add("subtitle","text-center"),(0,d.$d)(I,"Login.StartText"),N.pageEl.querySelector(".container").append(A,I,e),s.Z||setTimeout((()=>{P.focus()}),0),(0,g.Z)(e),f.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=L.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&d.ZP.getLangPack(n.lang_code).then((()=>{(0,k.Z)(P,"input")}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=f.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(o||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,o=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield Z.Z.get(a))return t();setTimeout((()=>{f.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function r(e){try{c(o.next(e))}catch(e){t(e)}}function s(e){try{c(o.throw(e))}catch(e){t(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,s)}c((o=o.apply(n,a||[])).next())}));var n,a,i,o};t()})),e})).then((e=>{u.value.length||C.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{E&&((0,y.Z)(E,(0,d.ag)("Login.Next")),(0,u.Z)(E,void 0,void 0,!0),E.removeAttribute("disabled")),x&&x.removeAttribute("disabled"),f.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),C=N}}]); +//# sourceMappingURL=53.64ea484cf91c9ae29792.chunk.js.map \ No newline at end of file diff --git a/public/53.64ea484cf91c9ae29792.chunk.js.map b/public/53.64ea484cf91c9ae29792.chunk.js.map new file mode 100644 index 000000000..2fc1e17d6 --- /dev/null +++ b/public/53.64ea484cf91c9ae29792.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"53.64ea484cf91c9ae29792.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from './page';\r\nimport InputField from '../components/inputField';\r\nimport CheckboxField from '../components/checkboxField';\r\nimport Button from '../components/button';\r\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport App from '../config/app';\r\nimport I18n, {_i18n, i18n} from '../lib/langPack';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport ripple from '../components/ripple';\r\nimport findUpTag from '../helpers/dom/findUpTag';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport {randomLong} from '../helpers/random';\r\nimport pageSignQR from './pageSignQR';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport {DcAuthKey} from '../types';\r\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\r\nimport {HelpCountry, HelpCountryCode} from '../layer';\r\nimport {getCountryEmoji} from '../vendor/emoji';\r\nimport simulateEvent from '../helpers/dom/dispatchEvent';\r\nimport stateStorage from '../lib/stateStorage';\r\nimport rootScope from '../lib/rootScope';\r\nimport TelInputField from '../components/telInputField';\r\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport CountryInputField from '../components/countryInputField';\r\n\r\n// import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nconst onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n\r\n console.log('Added test country to list!');\r\n } */\r\n\r\n // const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n const countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected ||\r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country &&\r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n countryInputField.override(country, code, countryName);\r\n }\r\n\r\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n // console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned',\r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n\r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n // return;\r\n\r\n const phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n // lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n // console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n const qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n const tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n\r\n g();\r\n });\r\n\r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n\r\n // console.log('woohoo', nearestDcResult, country);\r\n })// .catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","classList","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","e","key","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","append","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","push","Promise","resolve","forEach","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/591.02c6c72707bff66682b2.chunk.js b/public/591.02c6c72707bff66682b2.chunk.js deleted file mode 100644 index 02b80e066..000000000 --- a/public/591.02c6c72707bff66682b2.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[591],{5814:(f,e,d)=>{d.d(e,{Z:()=>b});var t=d(3512),i=d(4762),a=d(410),s=d(8487),n=d(3772),c=d(1655),r=d(7625),o=d(2586),h=d(3013);const l=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver((f=>{for(const e of f){const f=e.target;for(const d in this.byGroups){if(this.intersectionLockedGroups[d])continue;const t=this.byGroups[d].find((e=>e.el===f));if(t){if(e.isIntersecting)this.visible.add(t),this.checkAnimation(t,!1);else{this.visible.delete(t),this.checkAnimation(t,!0);const f=t.animation;f instanceof n.Z&&f.clearCache()}break}}}})),this.overrideIdleGroups=new Set,h.Z.addEventListener("play",(({doc:f})=>{"round"===f.type&&(this.videosLocked=!0,this.checkAnimations())})),h.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})),o.Z.addEventListener("change",(f=>{this.checkAnimations(f)}))}setOverrideIdleGroup(f,e){e?this.overrideIdleGroups.add(f):this.overrideIdleGroups.delete(f)}getAnimations(f){const e=[];for(const d in this.byGroups)for(const t of this.byGroups[d])t.el===f&&e.push(t);return e}removeAnimation(f){const{el:e,animation:d}=f;d.remove(),d instanceof HTMLVideoElement&&i.IS_SAFARI&&setTimeout((()=>{d.src="",d.load()}),1e3);const t=this.byGroups[f.group];t&&((0,c.Z)(t,f),t.length||delete this.byGroups[f.group]),this.observer.unobserve(e),this.visible.delete(f)}addAnimation(f,e=""){var d;const i={el:f instanceof n.Z?f.el:f,animation:f,group:e};f instanceof n.Z&&!t.Z.settings.stickers.loop&&f.loop&&(f.loop=t.Z.settings.stickers.loop),(null!==(d=this.byGroups[e])&&void 0!==d?d:this.byGroups[e]=[]).push(i),this.observer.observe(i.el)}checkAnimations(f,e,d=!1){if(void 0!==e&&!this.byGroups[e])return;const t=void 0!==e?[e]:Object.keys(this.byGroups);for(const e of t){const t=this.byGroups[e];(0,r.Z)(t,(e=>{this.checkAnimation(e,f,d)}))}}checkAnimation(f,e=!1,d=!1){const{el:t,animation:i,group:a}=f;d||!(0,s.Z)(t)&&!this.lockedGroups[a]?this.removeAnimation(f):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||i instanceof HTMLVideoElement&&this.videosLocked?i.paused||i.pause():!(i.paused&&this.visible.has(f)&&i.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||o.Z.isIdle&&!this.overrideIdleGroups.has(f.group)||i.play()}setOnlyOnePlayableGroup(f){this.onlyOnePlayableGroup=f}lockGroup(f){this.lockedGroups[f]=!0}unlockGroup(f){delete this.lockedGroups[f],this.checkAnimations(void 0,f)}refreshGroup(f){const e=this.byGroups[f];e&&e.length&&(e.forEach((f=>{this.observer.unobserve(f.el)})),window.requestAnimationFrame((()=>{e.forEach((f=>{this.observer.observe(f.el)}))})))}lockIntersectionGroup(f){this.intersectionLockedGroups[f]=!0}unlockIntersectionGroup(f){delete this.intersectionLockedGroups[f],this.refreshGroup(f)}};a.GO&&(a.GO.animationIntersector=l);const b=l},3013:(f,e,d)=>{d.d(e,{Z:()=>M});var t=d(3512),i=d(3725),a=d(4762),s=d(410),n=d(6669),c=d(5432),r=d(2325),o=d(3719),h=d(8479),l=d(6848),b=d(3699),u=d(7530),p=d(493),m=d(2312),g=d(925),v=d(3241),y=function(f,e,d,t){return new(d||(d=Promise))((function(i,a){function s(f){try{c(t.next(f))}catch(f){a(f)}}function n(f){try{c(t.throw(f))}catch(f){a(f)}}function c(f){var e;f.done?i(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(s,n)}c((t=t.apply(f,e||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(f){return!1}})();class k extends v.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=(f,e=this.playingMedia)=>{e&&(e.currentTime=Math.max(0,e.currentTime-(f.seekOffset||10)))},this.seekForward=(f,e=this.playingMedia)=>{e&&(e.currentTime=Math.min(e.duration,e.currentTime+(f.seekOffset||10)))},this.seekTo=(f,e=this.playingMedia)=>{e&&(e.currentTime=f.seekTime)},this.onMediaDocumentLoad=f=>y(this,void 0,void 0,(function*(){const e=this.mediaDetails.get(f),d=yield this.managers.appDocsManager.getDoc(e.docId);"audio"===d.type&&d.supportsStreaming&&w&&this.handleSafariStreamable(f);const t=yield this.managers.thumbsStorage.getCacheContext(d);f.src=t.url,this.playingMedia===f&&(f.playbackRate=this.playbackRate,"audio"===d.type&&(f.loop=this.loop));const i=this.waitingDocumentsForLoad[d.id];i&&(i.delete(f),i.size||delete this.waitingDocumentsForLoad[d.id])})),this.onPlay=f=>{const e=f.target,d=this.mediaDetails.get(e),{peerId:t,mid:i}=d,a=this.pip;a&&a.pause();const s=this.getMessageByMedia(e);if(this.playingMedia!==e){this.stop(),this.setMedia(e,s);const f=f=>f.mid===i&&f.peerId===t,d=this.listLoader,a=d.getCurrent();if(!a||!f(a)){let e;for(const t of[!1,!0]){const i=d.getPrevious(t);let a=i.findIndex(f);if(-1!==a?e=-(i.length-a):(a=d.getNext(t).findIndex(f),-1!==a&&(e=a+1)),void 0!==e)break}e?this.go(e,!1):this.setTargets({peerId:t,mid:i})}}setTimeout((()=>{this.playingMedia===e&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=f=>{this.dispatchEvent("pause")},this.onEnded=f=>{if(!f.isTrusted)return;this.onPause(f);const e=this.listLoader;!this.lockedSwitchers&&(this.round||!e.current||e.next.length)&&e.getNext(!0).length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(f=this.playingMedia)=>{if(!f)return!1;if(f.paused||f.pause(),f.currentTime=0,(0,n.Z)(f,"ended"),f===this.playingMedia){const e=this.mediaDetails.get(f);if(null==e?void 0:e.clean){f.src="";const d=e.peerId,t=e.isScheduled?this.scheduled:this.media,i=t.get(d);i&&(i.delete(e.mid),i.size||t.delete(d)),f.remove(),this.mediaDetails.delete(f)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=f=>{const{peerId:e,mid:d}=f,t=this.searchContext.isScheduled;this.getMedia(e,d,t).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(e,d,t)}),0)},this.go=(f,e)=>{const d=this.listLoader;if(!this.lockedSwitchers&&d)return"audio"===this.playingMediaType?d.goRound(f,e):d.go(f,e)},this.browserPlay=this.bindBrowserCallback((f=>this.toggle(!0,f))),this.browserPause=this.bindBrowserCallback((f=>this.toggle(!1,f))),this.browserStop=this.bindBrowserCallback((f=>this.stop(f))),this.browserSeekBackward=this.bindBrowserCallback(((f,e)=>this.seekBackward(e,f))),this.browserSeekForward=this.bindBrowserCallback(((f,e)=>this.seekForward(e,f))),this.browserSeekTo=this.bindBrowserCallback(((f,e)=>this.seekTo(e,f))),this.browserNext=this.bindBrowserCallback((f=>f||this.next())),this.browserPrevious=this.bindBrowserCallback((f=>f?this.seekToStart(f):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(f){if(this.managers=f,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const f={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 e in f)try{navigator.mediaSession.setActionHandler(e,f[e])}catch(f){console.warn("MediaSession action is not supported:",e)}}t.Z.addEventListener("document_downloaded",(f=>{const e=this.waitingDocumentsForLoad[f];if(e)for(const f of e)this.onMediaDocumentLoad(f)})),t.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const e={};["volume","muted","playbackRate","loop","round"].forEach((f=>{const d="_"+f;e[f]={get:()=>this[d],set:e=>{this[d]!==e&&(this[d]=e,!this.playingMedia||"loop"===f&&"audio"!==this.playingMediaType||"round"===f||(this.playingMedia[f]=e),"playbackRate"===f&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=e),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,e)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:f,muted:e,playbackRate:d,playbackRates:t,loop:i,round:a}=this;return{volume:f,muted:e,playbackRate:d,playbackRates:t,loop:i,round:a}}setPlaybackParams(f){this.playbackRates=f.playbackRates,this._volume=f.volume,this._muted=f.muted,this._playbackRate=f.playbackRate,this._loop=f.loop,this._round=f.round}addMedia(f,e,d){const{peerId:a,mid:s}=f,n=f.pFlags.is_scheduled?this.scheduled:this.media;let c=n.get(f.peerId);c||n.set(f.peerId,c=new Map);let r=c.get(s);if(r)return r;const o=(0,u.Z)(f);c.set(s,r=document.createElement("round"===o.type||"video"===o.type?"video":"audio")),"round"===o.type&&r.setAttribute("playsinline","true");const h={peerId:a,mid:s,docId:o.id,doc:o,message:f,clean:d,isScheduled:f.pFlags.is_scheduled};this.mediaDetails.set(r,h),r.volume=1,this.container.append(r),r.addEventListener("play",this.onPlay),r.addEventListener("pause",this.onPause),r.addEventListener("ended",this.onEnded),"audio"!==o.type&&(null==f?void 0:f.pFlags.media_unread)&&f.fromId!==t.Z.myId&&r.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[s])}),{once:!0});const l=(0,i.Z)();if(e)l.resolve();else{const e=f.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let d=e.get(a);d||e.set(a,d=new Map),d.set(s,l)}return l.then((()=>y(this,void 0,void 0,(function*(){if(o.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(o)).url)this.onMediaDocumentLoad(r);else{let f=this.waitingDocumentsForLoad[o.id];f||(f=this.waitingDocumentsForLoad[o.id]=new Set),f.add(r),m.Z.downloadMediaURL({media:o})}})))),r}getMedia(f,e,d){const t=(d?this.scheduled:this.media).get(f);return null==t?void 0:t.get(e)}handleSafariStreamable(f){f.addEventListener("play",(()=>{const e=f.currentTime;f.addEventListener("progress",(()=>{f.currentTime=f.duration-1,f.addEventListener("progress",(()=>{f.currentTime=e,f.paused||f.play()}),{once:!0})}),{once:!0})}))}resolveWaitingForLoadMedia(f,e,d){const t=d?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,i=t.get(f);if(!i)return;const a=i.get(e);a&&(a.resolve(),i.delete(e),i.size||t.delete(f))}isSafariBuffering(f){return!!f.safariBuffering}setSafariBuffering(f,e){f.safariBuffering=e}setNewMediadata(f,e=this.playingMedia){var d,t;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,g.Z)(e,void 0,!1);const i=(0,u.Z)(f),s=[],n="voice"===i.type||"round"===i.type;let o="",h="";if(null===(d=i.thumbs)||void 0===d?void 0:d.length){const d=i.thumbs[i.thumbs.length-1];if(!d.bytes){const t=yield this.managers.thumbsStorage.getCacheContext(i,d.type);t.url?s.push({src:t.url,sizes:`${d.w}x${d.h}`,type:"image/jpeg"}):m.Z.downloadMediaURL({media:i,thumb:d}).then((()=>{this.playingMedia===e&&t.url&&this.setNewMediadata(f)}))}}else if(n){const e=f.fromId||f.peerId;yield this.managers.appPeersManager.getPeerPhoto(e),o=yield(0,p.Z)(e,!0,!1),h=r.ZP.format("voice"===i.type?"AttachAudio":"AttachRound",!0)}if(!n){const f=i.attributes.find((f=>"documentAttributeAudio"===f._));o=null!==(t=null==f?void 0:f.title)&&void 0!==t?t:i.file_name,h=null==f?void 0:f.performer}s.length||(a.IS_APPLE?c.Z?s.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):s.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach((f=>{const e=`${f}x${f}`;s.push({src:`assets/img/android-chrome-${e}.png`,sizes:e,type:"image/png"})})));const l=new MediaMetadata({title:o,artist:h,artwork:s});navigator.mediaSession.metadata=l}))}setCurrentMediadata(){const{playingMedia:f}=this;if(!f)return;const e=this.getMessageByMedia(f);this.setNewMediadata(e,f)}getMessageByMedia(f){return this.mediaDetails.get(f).message}getPlayingDetails(){const{playingMedia:f}=this;if(!f)return;const e=this.getMessageByMedia(f);return{doc:(0,u.Z)(e),message:e,media:f,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,t.Z.dispatchEvent("media_play")}toggle(f,e=this.playingMedia){return!!e&&(void 0===f&&(f=e.paused),e.paused===f&&(f?e.play():e.pause(),!0))}bindBrowserCallback(f){return e=>{f(this.pip,e)}}seekToStart(f){return(null==f?void 0:f.currentTime)>5&&(f.currentTime=0,this.toggle(!0,f),!0)}willBePlayed(f){this.willBePlayedMedia=f}setSearchContext(f){return!(0,l.Z)(this.searchContext,f)&&(this.searchContext=(0,h.Z)(f),!0)}getSearchContext(){return this.searchContext}setTargets(f,e,d){let t=this.listLoader;t?t.reset():t=this.listLoader=new o.Z({loadCount:10,loadWhenLeft:5,processItem:f=>(this.addMedia(f,!1),{peerId:f.peerId,mid:f.mid}),onJump:(f,e)=>{this.playItem(f)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const i=void 0===this.searchContext.folderId;e?t.setTargets(e,d,i):t.reverse=i,t.setSearchContext(this.searchContext),t.current=f,t.load(!0),t.load(!1)}getPlaybackMediaTypeFromMessage(f){const e=(0,u.Z)(f);let d="audio";return(null==e?void 0:e.type)&&("voice"===e.type||"round"===e.type?d="voice":"video"===e.type&&(d="video")),d}setMedia(f,e){const d=this.getPlaybackMediaTypeFromMessage(e);this._playbackRate=this.playbackRates[d],this.playingMedia=f,this.playingMediaType=d,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===d&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(e)}setSingleMedia(f,e){const d=this.playingMedia,t=this.pause();let i;return f?(i=()=>{const f=this.pip;f&&f.pause(),this.pauseMediaInOtherTabs()},f.paused||i(),f.addEventListener("play",i)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),f?this.setMedia(f,e):this.playingMedia=void 0,this.toggleSwitchers(!1),(e=t)=>{this.toggleSwitchers(!0),d&&(this.mediaDetails.get(d)?this.setMedia(d,this.getMessageByMedia(d)):this.next()||this.previous()),this.playingMedia===f&&(this.playingMedia=void 0,this.playingMediaType=void 0),f&&f.removeEventListener("play",i),e&&this.play()}}toggleSwitchers(f){this.lockedSwitchers=!f}setPictureInPicture(f){this.pip=f;const e=new b.Z;e.add(f)("leavepictureinpicture",(()=>{this.pip===f&&(this.pip=void 0,e.removeAll())}),{once:!0}),e.add(f)("play",(e=>{this.playingMedia!==f&&this.pause(),this.pauseMediaInOtherTabs()}))}}const L=new k;s.GO.appMediaPlaybackController=L;const M=L},6008:(f,e,d)=>{d.d(e,{X:()=>o});var t=d(426),i=d(3512),a=d(3035),s=d(4789),n=d(5975),c=d(2648),r=d(2738);function o(f,e,d,o,h=250,l,b){const u=(0,t.v)(e,f||"tabs"===e.dataset.animation?"tabs":"navigation",h,o,void 0,b);if(!f)return u;const p=new Proxy(u,{apply:(e,d,t)=>{const i=+t[0],a=void 0===t[1]||t[1],s=f.querySelector(`[data-tab="${i}"]`)||f.children[i];m(s,i,a)}}),m=(t,n,c=!0)=>{return r=this,o=void 0,p=function*(){const r=e.children[n];if(d){const f=yield d(n,r,c);if(void 0!==f&&!f)return}l&&l.scrollIntoViewNew({element:t.parentElement.children[n],position:"center",forceDirection:c?void 0:s.f.Static,forceDuration:h,axis:"x"}),i.Z.settings.animationsEnabled||(c=!1);const o=u.prevId();if(t.classList.contains("active")||n===o)return!1;const b=c?a.T2:f=>f(),p=f.querySelector(v.toLowerCase()+".active");p&&b((()=>{p.classList.remove("active")})),g&&-1!==o&&c&&b((()=>{const f=t.querySelector("i"),e=t.parentElement.children[o].querySelector("i");e.classList.remove("animate"),f.classList.remove("animate");const d=e.parentElement.parentElement.offsetLeft-f.parentElement.parentElement.offsetLeft,i=e.clientWidth/f.clientWidth;f.style.transform=`translate3d(${d}px, 0, 0) scale3d(${i}, 1, 1)`,(0,a.T2)((()=>{f.classList.add("animate"),f.style.transform="none"}))})),b((()=>{t.classList.add("active")})),u(n,c)},new((b=void 0)||(b=Promise))((function(f,e){function d(f){try{i(p.next(f))}catch(f){e(f)}}function t(f){try{i(p.throw(f))}catch(f){e(f)}}function i(e){var i;e.done?f(e.value):(i=e.value,i instanceof b?i:new b((function(f){f(i)}))).then(d,t)}i((p=p.apply(r,o||[])).next())}));var r,o,b,p},g=!f.classList.contains("no-stripe"),v=f.firstElementChild.tagName;return(0,r.fc)(f,(e=>{let d,t=e.target;if(t=(0,n.Z)(t,f),!t)return!1;if(t.dataset.tab){if(d=+t.dataset.tab,-1===d)return!1}else d=(0,c.Z)(t);m(t,d)}),{listenerSetter:b}),p}},426:(f,e,d)=>{d.d(e,{v:()=>o});var t=d(3512),i=d(3725),a=d(8594),s=d(2648),n=d(3910);function c(f,e,d){const t=e.getBoundingClientRect().width,i=[f,e];return d&&i.reverse(),i[0].style.filter="brightness(80%)",i[0].style.transform=`translate3d(${.25*-t}px, 0, 0)`,i[1].style.transform=`translate3d(${t}px, 0, 0)`,f.classList.add("active"),f.offsetWidth,f.style.transform="",f.style.filter="",()=>{e.style.transform=e.style.filter=""}}function r(f,e,d){const t=e.getBoundingClientRect().width,i=[f,e];return d&&i.reverse(),i[0].style.transform=`translate3d(${-t}px, 0, 0)`,i[1].style.transform=`translate3d(${t}px, 0, 0)`,f.classList.add("active"),f.offsetWidth,f.style.transform="",()=>{e.style.transform=""}}const o=(f,e,d,t,i=!0,a)=>{let s=null;switch(e){case"tabs":s=r;break;case"navigation":s=c}return f.dataset.animation=e,h(f,s,d,t,i,void 0,void 0,a)},h=(f,e,d,c,r=!0,o=!1,h=!0,l)=>{const b=new Map;let u,p=null;if(h){const d=e?"transitionend":"animationend",t=e=>{if((0,n.Z)(e),e.target.parentElement!==f)return;const i=b.get(e.target);null==i||i(),e.target===p&&(!u&&r||(u&&(u.resolve(),u=void 0),c&&c(m.prevId()),f.classList.remove("animating","backwards","disable-hover"),o&&(l?l.removeManual(f,d,t):f.removeEventListener(d,t),p=u=void 0,b.clear())))};l?l.add(f)(d,t):f.addEventListener(d,t)}function m(n,o=!0,l){l&&(p=l),n instanceof HTMLElement&&(n=(0,s.Z)(n));const g=m.prevId();if(n===g)return!1;const v=f.children[n];if(t.Z.settings.animationsEnabled&&-1!==g||(o=!1),!h){const e=f.dataset.timeout;void 0!==e&&clearTimeout(+e),delete f.dataset.timeout}if(!o){if(p)p.classList.remove("active","to","from");else if(v){const f=b.get(v);null==f||f()}return v&&(v.classList.remove("to","from"),v.classList.add("active")),f.classList.remove("animating","backwards","disable-hover"),p=v,void(c&&c(n))}h||(f.dataset.timeout=""+window.setTimeout((()=>{v.classList.remove("to"),p&&p.classList.remove("from"),f.classList.remove("animating","backwards","disable-hover"),delete f.dataset.timeout}),d)),p&&(p.classList.remove("to"),p.classList.add("from")),f.classList.add("animating");const y=g{v.classList.remove("to"),b.delete(v)})),p){let f;const e=p,t=()=>{clearTimeout(f),e.classList.remove("active","from"),w&&(null==w||w()),b.delete(e)};v?(f=window.setTimeout(t,d+100),b.set(e,t)):(f=window.setTimeout(t,d),b.set(e,(()=>{clearTimeout(f),b.delete(e)}))),r&&(u||(u=(0,i.Z)()),(0,a.YW)(u,2*d))}p=v}return m.prevId=()=>p?(0,s.Z)(p):-1,m}},493:(f,e,d)=>{d.d(e,{Z:()=>n});var t=d(8456),i=d(2325),a=d(8115),s=d(3512);function n(f,e=!1,d=!1,n,c=s.Z.managers){return r=this,o=void 0,l=function*(){f||(f=s.Z.myId);let r="";if(f.isUser()){const e=yield c.appUsersManager.getUser(f.toUserId());e.first_name&&(r+=e.first_name),!e.last_name||d&&r||(r+=" "+e.last_name),r=r?r.trim():e.pFlags.deleted?i.ZP.format(d?"Deleted":"HiddenName",!0):e.username}else r=(yield c.appChatsManager.getChat(f.toChatId())).title,d&&(r=r.split(" ")[0]);return void 0!==n&&(r=(0,t.Z)(r,n,n)),e?r:(0,a.Z)(r)},new((h=void 0)||(h=Promise))((function(f,e){function d(f){try{i(l.next(f))}catch(f){e(f)}}function t(f){try{i(l.throw(f))}catch(f){e(f)}}function i(e){var i;e.done?f(e.value):(i=e.value,i instanceof h?i:new h((function(f){f(i)}))).then(d,t)}i((l=l.apply(r,o||[])).next())}));var r,o,h,l}},3447:(f,e,d)=>{d.d(e,{Z:()=>a,i:()=>t});const t={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}},i=t[""];for(const f in t)f&&Object.assign(i,t[f]);const a=i},5296:(f,e,d)=>{d.d(e,{Kx:()=>s,cK:()=>n,jt:()=>c});var t=d(3035),i=d(3725);const a=new Map;function s(f){const e=function(f){return a.get(f)}(f);e&&(e.isCancelled=!0,e.deferred.resolve())}function n(f,e,d){return d||(d=function(f){s(f);const e={isCancelled:!1,deferred:(0,i.Z)()};return a.set(f,e),e.deferred.then((()=>{a.delete(f)})),e}(e)),(0,t.T2)((()=>{d.isCancelled||(f()?n(f,e,d):d.deferred.resolve())})),d.deferred}function c(f){(0,t.T2)((()=>{f()&&c(f)}))}},9897:(f,e,d)=>{d.d(e,{Z:()=>a});var t=d(410),i=d(9405);function a(f,e,d,t,a=!0){if(fd/t?n=e*d/f|0:(s=f*t/e|0,s>d&&(n=n*d/s|0,s=d)),a&&s>=f&&n>=e&&(s=f,n=e),(0,i.C)(s,n)}t.GO.calcImageInBox=a},2738:(f,e,d)=>{d.d(e,{EN:()=>n,fc:()=>s,pf:()=>a,tH:()=>c});var t=d(5432),i=d(6669);const a=t.Z?"mousedown":"click";function s(f,e,d={}){const t=d.listenerSetter?d.listenerSetter.add(f):f.addEventListener.bind(f);d.touchMouseDown=!0,t(a,e,d)}function n(f,e,d){f.removeEventListener(a,e,d)}function c(f){(0,i.Z)(f,a)}},6669:(f,e,d)=>{function t(f,e){const d=new Event(e,{bubbles:!0,cancelable:!0});f.dispatchEvent(d)}d.d(e,{Z:()=>t})},5975:(f,e,d)=>{function t(f,e){if(f.parentElement===e)return f;for(;f.parentElement;)if((f=f.parentElement).parentElement===e)return f;return null}d.d(e,{Z:()=>t})},8487:(f,e,d)=>{function t(f){return null==f?void 0:f.isConnected}d.d(e,{Z:()=>t})},2648:(f,e,d)=>{function t(f){if(!f.parentNode)return-1;let e=0;for(;null!==(f=f.previousElementSibling);)++e;return e}d.d(e,{Z:()=>t})},4789:(f,e,d)=>{d.d(e,{Z:()=>r,f:()=>t});var t,i=d(8594),a=d(3035),s=d(5296),n=d(3512),c=d(8487);function r(f){if(void 0===f.margin&&(f.margin=0),void 0===f.maxDistance&&(f.maxDistance=1500),void 0===f.axis&&(f.axis="y"),n.Z.settings.animationsEnabled||(f.forceDirection=t.Static),f.forceDirection===t.Static)return f.forceDuration=0,o(f);const e=(0,a.AD)().then((()=>o(f)));return"y"===f.axis?(0,i.YW)(e):e}function o(f){const{element:e,container:d,getNormalSize:t,axis:i,margin:a,position:n,forceDirection:r,maxDistance:b,forceDuration:u}=f;if(!(0,c.Z)(e))return(0,s.Kx)(d),Promise.resolve();const p="y"===i?"top":"left",m="y"===i?"bottom":"right",g="y"===i?"height":"width",v="y"===i?"scrollHeight":"scrollWidth",y="y"===i?"scrollTop":"scrollLeft",w=e.getBoundingClientRect(),k=d.getBoundingClientRect?d.getBoundingClientRect():document.body.getBoundingClientRect(),L=w[p]-k[p],M=e[v],E=t?t({rect:k}):k[g];let x=d[y];const C=d[v];let F;switch(n){case"start":F=L-a;break;case"end":F=w[m]-k[m]+a;break;case"nearest":case"center":if(Mb?(x=d.scrollTop+=F-b,F=b):F<-b&&(x=d.scrollTop+=F+b,F=-b)),F<0){const f=-x;F=Math.max(F,f)}else if(F>0){const f=C-(x+E);F=Math.min(F,f)}const S=d[y]+F,I=Math.abs(F),Z=null!=u?u:250+I/1500*350,P=Date.now(),D=I<500?l:h,A=()=>{const f=Z?Math.min((Date.now()-P)/Z,1):1,e=F*(1-D(f));return d[y]=Math.round(S-e),f<1};if(!Z||!F)return(0,s.Kx)(d),A(),Promise.resolve();if(f.startCallback){const e=C-Math.round(S+d["y"===i?"offsetHeight":"offsetWidth"]);f.startCallback({scrollSize:C,scrollPosition:x,distanceToEnd:e,path:F,duration:Z,containerRect:k,elementRect:w})}return(0,s.cK)(A,d)}function h(f){return 1-Math.pow(1-f,5)}function l(f){return 1-Math.pow(1-f,3.5)}!function(f){f[f.Up=0]="Up",f[f.Down=1]="Down",f[f.Static=2]="Static"}(t||(t={}))},8801:(f,e,d)=>{d.d(e,{P:()=>i});const t="_";function i(f,e){const d=""["".length-1]||"";let i;switch(f._){case"inputPhotoFileLocation":i=["photo",""[0],f.id,f.thumb_size].filter(Boolean).join(t);break;case"inputDocumentFileLocation":i=["document",""[0],f.id,f.thumb_size].filter(Boolean).join(t);break;case"inputPeerPhotoFileLocation":i=["peerPhoto",f.photo_id,f.pFlags.big?"big":"small"].join(t);break;case"inputStickerSetThumb":i=["stickerSetThumb",f.stickerset.id||f.stickerset.short_name||f.stickerset.emoticon||f.stickerset._,f.thumb_version].join(t);break;case"inputFileLocation":i=f.volume_id+"_"+f.local_id;break;case"inputWebFileLocation":i=["webFile",f.url].join(t);break;default:console.error("Unrecognized location:",f),i=""}return i+(d?"."+d:d)}},1708:(f,e,d)=>{d.d(e,{Z:()=>i});var t=d(7625);function i(f){(0,t.Z)(f.history,((e,d,t)=>{e.action.photo||(t.splice(d,1),void 0!==f.count&&--f.count)}))}},6074:(f,e,d)=>{d.d(e,{Z:()=>a});var t=d(7625),i=d(5953);class a{constructor(f){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,i.Z)(this,f)}setTargets(f,e,d){this.previous=f,this.next=e,this.reverse=d}get index(){return void 0!==this.count?this.previous.length:-1}reset(f=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,f),this.setLoaded(!1,f)}go(f,e=!0){let d,t;if(f>0){if(d=this.next.splice(0,f),t=d.pop(),!t)return;void 0!==this.current&&d.unshift(this.current),this.previous.push(...d)}else{if(d=this.previous.splice(Math.max(0,this.previous.length+f),-f),t=d.shift(),!t)return;void 0!==this.current&&d.push(this.current),this.next.unshift(...d)}return this.next.length0),this.current}unsetCurrent(f){f?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(f,e){const d=f>0?Math.max(0,f-this.next.length):Math.min(0,f+this.previous.length),t=this.go(f,!d&&e);return{item:d?void 0:t,leftLength:d}}setLoaded(f,e){return(f?this.loadedAllDown:this.loadedAllUp)!==e&&(f?this.loadedAllDown=e:this.loadedAllUp=e,e||(f?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(f){if(f?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let e,d=f?this.loadPromiseDown:this.loadPromiseUp;return d||(e=f?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=e||(e=this.current),d=this.loadMore(e,f,this.loadCount).then((e=>{return i=this,a=void 0,n=function*(){if((f?this.loadPromiseDown:this.loadPromiseUp)!==d)return;e.items.length{const e=this.processItem?this.processItem(f):f;e&&i.push(e)}));const a=yield Promise.all(i);f?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((s=void 0)||(s=Promise))((function(f,e){function d(f){try{c(n.next(f))}catch(f){e(f)}}function t(f){try{c(n.throw(f))}catch(f){e(f)}}function c(e){var i;e.done?f(e.value):(i=e.value,i instanceof s?i:new s((function(f){f(i)}))).then(d,t)}c((n=n.apply(i,a||[])).next())}));var i,a,s,n}),(()=>{})).then((()=>{f?this.loadPromiseDown=null:this.loadPromiseUp=null})),f?this.loadPromiseDown=d:this.loadPromiseUp=d,d)}}},3699:(f,e,d)=>{d.d(e,{Z:()=>t});class t{constructor(){this.listeners=new Set}add(f){return(e,d,t)=>{const i={element:f,event:e,callback:d,options:t};return this.addManual(i),i}}addManual(f){var e;f.element.addEventListener(f.event,f.callback,f.options),(null===(e=f.options)||void 0===e?void 0:e.once)&&(f.onceCallback=()=>{this.remove(f),f.onceFired=!0},f.element.addEventListener(f.event,f.onceCallback,f.options)),this.listeners.add(f)}remove(f){f.onceFired||(f.element.removeEventListener(f.event,f.callback,f.options),f.onceCallback&&f.element.removeEventListener(f.event,f.onceCallback,f.options)),this.listeners.delete(f)}removeManual(f,e,d,t){let i;for(const a of this.listeners)if(a.element===f&&a.event===e&&a.callback===d&&a.options===t){i=a;break}i&&this.remove(i)}removeAll(){this.listeners.forEach((f=>{this.remove(f)}))}}},9405:(f,e,d)=>{d.d(e,{C:()=>a,c:()=>i});var t=d(9897);class i{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return(0,t.Z)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function a(f,e){return new i(f,e)}},4755:(f,e,d)=>{d.d(e,{Z:()=>r,_:()=>t});var t,i=d(410),a=d(3241),s=d(9405);!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class n extends a.Z{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:(0,s.C)(270,270),webpage:(0,s.C)(270,200),album:(0,s.C)(270,0),esgSticker:(0,s.C)(68,68),animatedSticker:(0,s.C)(180,180),staticSticker:(0,s.C)(180,180),emojiSticker:(0,s.C)(112,112),poll:(0,s.C)(240,0),round:(0,s.C)(200,200),documentName:(0,s.C)(200,0),invoice:(0,s.C)(240,240)},desktop:{regular:(0,s.C)(420,340),webpage:(0,s.C)(420,340),album:(0,s.C)(420,0),esgSticker:(0,s.C)(80,80),animatedSticker:(0,s.C)(200,200),staticSticker:(0,s.C)(200,200),emojiSticker:(0,s.C)(112,112),poll:(0,s.C)(330,0),round:(0,s.C)(280,280),documentName:(0,s.C)(240,0),invoice:(0,s.C)(320,260)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const c=new n;i.GO.mediaSizes=c;const r=c},3228:(f,e,d)=>{function t(f,e,d){return fd?d:f}d.d(e,{Z:()=>t})},925:(f,e,d)=>{d.d(e,{Z:()=>i});var t=d(4762);function i(f,e=f.HAVE_METADATA,d){return new Promise((i=>{f.readyState>=e?i():f.addEventListener(t.IS_APPLE_MOBILE&&!d?"loadeddata":"canplay",(()=>i()),{once:!0})}))}},3719:(f,e,d)=>{d.d(e,{Z:()=>o});var t=d(3781),i=d(2790),a=d(3512),s=d(7625),n=d(1708),c=d(6074),r=function(f,e,d,t){return new(d||(d=Promise))((function(i,a){function s(f){try{c(t.next(f))}catch(f){a(f)}}function n(f){try{c(t.throw(f))}catch(f){a(f)}}function c(f){var e;f.done?i(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(s,n)}c((t=t.apply(f,e||[])).next())}))};class o extends c.Z{constructor(f={}){var e;super(Object.assign(Object.assign({},f),{loadMore:(f,e,d)=>{const a=e?0:d;let s=null==f?void 0:f.mid;var c;return void 0===s&&(s=this.searchContext.maxId),e||(c=s,1,s=(0,t.Z)((0,i.Z)(c)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==f?void 0:f.peerId),maxId:s,limit:a?0:d,backLimit:a})).then((f=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,n.Z)(f),f.next_rate&&(this.searchContext.nextRate=f.next_rate),{count:f.count,items:f.history})))},processItem:e=>r(this,void 0,void 0,(function*(){if((yield this.filterMids([e.mid])).length)return f.processItem(e)}))})),this.onHistoryDelete=({peerId:f,msgs:e})=>{const d=d=>d.peerId===f&&e.has(d.mid),t=(f,e,t)=>{d(f)&&t.splice(e,1)};(0,s.Z)(this.previous,t),(0,s.Z)(this.next,t),this.current&&d(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=f=>r(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(f.peerId!==this.searchContext.peerId)return;const e=yield this.filterMids([f.mid]),d=(yield Promise.all(e.map((f=>this.processItem(f))))).filter(Boolean);d.length&&(this.current?this.next.push(...d):this.previous.push(...d))})),this.onMessageSent=({message:f})=>{this.onHistoryMultiappend(f)},null!==(e=this.managers)&&void 0!==e||(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),f.isInner||(this.otherSideLoader=new o(Object.assign(Object.assign({},f),{isInner:!0})))}filterMids(f){return r(this,void 0,void 0,(function*(){const e=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._,f,e,f.length)}))}setSearchContext(f){this.searchContext=f,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(f)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(f){let e=this.previous;return this.otherSideLoader&&f&&(e=e.concat(this.otherSideLoader.previous)),e}getNext(f){let e=this.next;return this.otherSideLoader&&f&&(e=e.concat(this.otherSideLoader.next)),e}getCurrent(){var f;return this.current||(null===(f=this.otherSideLoader)||void 0===f?void 0:f.current)}goToOtherEnd(f){return f>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(f,e){var d;let t;if(null===(d=this.otherSideLoader)||void 0===d?void 0:d.current){if(t=this.otherSideLoader.goUnsafe(f,e),t.item)return t.item;if(!((f=t.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(f>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(f>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||f<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(f);this.otherSideLoader.unsetCurrent(f>0)}}if(t=this.goUnsafe(f,e),!t.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(f);this.otherSideLoader&&(f=t.leftLength,t=this.otherSideLoader.goUnsafe(f,e),t.item&&this.unsetCurrent(f>0))}return null==t?void 0:t.item}setLoaded(f,e){var d;const t=super.setLoaded(f,e);if(t&&this.otherSideLoader&&e&&!1!==(null===(d=this.searchContext)||void 0===d?void 0:d.useSearch)){const f=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:f?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(f,!0),this.otherSideLoader.load(!f)}return t}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)}}},4056:(f,e,d)=>{function t(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(f=>"&#"+f.charCodeAt(0)+";")).replace(//g,">")}d.d(e,{Z:()=>t})},8456:(f,e,d)=>{function t(f,e,d=e+10){return(f=f.trim()).length>d&&(f=f.slice(0,e)+"..."),f}d.d(e,{Z:()=>t})},8594:(f,e,d)=>{d.d(e,{YW:()=>b,ZP:()=>g,e9:()=>m,gp:()=>p});var t=d(3725),i=d(410),a=d(5418);const s=new(d(3241).Z),n="start",c="end";let r=!1,o=(0,t.Z)(),h=0;o.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function b(f,e){r||(o=(0,t.Z)(),s.dispatchEvent(n),r=!0,i.ZP&&l("start")),++h,i.ZP&&l("attach promise, length:",h,e);const d=[void 0!==e?(0,a.Z)(e):void 0,f.finally((()=>{}))].filter(Boolean),c=performance.now(),b=o;return Promise.race(d).then((()=>{o!==b||o.isFulfilled||(--h,i.ZP&&l("promise end, length:",h,performance.now()-c),h<=0&&u())})),o}function u(){o.isFulfilled||(r=!1,h=0,s.dispatchEvent(c),o.resolve(),i.ZP&&l("end"))}function p(){u()}function m(){return o}function g(f,e,d){r&&f();const t=d?d.add(s):s.addEventListener.bind(s),i=d?d.removeManual.bind(d,s):s.removeEventListener.bind(s);return t(n,f),t(c,e),()=>{i(c,e),i(n,f)}}},2312:(f,e,d)=>{d.d(e,{Z:()=>u});var t=d(3725),i=d(8801),a=d(2202),s=d(3512),n=d(410),c=d(6658),r=d(7667),o=d(319),h=d(1243),l=d(7086);const b=new class{constructor(){this.downloads={},this.progress={}}construct(f){this.managers=f,s.Z.addEventListener("download_progress",(f=>{this.progress[f.fileName]=f;const e=this.downloads[f.fileName];e&&e.main.notifyAll(f)}))}getNewDeferred(f,e){const d=(0,t.Z)();let i=this.downloads[f];if(i){const f=i.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((e=>{f[e]&&(d[e]=f[e].bind(f))}))}else i=this.downloads[f]={main:d},d.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",this.managers.apiFileManager.cancelDownload(f),d.reject(e),d.cancel=()=>{}},d.catch((()=>{this.clearDownload(f)})).finally((()=>{delete this.progress[f]}));return i[e]=d}getNewDeferredForUpload(f,e){const d=this.getNewDeferred(f);return e.then(d.resolve,d.reject),d.finally((()=>{this.clearDownload(f)})),d}clearDownload(f){delete this.downloads[f]}getUpload(f){let e=this.getDownload(f);return e||(e=this.getNewDeferred(f),this.managers.appMessagesManager.getUploadPromise(f).then(e.resolve,e.reject),e)}d(f,e,d){let t=this.getDownload(f,d);return t||(t=this.getNewDeferred(f,d),e().then(t.resolve,t.reject),t)}download(f){const e=(0,l.Z)(f);return this.d(e,(()=>this.managers.apiFileManager.download(f)),"blob")}downloadMedia(f,e="blob"){const{downloadOptions:d,fileName:t}=(0,h.Z)(f);return this.d(t,(()=>("url"===e?this.managers.apiFileManager.downloadMediaURL:"void"===e?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia)(f)),e)}downloadMediaURL(f){return this.downloadMedia(f,"url")}downloadMediaVoid(f){return this.downloadMedia(f,"void")}upload(f,e,d){return e||(e=(0,a.Z)(f)),d||(d=this.managers.apiFileManager.upload({file:f,fileName:e})),this.getNewDeferredForUpload(e,d)}getDownload(f,e){const d=this.downloads[f];return d&&d[e]}downloadToDisc(f){const e=f.media,d="document"===e._;d||f.thumb||(f.thumb=e.sizes.slice().pop());const t=this.downloadMedia(f);return t.then((t=>{const a=URL.createObjectURL(t),s=d?(0,c.Z)(e):(0,r.Z)(e,f.thumb),n=f.media.file_name||(0,i.P)(s.location);!function(f,e,d){const t=document.createElement("a");t.href=f,t.download=e,t.target="_blank",t.style.position="absolute",t.style.top="1px",t.style.left="1px",document.body.append(t);try{const f=document.createEvent("MouseEvents");f.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),t.dispatchEvent(f)}catch(e){console.error("Download click error",e);try{t.click()}catch(e){window.open(f,"_blank")}}setTimeout((()=>{t.remove(),d&&d()}),100)}(a,n,(()=>{URL.revokeObjectURL(a)}))}),o.Z),t}};n.GO&&(n.GO.appDownloadManager=b);const u=b},7530:(f,e,d)=>{function t(f){if(f)return f.action?f.action.photo:f.media&&(f.media.photo||f.media.document||f.media.webpage&&(f.media.webpage.document||f.media.webpage.photo))}d.d(e,{Z:()=>t})},8115:(f,e,d)=>{d.d(e,{Z:()=>a});var t=d(6535),i=d(3178);function a(f,e=!1){if(!f)return(0,i.Z)("");let d=(0,t.Z)(f).filter((f=>"messageEntityEmoji"===f._));return(0,i.Z)(f,{entities:d,wrappingDraft:e})}},3178:(f,e,d)=>{d.d(e,{Z:()=>m});var t=d(2423),i=d(3447),a=d(9976),s=d(4762),n=d(8479),c=d(4056),r=d(1379),o=d(6535);function h(f){return f.target="_blank",f.rel="noopener noreferrer",f}var l=d(3591);const b={};a.Z&&(b[""]=!0,[["14","🫱🏻"]].forEach((([f,e])=>{b[f]=function(f){const e=document.createElement("span");e.classList.add("emoji"),document.body.appendChild(e),e.innerText=f;const d=e.offsetWidth;e.innerText="❤️";const t=e.offsetWidth;return document.body.removeChild(e),Math.abs(d-t)<5}(e)})));const u=b;var p=d(2738);function m(f,e={}){var d,b,g,v,y;const w=document.createDocumentFragment();if(!f)return w;const k=null!==(d=e.nasty)&&void 0!==d?d:e.nasty={i:0,usedLength:0,text:f},L=null!==(b=e.entities)&&void 0!==b?b:e.entities=(0,o.Z)(k.text),M=null!==(g=e.passEntities)&&void 0!==g?g:e.passEntities={},E=null!==(v=e.contextSite)&&void 0!==v?v:e.contextSite="Telegram",x="Telegram"!==E,C=k.text.length,F=L.length;let S;for(;k.i=C){if("messageEntityCaret"!==f._)continue}else f.offset+f.length>C&&(f=(0,n.Z)(f),f.length=f.offset+f.length-C);f.length&&(k.lastEntity=f);let d=L[k.i+1];const o=f.offset,b=o+f.length,g=Math.min(b,null!==(y=null==d?void 0:d.offset)&&void 0!==y?y:65535),v=k.text.slice(o,b);let F=k.text.slice(o,g);k.usedLengthF.length&&Z?Z:w,e.voodoo)return w}var I;return k.lastEntity&&(k.usedLength=k.lastEntity.offset+k.lastEntity.length),k.usedLength{d.d(e,{Z:()=>u});var t=d(5814),i=d(410),a=d(5418),s=d(5003),n=d(3772),c=d(4762),r=d(3241);class o extends r.Z{constructor(f){super(),this.worker=f,this.worker.onerror=f=>{try{this.dispatchEvent("workerError",f),this.cleanup(),this.terminate()}catch(f){}},this.worker.onmessage=f=>{this.dispatchEvent(f.data.queryMethodListener,...f.data.queryMethodArguments)}}postMessage(f){this.worker.postMessage(f)}terminate(){this.worker.terminate()}sendQuery(f,...e){if(c.IS_SAFARI)this.worker.postMessage({queryMethod:f,queryMethodArguments:e});else{const d=[];e.forEach((f=>{f instanceof ArrayBuffer&&d.push(f),"object"==typeof f&&f.buffer instanceof ArrayBuffer&&d.push(f.buffer)})),this.worker.postMessage({queryMethod:f,queryMethodArguments:e},d)}}}var h=d(8975),l=d(3789);const b=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=(0,s.kg)("LOTTIE",s.v9.Error),this.onPlayerLoaded=(f,e,d)=>{const t=this.players[f];t?(this.log.debug("onPlayerLoaded"),t.onLoad(e,d)):this.log.warn("onPlayerLoaded on destroyed player:",f,e)},this.onFrame=(f,e,d)=>{const t=this.players[f];t?(void 0!==t.clamped&&(t.clamped=d),t.renderFrame(d,e)):this.log.warn("onFrame on destroyed player:",f,e)},this.onPlayerError=(f,e)=>{const d=this.players[f];d&&t.Z.getAnimations(d.el).forEach((f=>{t.Z.checkAnimation(f,!0,!0)}))}}getAnimation(f){for(const e in this.players)if(this.players[e].el===f)return this.players[e];return null}setLoop(f){for(const e in this.players){const d=this.players[e];d.loop=f,d.autoplay=d._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((f,e)=>{let t=this.workersLimit;for(let i=0;i{this.log("worker #"+i+" ready"),s.addEventListener("frame",this.onFrame),s.addEventListener("loaded",this.onPlayerLoaded),s.addEventListener("error",this.onPlayerError),--t,t||(this.log("workers ready"),f(),this.loaded=!0)}),{once:!0}),s.addEventListener("workerError",(f=>{e("rlottie load error: "+f.message),this.loaded=!1}),{once:!0})}}))}loadAnimationAsAsset(f,e){return f.name=e,this.loadAnimationFromURL(f,"assets/tgs/"+e+".json")}loadAnimationFromURL(f,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then((f=>f.headers&&"application/octet-stream"!==f.headers.get("content-type")?f.blob():f.arrayBuffer().then((f=>l.Z.invokeCrypto("gzipUncompress",f))).then((f=>(0,h.Z)(f,""))))).then((d=>{const t=Object.assign(f,{animationData:d,needUpscale:!0});return t.name||(t.name=e),this.loadAnimationWorker(t)}))):this.loadPromise}waitForFirstFrame(f){return Promise.race([new Promise((e=>{f.addEventListener("firstFrame",e,{once:!0})})),(0,a.Z)(2500)]).then((()=>f))}loadAnimationWorker(f,e=f.group||"",d){return i=this,a=void 0,n=function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),d&&!d())throw new Error("middleware");if(f.width&&f.height||(f.width=parseInt(f.container.style.width),f.height=parseInt(f.container.style.height)),!f.width||!f.height)throw new Error("No size for sticker!");f.group=e;const i=this.initPlayer(f.container,f);return"none"!==e&&t.Z.addAnimation(i,e),i},new((s=void 0)||(s=Promise))((function(f,e){function d(f){try{c(n.next(f))}catch(f){e(f)}}function t(f){try{c(n.throw(f))}catch(f){e(f)}}function c(e){var i;e.done?f(e.value):(i=e.value,i instanceof s?i:new s((function(f){f(i)}))).then(d,t)}c((n=n.apply(i,a||[])).next())}));var i,a,s,n}onDestroy(f){delete this.players[f]}destroyWorkers(){this.workers.forEach(((f,e)=>{f.terminate(),this.log("worker #"+e+" terminated")})),this.log("workers destroyed"),this.workers.length=0}initPlayer(f,e){const d=new n.Z({el:f,worker:this.workers[this.curWorkerNum++],options:e});return this.players[d.reqId]=d,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),d.loadFromData(e.animationData),d}};i.GO.lottieLoader=b;const u=b},3772:(f,e,d)=>{d.d(e,{Z:()=>h});var t=d(7328),i=d(8189),a=d(4762),s=d(3241),n=d(4755),c=d(3228),r=d(2384);const o=new class{constructor(){this.cache=new Map}getCache(f){let e=this.cache.get(f);return e||this.cache.set(f,e={frames:new Map,counter:0}),++e.counter,e.frames}releaseCache(f){const e=this.cache.get(f);e&&!--e.counter&&this.cache.delete(f)}getCacheCounter(f){const e=this.cache.get(f);return null==e?void 0:e.counter}generateName(f,e,d,t,i){return[f,e,d,t?"colored":"",i||""].filter(Boolean).join("-")}};class h extends s.Z{constructor({el:f,worker:e,options:d}){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.reqId=++h.reqId,this.el=f,this.worker=e;for(let f in d)this.hasOwnProperty(f)&&(this[f]=d[f]);let s;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=d.initFrame,this.color=d.color,this.inverseColor=d.inverseColor,this.name=d.name,this.skipFirstFrameRendering=d.skipFirstFrameRendering,this.toneIndex=d.toneIndex,void 0!==d.skipRatio?s=d.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!i.Z)&&this.width<100&&this.height<100&&!d.needUpscale&&(s=.5),this.skipDelta=void 0!==s?1/s|0:1;const r=(0,c.Z)(window.devicePixelRatio,1,2);r>1&&(d.needUpscale?(this.width=Math.round(this.width*r),this.height=Math.round(this.height*r)):r>1&&(this.width>100&&this.height>100?a.IS_APPLE||!n.Z.isMobile?(this.width=Math.round(this.width*r),this.height=Math.round(this.height*r)):r>2.5&&(this.width=Math.round(this.width*(r-1.5)),this.height=Math.round(this.height*(r-1.5))):(this.width=Math.round(this.width*Math.max(1.5,r-1.5)),this.height=Math.round(this.height*Math.max(1.5,r-1.5))))),this.width=Math.round(this.width),this.height=Math.round(this.height),d.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=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height),this.context=this.canvas.getContext("2d"),t.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=o.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=o.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&o.getCacheCounter(this.cacheName)>1||this.frames.clear())}sendQuery(f,...e){this.worker.sendQuery(f,this.reqId,...e)}loadFromData(f){this.sendQuery("loadFromData",f,this.width,this.height,this.toneIndex)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(f=!0){this.paused||(this.paused=!0,f&&clearTimeout(this.rafId))}resetCurrentFrame(){var f;return this.curFrame=null!==(f=this.initFrame)&&void 0!==f?f:1===this.direction?this.minFrame:this.maxFrame}stop(f=!0){this.pause();const e=this.resetCurrentFrame();f&&this.requestFrame(e)}restart(){this.stop(!1),this.play()}setSpeed(f){this.speed!==f&&(this.speed=f,this.paused||this.setMainLoop())}setDirection(f){this.direction!==f&&(this.direction=f,this.paused||this.setMainLoop())}remove(){r.Z.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&o.releaseCache(this.cacheName),this.cleanup()}applyColor(f){const[e,d,t]=this.color;for(let i=0,a=f.length;i{this.renderFrame2(f,e)}),this.frInterval>-d?-d%this.frInterval:this.frInterval)}this.renderFrame2(f,e)}requestFrame(f){const e=this.frames.get(f);e?this.renderFrame(e,f):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",f,this.clamped))}onLap(){return!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:f,maxFrame:e}=this,d=this.curFrame+f>e?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=f;return this.requestFrame(d),!(d+f>e)||this.onLap()}mainLoopBackwards(){const{skipDelta:f,minFrame:e}=this,d=this.curFrame-fe?1:-1,callback:t})}playToFrame(f){this.pause();const{frame:e,speed:d,callback:t,direction:i}=f;this.setDirection(void 0===i?this.curFrame>e?-1:1:i),void 0!==d&&this.setSpeed(d);const a=[this.curFrame,e];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),t&&(this.playToFrameOnFrameCallback=f=>{f===e&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),t())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(f,e){this.color=f,e&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(f){this.inverseColor=f}setMinMax(f=0,e=this.frameCount-1){this.minFrame=f,this.maxFrame=e}onLoad(f,e){return d=this,t=void 0,a=function*(){this.frameCount=f,this.fps=e,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,c.Z)(this.initFrame,this.minFrame,this.maxFrame));const d=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const f=60/e;this.skipDelta=this.skipDelta/f|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(d),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const f=Date.now();this.frThen=f+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((i=void 0)||(i=Promise))((function(f,e){function s(f){try{c(a.next(f))}catch(f){e(f)}}function n(f){try{c(a.throw(f))}catch(f){e(f)}}function c(e){var d;e.done?f(e.value):(d=e.value,d instanceof i?d:new i((function(f){f(d)}))).then(s,n)}c((a=a.apply(d,t||[])).next())}));var d,t,i,a}}h.reqId=0},4874:(f,e,d)=>{d.d(e,{Z:()=>o});var t=d(2384),i=d(6008),a=d(410),s=d(4789),n=d(2648);const c=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,i.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var f;(null===(f=this.page)||void 0===f?void 0:f.onShown)&&this.page.onShown()}))}setPage(f){if(f.isAuthPage){this.pagesDiv.style.display="";let e=(0,n.Z)(f.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&t.Z.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&(0,s.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",f.pageEl.style.display="",this.pageId=-1;this.page=f}};a.GO.pagesManager=c;const r=c;class o{constructor(f,e,d,t,i){this.isAuthPage=e,this.onFirstMount=d,this.onMount=t,this.onShown=i,this.installed=!1,this.pageEl=document.body.querySelector("."+f)}mount(...f){return e=this,d=void 0,i=function*(){if(this.onMount&&this.onMount(...f),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...f);e instanceof Promise&&(yield e)}catch(f){console.error("PAGE MOUNT ERROR:",f)}this.installed=!0}r.setPage(this)},new((t=void 0)||(t=Promise))((function(f,a){function s(f){try{c(i.next(f))}catch(f){a(f)}}function n(f){try{c(i.throw(f))}catch(f){a(f)}}function c(e){var d;e.done?f(e.value):(d=e.value,d instanceof t?d:new t((function(f){f(d)}))).then(s,n)}c((i=i.apply(e,d||[])).next())}));var e,d,t,i}}},671:(f,e,d)=>{function t(f){return n(s(f)).join("-")}d.d(e,{Ml:()=>r,N0:()=>t,tB:()=>c,w1:()=>n,zu:()=>o});const i=/\uFE0F/g,a=String.fromCharCode(8205),s=f=>f.indexOf(a)<0?f.replace(i,""):f;function n(f){const e=[];let d=0,t=0,i=0;for(;i55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function c(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function r(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function o(f){return f.split("-").reduce(((f,e)=>f+String.fromCodePoint(parseInt(e,16))),"")}}}]); -//# sourceMappingURL=591.02c6c72707bff66682b2.chunk.js.map \ No newline at end of file diff --git a/public/591.02c6c72707bff66682b2.chunk.js.map b/public/591.02c6c72707bff66682b2.chunk.js.map deleted file mode 100644 index 0c4eb9fb8..000000000 --- a/public/591.02c6c72707bff66682b2.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"591.02c6c72707bff66682b2.chunk.js","mappings":"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Q,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.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/number/clamp.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.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"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport forEachReverse from \"../helpers/array/forEachReverse\";\r\nimport idleController from \"../helpers/idleController\";\r\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n private observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private overrideIdleGroups: Set;\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find((p) => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n \r\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\r\n animation.src = animation.dataset.src;\r\n animation.load();\r\n } */\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n \r\n const animation = player.animation;\r\n if(animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n animation.clearCache();\r\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\r\n animation.dataset.src = animation.src;\r\n animation.src = '';\r\n animation.load();\r\n } */\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.overrideIdleGroups = new Set();\r\n\r\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n appMediaPlaybackController.addEventListener('pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n idleController.addEventListener('change', (idle) => {\r\n this.checkAnimations(idle);\r\n });\r\n }\r\n\r\n public setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n if(group !== undefined && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n return;\r\n }\r\n \r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (player) => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\r\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach((animation) => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach((animation) => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { Document, DocumentAttribute, Message, PhotoSize } from \"../layer\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport copy from \"../helpers/object/copy\";\r\nimport deepEqual from \"../helpers/object/deepEqual\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { AppManagers } from \"../lib/appManagers/managers\";\r\nimport getMediaFromMessage from \"../lib/appManagers/utils/messages/getMediaFromMessage\";\r\nimport getPeerTitle from \"./wrappers/getPeerTitle\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport onMediaLoad from \"../helpers/onMediaLoad\";\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n doc: MyDocument,\r\n message: Message.message,\r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\r\n\r\nexport class AppMediaPlaybackController extends EventListenerBase<{\r\n play: (details: ReturnType) => void,\r\n pause: () => void,\r\n playbackParams: (params: ReturnType) => void,\r\n stop: () => void,\r\n}> {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n private playingMediaType: PlaybackMediaType;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n \r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n public loop: boolean;\r\n public round: boolean;\r\n private _volume: number;\r\n private _muted: boolean;\r\n private _playbackRate: number;\r\n private _loop: boolean;\r\n private _round: boolean;\r\n private lockedSwitchers: boolean;\r\n private playbackRates: Record = {\r\n voice: 1,\r\n video: 1,\r\n audio: 1\r\n };\r\n\r\n private pip: HTMLVideoElement;\r\n private managers: AppManagers;\r\n private skipMediaPlayEvent: boolean;\r\n\r\n construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.browserPlay,\r\n pause: this.browserPause,\r\n stop: this.browserStop,\r\n seekbackward: this.browserSeekBackward,\r\n seekforward: this.browserSeekForward,\r\n seekto: this.browserSeekTo,\r\n previoustrack: this.browserPrevious,\r\n nexttrack: this.browserNext\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (docId) => {\r\n const set = this.waitingDocumentsForLoad[docId];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_play', () => {\r\n if(this.skipMediaPlayEvent) {\r\n this.skipMediaPlayEvent = false;\r\n return;\r\n }\r\n\r\n if(!this.pause() && this.pip) {\r\n this.pip.pause();\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const,\r\n 'loop' as const,\r\n 'round' as const\r\n ];\r\n keys.forEach((key) => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\r\n this.playbackRates[this.playingMediaType] = value as number;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\r\n }\r\n\r\n public getPlaybackParams() {\r\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\r\n return {\r\n volume, \r\n muted, \r\n playbackRate,\r\n playbackRates,\r\n loop,\r\n round\r\n };\r\n }\r\n\r\n public setPlaybackParams(params: ReturnType) {\r\n this.playbackRates = params.playbackRates;\r\n this._volume = params.volume;\r\n this._muted = params.muted;\r\n this._playbackRate = params.playbackRate;\r\n this._loop = params.loop;\r\n this._round = params.round;\r\n }\r\n \r\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc = getMediaFromMessage(message) as Document.document;\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n doc,\r\n message,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(async() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDownloadManager.downloadMediaURL({media: doc});\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n\r\n if(this.playingMedia === media) {\r\n media.playbackRate = this.playbackRate;\r\n\r\n if(doc.type === 'audio') {\r\n media.loop = this.loop;\r\n }\r\n }\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n if(document.pictureInPictureElement) {\r\n return;\r\n }\r\n\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n // if(result.cached) {\r\n // const url = await result.loadPromise;\r\n // artwork.push({\r\n // src: url,\r\n // sizes: '160x160',\r\n // type: 'image/jpeg'\r\n // });\r\n // } else {\r\n // result.loadPromise.then((url) => {\r\n // if(this.playingMedia !== playingMedia || !url) {\r\n // return;\r\n // }\r\n \r\n // this.setNewMediadata(message);\r\n // });\r\n // }\r\n }\r\n\r\n title = await getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute?.title ?? doc.file_name;\r\n artist = attribute?.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n public setCurrentMediadata() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) return;\r\n const message = this.getMessageByMedia(playingMedia);\r\n this.setNewMediadata(message, playingMedia);\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\r\n const details = this.mediaDetails.get(media);\r\n return details.message;\r\n // const {peerId, mid} = details;\r\n // const message = details.isScheduled ? \r\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : \r\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\r\n // return message;\r\n }\r\n\r\n public getPlayingDetails() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) {\r\n return;\r\n }\r\n\r\n const message = this.getMessageByMedia(playingMedia);\r\n return {\r\n doc: getMediaFromMessage(message) as MyDocument,\r\n message,\r\n media: playingMedia,\r\n playbackParams: this.getPlaybackParams()\r\n };\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n this.setMedia(media, message);\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n const listLoader = this.listLoader;\r\n const current = listLoader.getCurrent();\r\n if(!current || !verify(current)) {\r\n let jumpLength: number;\r\n\r\n for(const withOtherSide of [false, true]) {\r\n const previous = listLoader.getPrevious(withOtherSide);\r\n\r\n let idx = previous.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = -(previous.length - idx);\r\n } else {\r\n const next = listLoader.getNext(withOtherSide);\r\n idx = next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n\r\n if(jumpLength !== undefined) {\r\n break;\r\n }\r\n }\r\n \r\n if(jumpLength) {\r\n this.go(jumpLength, false);\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n if(this.playingMedia !== media) {\r\n return;\r\n }\r\n\r\n this.dispatchEvent('play', this.getPlayingDetails());\r\n this.pauseMediaInOtherTabs();\r\n }, 0);\r\n };\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n // if(this.pip) {\r\n // this.pip.play();\r\n // }\r\n\r\n this.dispatchEvent('pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers || \r\n (!this.round && listLoader.current && !listLoader.next.length) || \r\n !listLoader.getNext(true).length || \r\n !this.next()) {\r\n this.stop();\r\n this.dispatchEvent('stop');\r\n }\r\n };\r\n\r\n public pauseMediaInOtherTabs() {\r\n this.skipMediaPlayEvent = true;\r\n rootScope.dispatchEvent('media_play');\r\n }\r\n\r\n // public get pip() {\r\n // return document.pictureInPictureElement as HTMLVideoElement;\r\n // }\r\n\r\n public toggle(play?: boolean, media = this.playingMedia) {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = media.paused;\r\n }\r\n\r\n if(media.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n media.play();\r\n } else {\r\n media.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = (media = this.playingMedia) => {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n if(media === this.playingMedia) {\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n \r\n this.mediaDetails.delete(media);\r\n }\r\n \r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n \r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public go = (length: number, dispatchJump?: boolean) => {\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers || !listLoader) {\r\n return;\r\n }\r\n\r\n if(this.playingMediaType === 'audio') {\r\n return listLoader.goRound(length, dispatchJump);\r\n } else {\r\n return listLoader.go(length, dispatchJump);\r\n }\r\n };\r\n\r\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\r\n const handler: MediaSessionActionHandler = (details) => {\r\n cb(this.pip, details);\r\n };\r\n\r\n return handler;\r\n }\r\n\r\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\r\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\r\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\r\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\r\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\r\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\r\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\r\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\r\n\r\n public next = () => {\r\n return this.go(1);\r\n };\r\n\r\n public previous = () => {\r\n if(this.seekToStart(this.playingMedia)) {\r\n return;\r\n }\r\n\r\n return this.go(-1);\r\n };\r\n\r\n public seekToStart(media: HTMLMediaElement) {\r\n if(media?.currentTime > 5) {\r\n media.currentTime = 0;\r\n this.toggle(true, media);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n let listLoader = this.listLoader;\r\n if(!listLoader) {\r\n listLoader = this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n this.dispatchEvent('stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n listLoader.reverse = reverse;\r\n }\r\n\r\n listLoader.setSearchContext(this.searchContext);\r\n listLoader.current = current;\r\n\r\n listLoader.load(true);\r\n listLoader.load(false);\r\n }\r\n\r\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\r\n const doc = getMediaFromMessage(message) as MyDocument;\r\n let mediaType: PlaybackMediaType = 'audio';\r\n if(doc?.type) {\r\n if(doc.type === 'voice' || doc.type === 'round') {\r\n mediaType = 'voice';\r\n } else if(doc.type === 'video') {\r\n mediaType = 'video';\r\n }\r\n }\r\n\r\n return mediaType;\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\r\n\r\n this._playbackRate = this.playbackRates[mediaType];\r\n\r\n this.playingMedia = media;\r\n this.playingMediaType = mediaType;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if(mediaType === 'audio') {\r\n this.playingMedia.loop = this.loop;\r\n }\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n let onPlay: () => void;\r\n if(media) {\r\n onPlay = () => {\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n this.pauseMediaInOtherTabs();\r\n };\r\n \r\n if(!media.paused) {\r\n onPlay();\r\n }\r\n \r\n media.addEventListener('play', onPlay);\r\n } else { // maybe it's voice recording\r\n this.pauseMediaInOtherTabs();\r\n }\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return (playPaused = wasPlaying) => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n \r\n // If it's still not cleaned\r\n if(this.playingMedia === media) {\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n if(media) {\r\n media.removeEventListener('play', onPlay);\r\n }\r\n\r\n // I don't remember what it was for\r\n // if(media && this.playingMedia === media) {\r\n // this.stop();\r\n // }\r\n\r\n if(playPaused) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n\r\n public setPictureInPicture(video: HTMLVideoElement) {\r\n this.pip = video;\r\n\r\n // let wasPlaying = this.pause();\r\n\r\n const listenerSetter = new ListenerSetter();\r\n listenerSetter.add(video)('leavepictureinpicture', () => {\r\n if(this.pip !== video) {\r\n return;\r\n }\r\n\r\n this.pip = undefined;\r\n // if(wasPlaying) {\r\n // this.play();\r\n // }\r\n\r\n listenerSetter.removeAll();\r\n }, {once: true});\r\n\r\n listenerSetter.add(video)('play', (e) => {\r\n if(this.playingMedia !== video) {\r\n this.pause();\r\n }\r\n\r\n this.pauseMediaInOtherTabs();\r\n // if(this.pause()) {\r\n // listenerSetter.add(video)('pause', () => {\r\n // this.play();\r\n // }, {once: true});\r\n // }\r\n });\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement, \r\n content: HTMLElement, \r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise, \r\n onTransitionEnd?: () => void, \r\n transitionTime = 250, \r\n scrollableX?: ScrollableX,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd, undefined, listenerSetter);\r\n\r\n if(!tabs) {\r\n return selectTab;\r\n }\r\n\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n\r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = await onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n if(prev) {\r\n mutateCallback(() => {\r\n prev.classList.remove('active');\r\n });\r\n }\r\n \r\n // a great stripe from Jolly Cobra\r\n if(useStripe && prevId !== -1 && animate) {\r\n mutateCallback(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n\r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n fastRaf(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n\r\n mutateCallback(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n attachClickEvent(tabs, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n }, {listenerSetter});\r\n\r\n return proxy;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n listenerSetter?: ListenerSetter\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy, undefined, undefined, listenerSetter);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true,\r\n listenerSetter?: ListenerSetter\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n callback?.();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\r\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\r\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n callback?.();\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n let timeout: number;\r\n const _from = from;\r\n const callback = () => {\r\n clearTimeout(timeout);\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback?.();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n\r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from \"../../helpers/string/limitSymbols\";\nimport { Chat } from \"../../layer\";\nimport { AppManagers } from \"../../lib/appManagers/managers\";\nimport I18n from \"../../lib/langPack\";\nimport wrapEmojiText from \"../../lib/richTextProcessor/wrapEmojiText\";\nimport rootScope from \"../../lib/rootScope\";\n\nexport default async function getPeerTitle(peerId: PeerId, plainText: true, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText?: false, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText: boolean, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false, _limitSymbols?: number, managers: AppManagers = rootScope.managers): Promise {\n if(!peerId) {\n peerId = rootScope.myId;\n }\n \n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n\n if(!title) title = user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : user.username;\n else title = title.trim();\n } else {\n const chat: Chat.chat = await managers.appChatsManager.getChat(peerId.toChatId());\n title = chat.title;\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);\n}\n","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport deferredPromise, { CancellablePromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { makeMediaSize } from \"./mediaSize\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf, fastRafPromise } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\nexport type ScrollStartCallbackDimensions = {\r\n scrollSize: number,\r\n scrollPosition: number,\r\n distanceToEnd: number,\r\n path: number,\r\n duration: number,\r\n containerRect: DOMRect,\r\n elementRect: DOMRect,\r\n};\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement,\r\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = fastRafPromise().then(() => scrollWithJs(options));\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n if(options.startCallback) {\r\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\r\n options.startCallback({\r\n scrollSize,\r\n scrollPosition,\r\n distanceToEnd,\r\n path,\r\n duration,\r\n containerRect,\r\n elementRect\r\n });\r\n }\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { 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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach((listener) => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport { makeMediaSize, MediaSize } from \"./mediaSize\";\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize,\r\n documentName: MediaSize,\r\n invoice: MediaSize\r\n};\r\n\r\nexport type MediaSizeType = keyof MediaTypeSizes;\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200),\r\n documentName: makeMediaSize(200, 0),\r\n invoice: makeMediaSize(240, 240)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280),\r\n documentName: makeMediaSize(240, 0),\r\n invoice: makeMediaSize(320, 260)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\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) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {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 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","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","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport deferredPromise, { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport DEBUG from '../config/debug';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\n\r\nconst eventListener = new EventListenerBase<{\r\n start: () => void,\r\n end: () => void\r\n}>();\r\nconst ANIMATION_START_EVENT = 'start';\r\nconst ANIMATION_END_EVENT = 'end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApiFileManager, DownloadMediaOptions, DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { Document, InputFile, Photo, PhotoSize, WebDocument } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport getFileNameForUpload from \"../../helpers/getFileNameForUpload\";\r\nimport { AppManagers } from \"./managers\";\r\nimport rootScope from \"../rootScope\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport getDocumentDownloadOptions from \"./utils/docs/getDocumentDownloadOptions\";\r\nimport getPhotoDownloadOptions from \"./utils/photos/getPhotoDownloadOptions\";\r\nimport createDownloadAnchor from \"../../helpers/dom/createDownloadAnchor\";\r\nimport noop from \"../../helpers/noop\";\r\nimport getDownloadMediaDetails from \"./utils/download/getDownloadMediaDetails\";\r\nimport getDownloadFileNameFromOptions from \"./utils/download/getDownloadFileNameFromOptions\";\r\nimport { AppMessagesManager } from \"./appMessagesManager\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadUrl = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\ntype DownloadType = 'url' | 'blob' | 'void';\r\n\r\nexport class AppDownloadManager {\r\n private downloads: {[fileName: string]: {main: Download, url?: Download, blob?: Download, void?: Download}} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n // private progressCallbacks: {[fileName: string]: Array} = {};\r\n private managers: AppManagers;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n rootScope.addEventListener('download_progress', (details) => {\r\n this.progress[details.fileName] = details;\r\n\r\n // const callbacks = this.progressCallbacks[details.fileName];\r\n // if(callbacks) {\r\n // callbacks.forEach((callback) => callback(details));\r\n // }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.main.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string, type?: DownloadType) {\r\n const deferred = deferredPromise();\r\n\r\n let download = this.downloads[fileName];\r\n if(!download) {\r\n download = this.downloads[fileName] = {\r\n main: deferred as any\r\n };\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n this.managers.apiFileManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n \r\n } */\r\n };\r\n \r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n }).finally(() => {\r\n delete this.progress[fileName];\r\n // delete this.progressCallbacks[fileName];\r\n });\r\n } else {\r\n const main = download.main;\r\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\r\n if(!main[key]) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n deferred[key] = main[key].bind(main);\r\n });\r\n }\r\n\r\n return download[type] = deferred as any;\r\n }\r\n\r\n public getNewDeferredForUpload>(fileName: string, promise: T) {\r\n const deferred = this.getNewDeferred(fileName);\r\n promise.then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as CancellablePromise>;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public getUpload(fileName: string): ReturnType['promise'] {\r\n let deferred: CancellablePromise = this.getDownload(fileName);\r\n if(deferred) {\r\n return deferred;\r\n }\r\n \r\n deferred = this.getNewDeferred(fileName);\r\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\r\n return deferred;\r\n }\r\n\r\n /* public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then((response) => response.blob())\r\n .then((blob) => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n } */\r\n\r\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\r\n let deferred = this.getDownload(fileName, type);\r\n if(deferred) return deferred;\r\n\r\n deferred = this.getNewDeferred(fileName, type);\r\n getPromise().then(deferred.resolve, deferred.reject);\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getDownloadFileNameFromOptions(options);\r\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob'): DownloadBlob {\r\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\r\n \r\n return this.d(fileName, () => {\r\n const cb = type === 'url' ? this.managers.apiFileManager.downloadMediaURL : (type === 'void' ? this.managers.apiFileManager.downloadMediaVoid : this.managers.apiFileManager.downloadMedia);\r\n return cb(options);\r\n }, type) as any;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\r\n return this.downloadMedia(options, 'url') as any;\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\r\n return this.downloadMedia(options, 'void');\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\r\n if(!fileName) {\r\n fileName = getFileNameForUpload(file);\r\n }\r\n\r\n if(!promise) {\r\n promise = this.managers.apiFileManager.upload({file, fileName});\r\n }\r\n \r\n const deferred = this.getNewDeferredForUpload(fileName, promise);\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string, type?: DownloadType) {\r\n const d = this.downloads[fileName];\r\n return d && d[type];\r\n }\r\n\r\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n // const progress = this.progress[fileName];\r\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n // if(progress) {\r\n // callback(progress);\r\n // }\r\n // }\r\n\r\n public downloadToDisc(options: DownloadMediaOptions) {\r\n const media = options.media;\r\n const isDocument = media._ === 'document';\r\n if(!isDocument && !options.thumb) {\r\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\r\n }\r\n \r\n const promise = this.downloadMedia(options);\r\n promise.then((blob) => {\r\n const url = URL.createObjectURL(blob);\r\n const downloadOptions = isDocument ? \r\n getDocumentDownloadOptions(media) : \r\n getPhotoDownloadOptions(media as any, options.thumb);\r\n const fileName = (options.media as Document.document).file_name || getFileNameByLocation(downloadOptions.location);\r\n createDownloadAnchor(url, fileName, () => {\r\n URL.revokeObjectURL(url);\r\n });\r\n }, noop);\r\n\r\n return promise;\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport 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","import { Document, Message, MessageAction, MessageMedia, Photo, WebPage } from \"../../../../layer\";\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n \n const media = (message as Message.messageService).action ? \n ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo : \n (message as Message.message).media && (\n ((message as Message.message).media as MessageMedia.messageMediaPhoto).photo || \n ((message as Message.message).media as MessageMedia.messageMediaDocument).document || (\n ((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage && (\n (((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document || \n (((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).photo\n )\n )\n );\n\n return media as Photo.photo | Document.document;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport parseEntities from \"./parseEntities\";\nimport wrapRichText from \"./wrapRichText\";\n\nexport default function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return wrapRichText('');\n\n let entities = parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\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 { IS_SAFARI } from \"../../environment/userAgent\";\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\";\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\n contextHashtag?: string,\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean\n}> = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement, \n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontWeight = 'bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontStyle = 'italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: line-through;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: underline;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n \n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'var(--font-monospace)';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n \n break;\n }\n \n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n \n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version 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 //} 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.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 const {url, onclick} = wrapUrl('t.me/' + username);\n\n element = document.createElement('a');\n element.className = 'mention';\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n // insertPart(entity, ``, '');\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 } else if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n \n break;\n }\n }\n\n if(!usedText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentElement) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentElement) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(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 return fragment;\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","/*\n * 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 EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => 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(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: Transferable[] = [];\n args.forEach((arg) => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(typeof(arg) === 'object' && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer);\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport rootScope from '../rootScope';\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\r\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\r\n\r\n queryableWorker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n queryableWorker.addEventListener('frame', this.onFrame);\r\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\r\n queryableWorker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n queryableWorker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then((res) => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data)).then((arr) => blobConstruct(arr as Uint8Array, ''))\r\n } else {\r\n return res.blob();\r\n }\r\n })\r\n /* .then((str) => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then((blob) => {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', middleware?: () => boolean): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw new Error('middleware');\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n if(rlPlayer.clamped !== undefined) {\r\n rlPlayer.clamped = frame;\r\n }\r\n \r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach((animation) => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: Blob, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\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};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\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 cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\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 private name: string;\n private 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 context: 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 = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\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 frames: RLottieCacheMap;\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 constructor({el, worker, options}: {\n el: HTMLElement,\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(let 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\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 = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n this.width = Math.round(this.width);\n this.height = Math.round(this.height);\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 // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n \n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery('loadFromData', data, this.width, this.height, this.toneIndex/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\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 }\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 //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n this.cleanup();\n //this.removed = true;\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, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\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 //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\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 //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n 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);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\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\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.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\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\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}"],"names":["animationIntersector","constructor","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","this","observer","IntersectionObserver","entries","entry","target","group","player","find","p","el","isIntersecting","add","checkAnimation","delete","animation","clearCache","overrideIdleGroups","doc","type","checkAnimations","idle","setOverrideIdleGroup","override","getAnimations","element","found","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","addAnimation","loop","observe","blurred","destroy","undefined","groups","Object","keys","animations","paused","pause","has","autoplay","play","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","window","requestAnimationFrame","lockIntersectionGroup","unlockIntersectionGroup","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","Map","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","get","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","set","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","item","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","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","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","proxy","Proxy","apply","that","args","animate","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","parentElement","position","forceDirection","forceDuration","axis","prevId","classList","contains","mutateCallback","tagName","toLowerCase","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","firstElementChild","tab","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","filter","offsetWidth","slideTabs","TransitionSlider","isHeavy","animationFunction","Transition","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeManual","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","onTransitionEndCallback","_from","getPeerTitle","plainText","onlyFirstName","_limitSymbols","isUser","user","appUsersManager","getUser","toUserId","first_name","last_name","trim","deleted","username","appChatsManager","getChat","toChatId","split","EmojiVersions","Emoji","version","assign","instances","cancelAnimationByKey","instance","getAnimationInstance","isCancelled","animateSingle","tick","createAnimationInstance","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","CLICK_EVENT_NAME","attachClickEvent","elem","options","bind","touchMouseDown","detachClickEvent","simulateClickEvent","simulateEvent","name","event","Event","bubbles","cancelable","findUpAsChild","parent","isInDOM","isConnected","whichChild","parentNode","i","previousElementSibling","FocusDirection","fastSmoothScroll","margin","maxDistance","Static","scrollWithJs","getNormalSize","Promise","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","containerRect","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","abs","scrollTop","remainingPath","absPath","startAt","Date","now","transition","shortTransition","longTransition","t","currentPath","startCallback","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","location","ext","str","thumb_size","Boolean","join","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","error","filterChatPhotosMessages","history","arr","photo","splice","count","ListLoader","loadedAllUp","loadedAllDown","index","loadedAll","setLoaded","items","pop","unshift","shift","unsetCurrent","toPrevious","goUnsafe","leftLength","down","loadPromiseDown","loadPromiseUp","anchor","loadMore","result","processedArr","processed","results","all","onLoadedMore","ListenerSetter","listeners","listener","addManual","onceCallback","onceFired","_listener","MediaSize","height","aspect","boxSize","fitted","aspectFitted","aspectCovered","makeMediaSize","ScreenSize","MediaSizes","super","screenSizes","mobile","medium","large","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","documentName","invoice","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","active","rAF","cancelAnimationFrame","mediaSizes","clamp","v","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","IS_APPLE_MOBILE","SearchListLoader","backLimit","maxId","messageId","generateMessageId","getServerMessageId","getSearch","limit","inputFilter","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","forEachReverse","onHistoryMultiappend","filtered","targets","map","onMessageSent","rootScope","isInner","otherSideLoader","mids","storageKey","filterMessagesByInputFilterFromStorage","useSearch","concat","goToOtherEnd","ret","changed","cleanup","encodeEntities","replace","charCodeAt","limitSymbols","limitFrom","slice","eventListener","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","log","dispatchHeavyAnimationEvent","promises","finally","perf","performance","_heavyAnimationPromise","race","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","appDownloadManager","downloads","progress","fileName","download","main","notifyAll","getNewDeferred","cancel","Error","apiFileManager","cancelDownload","reject","catch","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","d","getPromise","getDownloadFileNameFromOptions","downloadMedia","downloadOptions","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","upload","file","getFileNameForUpload","downloadToDisc","isDocument","blob","URL","createObjectURL","getDocumentDownloadOptions","getPhotoDownloadOptions","onRemove","a","href","top","left","clickEvent","createEvent","initMouseEvent","click","open","createDownloadAnchor","revokeObjectURL","noop","getMediaFromMessage","wrapEmojiText","text","isDraft","entities","wrappingDraft","setBlankToAnchor","rel","EMOJI_VERSIONS_SUPPORTED","emoji","inlineEl","appendChild","innerText","newEmojiWidth","legacyEmojiWidth","removeChild","isEmojiSupported","wrapRichText","fragment","createDocumentFragment","nasty","usedLength","parseEntities","passEntities","contextSite","contextExternal","textLength","lastElement","entity","offset","copy","lastEntity","nextEntity","startOffset","endOffset","endPartOffset","fullEntityText","partText","property","usedText","noTextFormat","fontWeight","fontStyle","styleName","fontFamily","className","noLinks","bot","atPos","command","indexOf","fromBot","encodeURIComponent","isSupported","hasOwnProperty","unicode","onclick","masked","wrapped","wrapUrl","currentContext","electronHelpers","contextUrl","hashtag","user_id","follow","encoded","encodeSpoiler","entityText","textContent","onSpoilerClick","voodoo","QueryableWorker","worker","onerror","terminate","onmessage","data","queryMethodListener","queryMethodArguments","postMessage","sendQuery","queryMethod","transfer","arg","ArrayBuffer","buffer","lottieLoader","isWebAssemblySupported","loadPromise","loaded","workersLimit","players","workers","curWorkerNum","logger","onPlayerLoaded","reqId","frameCount","fps","rlPlayer","debug","onLoad","onFrame","frameNo","frame","clamped","renderFrame","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","loadAnimationAsAsset","loadAnimationFromURL","fetch","res","headers","arrayBuffer","blobConstruct","newParams","animationData","needUpscale","loadAnimationWorker","waitForFirstFrame","middleware","parseInt","initPlayer","onDestroy","destroyWorkers","loadFromData","cache","getCache","frames","counter","releaseCache","getCacheCounter","generateName","color","toneIndex","RLottiePlayer","direction","speed","cachingDelta","skipRatio","initFrame","inverseColor","skipFirstFrameRendering","IS_ANDROID","skipDelta","pixelRatio","devicePixelRatio","noCache","Infinity","canvas","getContext","Uint8ClampedArray","imageData","ImageData","cacheName","methodName","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","curFrame","minFrame","maxFrame","renderFirstFrame","requestFrame","restart","setSpeed","setDirection","applyColor","r","g","b","applyInversing","renderFrame2","putImageData","frInterval","delta","frThen","onLap","mainLoopForwards","mainLoopBackwards","method","currentMethod","frameListener","listenerResults","enterFrame","playPart","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setColor","renderIfPaused","setInverseColor","diff","time","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","setPage","isAuthPage","display","pageEl","Page","onFirstMount","onMount","installed","mount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","char","toString","getEmojiToneIndex","input","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","curr","fromCodePoint"],"sourceRoot":""} \ No newline at end of file diff --git a/public/61.37d7af7b4663f378384c.chunk.js b/public/61.9c41f4a95f7a1c80dfdb.chunk.js similarity index 99% rename from public/61.37d7af7b4663f378384c.chunk.js rename to public/61.9c41f4a95f7a1c80dfdb.chunk.js index 621e4bf0d..e3c8723e1 100644 --- a/public/61.37d7af7b4663f378384c.chunk.js +++ b/public/61.9c41f4a95f7a1c80dfdb.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var t,e,n,r,a,o,f={2061:(t,e,n)=>{let r,a;const o=null;function f(t){return JSON.parse(JSON.stringify(t))}function c(t,e,n,a,o){for(r=0;r=0;--n)e=f(d(t[n],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 n(t,e){const n=1+((t.la-1)*e>>8),r=n<<8;let a=0;for(t.Z>=r?(a=1,t.la-=n,t.Z-=r):(a=0,t.la=n);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,n,r){(r-=n)>=2?(t.Z=e[n+0]<<8|e[n+1],t.qa=e,t.Ia=n+2,t.bc=r-2):(t.Z=0,t.qa=o,t.bc=0),t.la=255,t.gc=0}function A(t,e){var r=0,a=0;for(a=e-1;a>=0;a--)r|=n(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function S(t){t.g>=8&&w(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function T(t,e){let n=0;if(g(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return n;n=t.T>>t.g&fn[e],t.g+=e,t.g>=8&&t.g>=8&&w(t)}else t.fa=1;return n}function y(t){return t.Pa==t.gb}function R(t,e){return g(t!=o),0==e?0:(t.gb=2*e-1,t.Y=p(t.gb,En),t.Y==o?0:(t.Y[0].s=-1,t.Pa=1))}function V(t){t!=o&&(t.Y=o,t.Y=o,t.gb=0,t.Pa=0)}function O(t,e,n,r){for(var a=t.Y,o=0,f=+t.gb;r-- >0;){if(o>=f)return 0;if(a[o].s<0){if(y(t))return 0;const e=t,n=e.Y,r=+e.Pa;a[o].s=r-o,e.Pa+=2,n[r+0].s=-1,n[r+1].s=-1}else if(0==a[o].s)return 0;o+=a[o].s+(n>>r&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,n){var r=0;let a=0,f=0;for(g(t!=o),g(e!=o),r=0;r0&&(++a,f=r);if(!R(t,a))return 0;if(1==a)return f<0||f>=n?(V(t),0):O(t,f,0,0);if(a=0,f=d(n,0),f==o)return(a=a&&y(t))||V(t),a;var c=0;c=0,r=d(gn+1,0);let i=0;const u=d(gn+1,0);let b=0;for(g(e!=o),g(n>0),g(f!=o),c=0;cb&&(b=e[c]);if(b>gn)r=0;else{for(c=0;c0?u[e[c]]++:Cn;r=1}if(!r)return(a=a&&y(t))||V(t),a;for(r=0;r0&&!O(t,r,f[r],e[r]))return(a=a&&y(t))||V(t),a;return(a=y(t))||V(t),a}function _(t,e,n,r,a,o,f){var c=0;for(c=0;ct.P.v)&&(n=0==e)){t:{let e=t.Ga;var a=t.G,i=t.ub;n=t.P.l;let h=t.P.v;const p=t.Xb;var u=[o];let v=o,P=h*n;var b=o,s=o;s="WEBP_FILTER_TYPE";let A=0;u=0;var l=0;let k=0;if(g(n>0&&h>0&&r>=n),g(e!=o&&p!=o),i<=yn)n=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,kVn||s>=Tr||A>On||0!=u)n=0;else{if(k==Rn)l=i>=P,u=e,v=a+yn;else{if(u=d(P,0),v=0,u==o){n=0;break t}l=a+yn,i-=yn,a=u,b=f(tn);let t=0;const r=qt();r==o?l=0:(r.l=n,r.v=h,r.N=b,st(Oe),b.put=Pe,b.Mb=ge,b.Pb=Ae,b.ka=o,b.ka=a,b.fd=0,b.width=n,b.height=h,r.a=ze,m(r.o,e,l,i),r.Wa=Ar,Jt(n,h,1,r,o)&&Yt(r,n)&&(r.Wa=Pr,t=Ht(r,r.V,r.Ha,r.l,r.v,xt)),r!=o&&Kt(r),l=t)}if(l){for(e=yr[s],e!=o?(b=d(P,0),b==o&&(l=0,k!=Rn&&(v=u=o)),e(u,v,n,h,1,n,b,s=0),P=b,k=s):(P=u,k=v),e=0;h-- >0;)c(p,e,P,k,n),k+=n,e+=r;A==On&&(l=u==o||v<=0||n<=0?0:1)}n=l}}n=!n}return n?o:0==e?t.Xb:+e*r}function U(t,e,n,r){if(r==o||t<=0||e<=0)return Ke;if(n!=o){if(n.Ua){const r=n.wc,a=n.vc,o=-2&n.t,f=-2&n.k;if(o<0||f<0||r<=0||a<=0||o+r>t||f+a>e)return Ke;t=r,e=a}if(n.I){if(n.Ba<=0||n.Aa<=0)return Ke;t=n.Ba,e=n.Aa}}return r.width=t,r.height=e,function(t){let e=t.width;const n=t.height;let r=t.J;if(e<=0||n<=0||!(r>=Ie&&r=Ie&&f=c*Rr[f],r&=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,r&=t.F*i<=t.Wc,r&=u<=t.Rc,r&=b<=t.Uc,r&=s<=t.Wb,r&=t.F>=c,r&=t.nb>=parseInt((c+1)/2,10),r&=t.rb>=parseInt((c+1)/2,10),r&=t.y!=o,r&=t.c!=o,r&=t.S!=o,f==Ne&&(r&=t.Fa>=c,r&=s<=t.Wb,r&=t.p!=o)):r=0,r?ze:Ke}(r)}function M(t){return-256&t?t<0?0:255:t}function B(t,e,n,r){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]*Br>>16)-(t[e+12]*Mr>>16),b=(t[e+4]*Mr>>16)+(t[e+12]*Br>>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]*Br>>16)-(a[o+12]*Mr>>16),b=(a[o+4]*Mr>>16)+(a[o+12]*Br>>16),n[r+0+0*nr]=M(n[r+0+0*nr]+(c+b>>3)),n[r+1+0*nr]=M(n[r+1+0*nr]+(i+u>>3)),n[r+2+0*nr]=M(n[r+2+0*nr]+(i-u>>3)),n[r+3+0*nr]=M(n[r+3+0*nr]+(c-b>>3)),o++,r+=nr}function D(t,e,n,r,a){B(t,e,n,r),a&&B(t,e+16,n,r+4)}function E(t,e,n,r){Cr(t,e+0,n,r+0,1),Cr(t,e+32,n,r+4*nr,1)}function C(t,e,n,r){let a;for(t=t[e+0]+4,a=0;a<4;++a)for(e=0;e<4;++e)n[r+e+a*nr]=M(n[r+e+a*nr]+(t>>3))}function F(t,e,n,r){t[e+0]&&C(t,e+0,n,r+0),t[e+16]&&C(t,e+16,n,r+4),t[e+32]&&C(t,e+32,n,r+4*nr),t[e+48]&&C(t,e+48,n,r+4*nr+4)}function G(t,e,n){const r=e-nr,a=Wr,o=255-t[r-1];let f;for(f=0;f>2}function H(t,e,n){let r,a;for(r=0;r<8;++r)for(a=0;a<8;++a)e[n+a+r*nr]=t}function z(t,e,n){const r=t[e-n],a=t[e+0],o=3*(a-r)+Ir[1020+t[e-2*n]-t[e+n]],f=_r[112+(o+4>>3)];t[e-n]=Wr[255+r+_r[112+(o+3>>3)]],t[e+0]=Wr[255+a-f]}function q(t,e,n,r){const a=t[e+0],o=t[e+n];return Vr[255+t[e-2*n]-t[e-n]]>r||Vr[255+o-a]>r}function K(t,e,n,r,a){const o=t[e-3*n],f=t[e-2*n],c=t[e-n],i=t[e+0],u=t[e+n],b=t[e+2*n],s=t[e+3*n];return 2*Vr[255+c-i]+Or[255+f-u]>r?0:Vr[255+t[e-4*n]-o]<=a&&Vr[255+o-f]<=a&&Vr[255+f-c]<=a&&Vr[255+s-b]<=a&&Vr[255+b-u]<=a&&Vr[255+u-i]<=a}function J(t,e,n,r){let a;for(a=0;a<16;++a)2*Vr[255+t[e+a-n]-t[e+a+0]]+Or[255+t[e+a-2*n]-t[e+a+n]]<=r&&z(t,e+a,n)}function Y(t,e,n,r){let a;for(a=0;a<16;++a)2*Vr[255+t[e+a*n-1]-t[e+a*n+0]]+Or[255+t[e+a*n-2]-t[e+a*n+1]]<=r&&z(t,e+a*n,1)}function x(t,e,n,r){let a;for(a=3;a>0;--a)J(t,(e+=4*n)+0,n,r)}function Q(t,e,n,r){let a;for(a=3;a>0;--a)Y(t,(e+=4)+0,n,r)}function $(t,e,n,r,a,o,f,c){for(;a-- >0;){if(K(t,e+0,n,o,f))if(q(t,e+0,n,c))z(t,e+0,n);else{const r=t,a=e+0,o=n,f=r[a-2*o],c=r[a-o],u=r[a+0],b=r[a+o],s=r[a+2*o];var i=Ir[1020+3*(u-c)+Ir[1020+f-b]];const l=27*i+63>>7,h=18*i+63>>7;i=9*i+63>>7,r[a-3*o]=Wr[255+r[a-3*o]+i],r[a-2*o]=Wr[255+f+h],r[a-o]=Wr[255+c+l],r[a+0]=Wr[255+u-l],r[a+o]=Wr[255+b-h],r[a+2*o]=Wr[255+s-i]}e+=r}}function X(t,e,n,r,a,o,f,c){for(;a-- >0;){if(K(t,e+0,n,o,f))if(q(t,e+0,n,c))z(t,e+0,n);else{const r=t,a=e+0,o=n,f=r[a-o],c=r[a+0],u=r[a+o];var i=3*(c-f);const b=_r[112+(i+4>>3)];i=_r[112+(i+3>>3)];const s=b+1>>1;r[a-2*o]=Wr[255+r[a-2*o]+s],r[a-o]=Wr[255+f+i],r[a+0]=Wr[255+c-b],r[a+o]=Wr[255+u-s]}e+=r}}function Z(t,e,n,r,a,o){$(t,e+0,n,1,16,r,a,o)}function tt(t,e,n,r,a,o){$(t,e+0,1,n,16,r,a,o)}function et(t,e,n,r,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4*n)+0,n,1,16,r,a,o)}function nt(t,e,n,r,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4)+0,1,n,16,r,a,o)}function rt(t,e,n,r,a,o,f,c){$(t,e,a,1,8,o,f,c),$(n,r,a,1,8,o,f,c)}function at(t,e,n,r,a,o,f,c){$(t,e,1,a,8,o,f,c),$(n,r,1,a,8,o,f,c)}function ot(t,e,n,r,a,o,f,c){X(t,e+4*a,a,1,8,o,f,c),X(n,r+4*a,a,1,8,o,f,c)}function ft(t,e,n,r,a,o,f,c){X(t,e+4,1,a,8,o,f,c),X(n,r+4,1,a,8,o,f,c)}function ct(t,e){return e==Gn?0==t.i?0==t.d?Jn:Kn:0==t.d?qn:Gn:e}function it(t,e,n,a){for(r=0;r<4;++r)t[e+r]=n[a+r]}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!=Oe>>>8&&alert("mismatch error")}function lt(t,e,n){return t.a==ze&&(t.a=e,t.xc=n,t.za=0),0}function ht(t,a){let c=[0],i=0;var u=[0],b=f(cr),s=f(ir);let l=f(rn);if(u="VP8StatusCode",b=f(nn),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=Se(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,r=0;ru)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 p;for(h.tb=e(s),p=0;p0)if(t.Ca.pb)for(d=0;du&&(w=s),P(t.ic[+m],d,p,S),d=w,p=S,h+=3}P(t.ic[+v],d,p,u),u=p0){t.yb[w]=t.yb[0];continue}S=u}const e=t.yb[w];e.sc[0]=oa[ut(S+s,127)],e.sc[1]=fa[ut(S+0,127)],e.sb[0]=2*oa[ut(S+h,127)],e.sb[1]=101581*fa[ut(S+d,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=oa[ut(S+p,117)],e.qc[1]=fa[ut(S+v,127)]}if(!b.fb)return lt(t,Ye,"Not a key frame.");for(t.Zc=259,e(l),u=t.R,s=0;s0)+0],16==o||!n(t,c[0]))return o}else c=e[sa[o]][0];if(16==o)return 16}}function pt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*va&4278190080)>>e}function vt(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 n=ea[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-n>>4,t.mb=e.k-n>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+n>>4,t.wb=e.Ka+15+n>>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 n,r;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){n=lt(t,qe,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?na:na-1}else t.jb=ra;n=1}if(!(r=!n)){let e;t:{const n=t.jb,r=t.Ma,a=4*r,f=32*r,c=r+1,i=t.A>0?r*(t.qb?2:1):0,s=rr,l=f*(16*n+parseInt(3*ea[t.A]/2,10)),h=t.Ga!=o?t.P.l*t.P.v:0,p=a+f+c+i+s+384+l+h+ta;if(p!=p)e=0;else{if(p>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=p}t.dc=205,t.Xc=b(205,16*r),t.Sc=b(205,8*r),t.Vc=b(205,8*r),t.M=i?u(lr,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*r,t.r=8*r;const f=ea[t.A],v=f*t.H,P=f/2*t.r;t.ca=d(l,205),t.da=+v,t.aa=t.ca,t.ba=t.da+16*n*t.H+P,t.ra=t.aa,t.sa=t.ba+8*n*t.r+P,t.Xb=h?d(h,0):o,t.La=u(hr,c),t.dc=b(Gn,a),e=1}}r=!e}if(r)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,!Ur){let t;for(t=-255;t<=255;++t)Vr[255+t]=t<0?-t:t,Or[255+t]=Vr[255+t]>>1;for(t=-1020;t<=1020;++t)Ir[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)_r[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)Wr[255+t]=t<0?0:t>255?255:t;Ur=1}Cr=D,Fr=E,Gr=C,Nr=F,Lr=Z,Hr=tt,zr=rt,qr=at,Kr=et,Jr=nt,Yr=ot,xr=ft,Qr=J,$r=Y,Xr=x,Zr=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[p]=A,p++}D[v]=A}}else{for(A=n(u,156)?n(u,128)?zn:Hn:n(u,163)?Ln:Nn,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=n(u,142)?n(u,114)?n(u,183)?zn:Hn:Ln:Nn,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,n=0;var m=0,w=da;const r=e.yb[e.Lb];var S=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 T=0;let p=0,v=0;if(S=b(0,384),e.wa)m=0,w=e.R.z[3];else{const t=d(16,0);var y=g.ua+a.ua;g.ua=a.ua=(dt(o,e.R.z[1],y,r.sb,0,t)>0)+0,m=1,w=e.R.z[0];var R=t,V=S,O=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];O[0+I]=_+U,O[8+I]=_-U,O[4+I]=B+M,O[12+I]=B-M}for(I=0;I<4;++I){const t=V[V.length-1],e=O[0+4*I]+3;_=e+O[3+4*I],U=O[1+4*I]+O[2+4*I],M=O[1+4*I]-O[2+4*I],B=e-O[3+4*I],V[t+0]=_+U>>3,V[t+16]=B+M>>3,V[t+32]=_-U>>3,V[t+48]=B-M>>3,V[V.length-1]+=64}S[S.length-1]=0}for(u=i(pa[15&g.X]),s=i(pa[15&a.X]),p=0;p<4;++p){var j=s[p];for(T=0;T<4;++T){y=j+u[T];var G=dt(o,w,y,r.sc,m,S);u[T]=j=(G>0)+0,c[T]=(0!=S[S[S.length-1]+0])+0,f[T]=(G>1)+0,S[S.length-1]+=16}s[p]=j,h|=pt(c,24-4*p),l|=pt(f,24-4*p)}for(t=pt(u,24),n=pt(s,24),u=i(pa[g.X>>4]),s=i(pa[a.X>>4]),v=0;v<4;v+=2){for(p=0;p<2;++p){for(j=s[v+p],T=0;T<2;++T)y=j+u[v+T],G=dt(o,e.R.z[2],y,r.qc,0,S),u[v+T]=j=(G>0)+0,c[2*p+T]=(0!=S[S[S.length-1]+0])+0,f[2*p+T]=(G>1)+0,S[S.length-1]+=16;s[v+p]=j}h|=pt(c,8-2*v),l|=pt(f,8-2*v)}t|=pt(u,20),n|=pt(s,20),g.X=t,a.X=n,e.z=S,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=ar,J=E.Ea,Y=or,x=E.Ea,Q=fr;if(E.i>0){var N=0;for(N=-1;N<16;++N)it(C,F+N*nr-4,C,F+N*nr+12);for(N=-1;N<8;++N)it(J,Y+N*nr-4,J,Y+N*nr+4),it(x,Q+N*nr-4,x,Q+N*nr+4)}else{for(N=0;N<16;++N)C[F+N*nr-1]=129;for(N=0;N<8;++N)J[Y+N*nr-1]=129,x[Q+N*nr-1]=129;E.d>0&&(C[F-1-nr]=J[Y-1-nr]=x[Q-1-nr]=129)}const Z=E.Xc,tt=16*+E.i,et=E.Sc,nt=8*+E.i,rt=E.Vc,at=8*+E.i,ot=E.z;let ft=0;if(E.d>0)c(C,F-nr,Z,tt,16),c(J,Y-nr,et,nt,8),c(x,Q-nr,rt,at,8);else if(0==E.i){for(r=0;r<21;++r)C[F-nr-1+r]=127;for(r=0;r<9;++r)J[Y-nr-1+r]=127;for(r=0;r<9;++r)x[Q-nr-1+r]=127}if(E.wa){const t=F-nr+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*nr]=C[e+t+4*nr]=C[e+t+8*nr]=C[e+t+12*nr]=C[e+t+0];for(ft=0;ft<16;ft++){var L=C,H=F+aa[ft];Dr[E.Eb[ft]](L,H),E.Oa&1<0){const t=ht.M[1+ht.i],e=ht.La[1+ht.i].Nb;let n=ht.Zb[ht.Lb];ht.ga.oc&&(n+=ht.ga.Lc[0],ht.wa&&(n+=ht.ga.Gc[0])),n=n<0?0:n>63?63:n,t.zc=n,ht.ga.kb>0&&(n=ht.ga.kb>4?n>>2:n>>1,n>9-ht.ga.kb&&(n=9-ht.ga.kb)),t.yc=n<1?1:n,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+$,vt=ht.ra,Pt=ht.sa+8*ht.i+$;for(K=0;K<16;++K)c(X,ut+K*ht.H,ht.Ea,+ar+K*nr,16);for(K=0;K<8;++K)c(bt,st+K*ht.r,ht.Ea,+or+K*nr,8),c(vt,Pt+K*ht.r,ht.Ea,+fr+K*nr,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,n=ea[E.A],r=n*E.H,a=parseInt(n/2)*E.r,f=16*e.ha*E.H,i=8*e.ha*E.r,u=E.ca,b=E.da-r+f,s=E.aa,l=E.ba-a+i,h=E.ra,d=E.sa-a+i,p=0==e.d,v=(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 n=t.oa.d;for(g(t.oa.W),e=t.lb;e0&&$r(u,b,c,h+4),i.ab&&Zr(u,b,c,h),o>0&&Qr(u,b,c,h+4),i.ab&&Xr(u,b,c,h);else{const t=r.r,e=r.aa,n=r.ba+8*f.ha*t+8*a,d=r.ra,p=r.sa+8*f.ha*t+8*a,v=r.Ac.fb?s>=40?2:s>=15?1:0:s>=40?3:s>=20?2:s>=15?1:0;a>0&&(Hr(u,b,c,h+4,l,v),qr(e,n,d,p,t,h+4,l,v)),i.ab&&(Jr(u,b,c,h,l,v),xr(e,n,d,p,t,h,l,v)),o>0&&(Lr(u,b,c,h+4,l,v),zr(e,n,d,p,t,h+4,l,v)),i.ab&&(Kr(u,b,c,h,l,v),Yr(e,n,d,p,t,h,l,v))}}}if(C.put){if(p?(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-=n,C.y=u,C.D=b,C.c=s,C.B=l,C.S=h,C.C=d),v||(P-=n),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&&!v&&(c(E.ca,E.da-r,u,b+16*E.H,r),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,n,r,a){const o=Ga[n]+Na[e]>>ga;e=Fa[e],r[a+0]=La[t+Ca[n]-Pa],r[a+1]=La[t+o-Pa],r[a+2]=La[t+e-Pa]}function kt(t,e,n,r,a){const o=Ga[n]+Na[e]>>ga;e=Fa[e],r[a+0]=248&La[t+Ca[n]-Pa]|La[t+o-Pa]>>5,r[a+1]=La[t+o-Pa]<<3&224|La[t+e-Pa]>>3}function mt(t,e,n,r,a){r[a+0]=255,At(t,e,n,r,a+1)}function wt(t,e,n,r,a){const o=Fa[e];r[a+0]=Ha[t+Ca[n]-Pa]<<4|Ha[t+(Ga[n]+Na[e]>>ga)-Pa],r[a+1]=15|Ha[t+o-Pa]<<4}function St(t,e,n,r,a){const o=Ca[n];n=Ga[n]+Na[e]>>ga,r[a+0]=La[t+Fa[e]-Pa],r[a+1]=La[t+n-Pa],r[a+2]=La[t+o-Pa]}function Tt(t,e,n,r,a){St(t,e,n,r,a),r[a+3]=255}function yt(t,e,n,r,a){At(t,e,n,r,a),r[a+3]=255}function Rt(t,e,n){t[e]=((((4278255360&t[e])>>>0)+((4278255360&n)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&n)&16711935)>>>0}function Vt(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Ot(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function It(t,e){return Ot(t+parseInt((t-e)/2,10))}function _t(){return pn}function Wt(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Ut(t,e,n,r,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,n,r,a){for(n=e+n;e>16&255,r[a++]=n>>8&255,r[a++]=n>>0&255,r[a++]=n>>24&255}}function Bt(t,e,n,r,a){for(n=e+n;e>16&240|n>>12&15,r[a++]=n>>0&240|n>>28&15}}function Dt(t,e,n,r,a){for(n=e+n;e>24&255,r[a++]=n>>16&255,r[a++]=n>>8&255,r[a++]=n>>0&255}}function Et(t,e,n,r){return T(t,8)!=un?0:(e[0]=T(t,bn)+1,n[0]=T(t,bn)+1,r[0]=T(t,1),T(t,sn),1)}function jt(t,e){let n=0;return t<4?t+1:(n=t-2>>1,(2+(1&t)<e.ya){var n=t.Y,r=0;for(g(n!=o);0!=n[r].s;){var a=n,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)),r=r+a[r].s+t}return n[r].kc}for(r=0,g((n=t.Y)!=o);0!=n[r].s;)a=n,f=e.T>>e.g&1,++e.g,r=r+a[r].s+f;return n[r].kc}function Ft(t,e){if(t!=o){var n=0,r=0;for(n=0;n>t.eb)+(e>>t.eb)])0;){e=t.nc[a];let V=i;var h=b,d=l;switch(l=r,b=n,g(V<(p=u)),g(p<=e.Vb),e.Qc){case Sn:for(h=0,e=b+(p-V)*e.U;b>8&255,P=16711935&(P=(P=(16711935&p[d])>>>0)+(v<<16|v));l[b++]=((4278255360&p[d])>>>0|P)>>>0,32==V&&h++}break;case mn:var A=V;if(h=p,d=l,v=b,P=(T=e).U,0==A){var k=0;for(Rt(d,v,pn),k=1;k>T.n)*w;A>8&15],k=1;k>8&15]),e=t(d[v+k-1],d,v+k-P),Rt(d,v+k,e)}v+=P,0==(++A&m)&&(T+=w)}p!=e.Vb&&c(l,b-(e=e.U),l,b+(p-V-1)*e,e);break;case wn:for(h=e.U,d=(1<>e.n)*v;V>0&255,T.Bc=S>>8&255,T.Kc=S>>16&255),T=(S=l[b+w])>>>8,y=S>>>16,R=S,y+=Wt(m.Cc,T),y&=255,R+=Wt(m.Bc,T),R+=Wt(m.Kc,y),R&=255,l[b+w]=(4278255360&S|y<<16|R)>>>0;b+=h,++V,0==(V&d)&&(e+=v)}break;case Tn:h==l&&e.n>0?(h=(p-V)*Pt(e.U,e.n),s(l,d=b+(p-V)*e.U-h,l,b,h),Ut(e,V,p,l,d,l,b)):Ut(e,V,p,h,d,l,b)}b=r,l=n}}function Lt(t,e){var n=t.V,r=t.Ha+t.l*t.O;if(!((o=e-t.O)<=0)){Nt(t,o,n,r);var a=t.N;n=t.Xa;let l=[t.vb];r=t.O;var o=e,f=l,c=a.width;if(g(ra.K&&(o=a.K),r=o?r=0:(f[0]+=a.t,a.w=r-a.k,a.m=a.Ka-a.t,a.h=o-r,r=1),r){if(l=l[0],r=t.Ib,o=a.width,r.J0;){const t=n;let r=l,a=i;const b=f;let h=e;switch(c){case Ie:for(a=r+a;r>16&255,b[h++]=s>>8&255,b[h++]=s>>0&255}break;case _e:Mt(t,r,a,b,h);break;case Ee:Mt(t,r,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case We:for(a=r+a;r>0&255,b[h++]=s>>8&255,b[h++]=s>>16&255;break;case Ue:Dt(t,r,a,b,h);break;case je:Dt(t,r,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case Me:Dt(t,r,a,b,h);break;case Ce:Dt(t,r,a,b,h),WebPApplyAlphaMultiply(b,1,a,1,0);break;case Be:Bt(t,r,a,b,h);break;case Fe:Bt(t,r,a,b,h),WebPApplyAlphaMultiply4444(b,a,1,0);break;case De:for(a=r+a;r>16&248|s>>13&7,b[h++]=s>>5&224|s>>3&31;break;default:g(0)}l+=o,e+=u}n=a}t.xa+=n}else t.xa=a.I?EmitRescaledRowsYUVA(t,n,l,o,a.h):EmitRowsYUVA(t,n,l,o,a.m,a.h);g(t.xa<=r.height)}t.O=e,g(t.O<=t.v)}}function Ht(t,e,n,r,a,f){let c=1,i=0,u=0;const b=t.o,s=t.cb;let l=s.Db,h=n,d=n;n+=r*a;const p=(a=Pn+An)+s.xb,v=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>=r&&(i=0,++u,f!=o&&u%wa==0&&f(t,u),v!=o))for(;d>>v.bb]=c}else if(wDa?k-=Da:(w=Ea[k-1],w=(w>>4)*r+(8-(15&w)),k=w>=1?w:1),w=0,w=0;w=r;)i-=r,++u,f!=o&&u%wa==0&&f(t,u);if(h>>v.bb]=c}else if(w>>v.bb]=w;w=e,k=h,g(A<=-1>>>(m=v).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,v),c.n=v,l=v=Jt(h,1,0,_,c.u))if(l=h,v=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],v=1;v>>0)+((4278255360&P[v-1])>>>0)&4278255360)>>>0|(16711935&A[k+v])+(16711935&P[v-1])&16711935)>>>0;for(;v=1&&s<=hn)){r.a=Je;break}if(c)t:{c=r;var m=t[0],w=e[0],_=(l=s,k=A=0,k=c.o,c.cb);if(v=[o],h=o,P=1,n&&T(k,1)){if(w=(m=Pt(m,A=T(k,3)+2))*(W=Pt(w,A)),!Jt(m,W,0,c,v)){c.a=Je,Ft(h,P),c=0;break t}for(v=v[0],_.eb=A,A=0;A>>8&65535,v[A]=m,m>=P&&(P=m+1)}if(k.fa)Ft(h,P),c=0;else if(g(P<=65536),(h=p(P,mr))==o)c.a=qe,Ft(h,P),c=0;else{for(A=0;A0&&(m+=1<=t){(E=E&&y(e))||V(e),U=E;break n}if(!O(e,M[j],B[j],D[j])){(E=E&&y(e))||V(e),U=E;break n}}(E=(E=1)&&y(e))||V(e),U=E}else U=0}}else{if(U=0,B=[],(M=T(W,4)+4)>Ma){m.a=Je,m=0;break e}if(D=Array(t),D==o){m.a=qe,m=0;break e}for(U=0;UB){U.a=Je,V(a),U=E;break n}}else n=B;for(e=0;eB){U.a=Je,V(a),U=E;break n}for(C=C?r:0;F-- >0;)M[e++]=C}}E=1,V(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=v,_.hc=P,_.Db=h,c=1}}if(!c){r.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){r.a=qe,c=0;break}}else u.xb=0;if(s=r,l=t[0],_=e[0],h=(v=s.cb).eb,s.l=l,s.v=_,v.Ec=Pt(l,h),v.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,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,g,P){let A;const k=v-1>>1;let m=a[o+0]|f[c+0]<<16,w=i[u+0]|b[s+0]<<16;if(t){var S=3*m+w+131074>>2;g(t[e+0],255&S,S>>16,l,h)}for(n&&(S=3*w+m+131074>>2,g(n[r+0],255&S,S>>16,d,p)),A=1;A<=k;++A){const v=a[o+A]|f[c+A]<<16,k=i[u+A]|b[s+A]<<16;S=m+v+w+k+524296;const T=S+2*(v+w)>>3,y=S+2*(m+k)>>3;t&&(S=T+m>>1,m=y+v>>1,g(t[e+2*A-1],255&S,S>>16,l,h+(2*A-1)*P),g(t[e+2*A-0],255&m,m>>16,l,h+(2*A-0)*P)),n&&(S=y+w>>1,m=T+k>>1,g(n[r+2*A-1],255&S,S>>16,d,p+(2*A-1)*P),g(n[r+2*A+0],255&m,m>>16,d,p+(2*A+0)*P)),m=v,w=k}1&v||(t&&(S=3*m+w+131074>>2,g(t[e+v-1],255&S,S>>16,l,h+(v-1)*P)),n&&(S=3*w+m+131074>>2,g(n[r+v-1],255&S,S>>16,d,p+(v-1)*P)))}function $t(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,At,3)}function Xt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,St,3)}function Zt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,yt,4)}function te(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,Tt,4)}function ee(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,mt,4)}function ne(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,wt,2)}function re(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v){Qt(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d,p,v,kt,2)}function ae(t,e,n,r,a,o,f,c,i,u,b,s,l,h,d){let p;for(p=0;p0;){var f=t,c=e+(n?1:0),i=t,u=e+(n?0:3),b=0;for(b=0;b>1)*n.nb,i=n.S,u=n.C+(t.w>>1)*n.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 n=e.ka;const r=n.j.J,a=r>1,r=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(n,255),Ha[e-Pa]=ut(n+8>>4,15);za=1}return 1}function Pe(t){const e=t.ka;let n=t.m;const r=t.h;return g(!(1&t.w)),n<=0||r<=0?0:(n=e.$a(t,e),e.ec+=n,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,n,r,a,c,i){var u=0,b=[0],s="VP8StatusCode";const l=f(nn);if(t==o||n[0]=Wn&&!h(t,e[0],"RIFF",In)){if(h(t,e[0]+8,"WEBP",In)){s=Je;break t}if((P=me(t,e[0]+In))0,P=[0];t:if(s=_n+Un,g(t!=o),g(n!=o),g(b!=o),b[0]=0,n[0]<_n)s=$e;else{if(!h(t,e[0],"VP8X",In)){var d=0,p=0,v=0;if(me(t,e[0]+In)!=Un){s=Je;break t}if(n[0]=Bn){s=Je;break t}P!=o&&(P[0]=v),r!=o&&(r[0]=d),a!=o&&(a[0]=p),e[0]+=s,n[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]&Mn)),b&&i==o)return ze;if(n0&&r>b){s=Je;break t}if(v=d&&p>b-d){s=Je;break t}u[0]=p,e[0]+=_n,n[0]-=_n,P[0]=s}else P[0]=n>=1&&t[e+0]==un,u[0]=n[0];s=ze}if(l.ta=l.ta[0],l.ia=l.ia[0],s!=ze)return s;if(l.ta>Dn)return Je;if(l.ia){if(n[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:(r&&(r[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,nr||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*r/4&&e.Aa<3*a/4,e.Bb=0),1}var Oe=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,n){let r="VP8StatusCode";return Oe>>>8!=Oe>>>8||n==o?t=Ke:(r=Re(t,[0],e=[e],n),t=r==$e?Je:r),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 Oe>>>8!=Oe>>>8||t==o?t=0:(g((t=t.input)!=o),t.tc=0,t=1),t};var tn={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},en={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)"},nn={data:0,b:0,e:0,offset:0,$:o,G:0,pa:0,ta:0,na:0,ia:0},rn={qa:0,Ia:o,Pd:0,Ab:0,la:0,Z:0,gc:0},an={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},on=25,fn=[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],cn=10,un=47,bn=14,sn=3,ln=5,hn=11,dn=5,pn=4278190080,vn=8,gn=15,Pn=256,An=24,kn=4,mn=0,wn=1,Sn=2,Tn=3,yn=1,Rn=0,Vn=1,On=1,In=4,_n=8,Wn=12,Un=10,Mn=16,Bn=1*Math.pow(2,32),Dn=-1-_n-1>>>0,En={kc:0,s:0},jn={Y:"HuffmanTreeNode*",gb:0,Pa:0},Cn=-1;var Fn=506832829,Gn=0,Nn=Gn,Ln=2,Hn=3,zn=1,qn=4,Kn=5,Jn=6,Yn=3,xn=4,Qn=4,$n=4,Xn=4,Zn=8,tr=3,er=11,nr=32,rr=17*nr+9*nr,ar=1*nr+8,or=ar+16*nr+nr,fr=or+16,cr={fb:0,Jc:0,Nc:0,Ra:0},ir={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const ur={pb:0,ob:0,tb:0,Kb:d(xn,0),Cb:d(xn,0)},br={Ta:d(Yn,0),z:v([Xn,Zn,tr,er],0)},sr={Oc:0,Fb:0,kb:0,oc:0,Lc:d(Qn,0),Gc:d(Qn,0)};var lr={zc:0,yc:0,ab:0},hr={X:0,ua:0,Nb:0};const dr=d(2,0),pr={sc:f(dr),sb:f(dr),qc:f(dr)},vr={ha:0,d:0,W:0,M:lr,N:tn};var gr={a:"VP8StatusCode",za:0,xc:0,o:f(rn),Ac:f(cr),P:f(ir),ga:f(sr),Ca:f(ur),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:vr,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:p(8,rn),Zc:0,yb:p(xn,pr),R:f(br),pc:0,Pc:0,dc:0,cc:d(4,0),Xc:0,Sc:0,Vc:0,La:f(hr),M:f(lr),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(xn,0),Ga:o,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},Pr=0,Ar=1,kr=2;var mr={va:p(dn,jn)};const wr={xb:0,Yb:f({ea:0,bb:0}),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var Sr={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:f(an),l:0,v:0,O:0,xa:0,cb:f(wr),Na:0,nc:p(kn,{Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0}),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Tr=4,yr=[o,function(t,e,n,r,a,f,i,u){let b=0,s=u;for(g(t!=o),g(i!=o),g(n>0),g(r>0),g(a>0),g(f>=n*a),b=0;b0),g(r>0),g(a>0),g(f>=n*a),c(i,u,t,e,a),_(t,e+a,i,s,i,u+a,a*(n-1)),b=1;b0),g(r>0),g(a>0),g(f>=n*a),c(i,u,t,e,a),_(t,e+a,i,b,i,u+a,a*(n-1)),s=1;s255?255:n)&255}}}],Rr=[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 Vr=d(511,0),Or=d(511,0),Ir=d(2041,0),_r=d(225,0),Wr=d(766,0),Ur=0,Mr=85627,Br=35468,Dr=[function(t,e){let n,r=4;for(n=0;n<4;++n)r+=t[e+n-nr]+t[e-1+n*nr];for(r>>=3,n=0;n<4;++n)l(t,e+n*nr,r,4)},function(t,e){G(t,e,4)},function(t,e){let n=e-nr;const r=[];for(r.push(L(t[n-1],t[n+0],t[n+1])),r.push(L(t[n+0],t[n+1],t[n+2])),r.push(L(t[n+1],t[n+2],t[n+3])),r.push(L(t[n+2],t[n+3],t[n+4])),n=0;n<4;++n)c(t,e+n*nr,r,0,4)},function(t,e){const n=t[e-1],r=t[e-1+nr],a=t[e-1+2*nr],o=t[e-1+3*nr];t[e+0+0*nr]=t[e+1+0*nr]=t[e+2+0*nr]=t[e+3+0*nr]=L(t[e-1-nr],n,r),t[e+0+1*nr]=t[e+1+1*nr]=t[e+2+1*nr]=t[e+3+1*nr]=L(n,r,a),t[e+0+2*nr]=t[e+1+2*nr]=t[e+2+2*nr]=t[e+3+2*nr]=L(r,a,o),t[e+0+3*nr]=t[e+1+3*nr]=t[e+2+3*nr]=t[e+3+3*nr]=L(a,o,o)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1-nr],f=t[e+0-nr],c=t[e+1-nr],i=t[e+2-nr],u=t[e+3-nr];t[e+0+3*nr]=L(r,a,t[e-1+3*nr]),t[e+0+2*nr]=t[e+1+3*nr]=L(n,r,a),t[e+0+1*nr]=t[e+1+2*nr]=t[e+2+3*nr]=L(o,n,r),t[e+0+0*nr]=t[e+1+1*nr]=t[e+2+2*nr]=t[e+3+3*nr]=L(f,o,n),t[e+1+0*nr]=t[e+2+1*nr]=t[e+3+2*nr]=L(c,f,o),t[e+2+0*nr]=t[e+3+1*nr]=L(i,c,f),t[e+3+0*nr]=L(u,i,c)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1-nr],f=t[e+0-nr],c=t[e+1-nr],i=t[e+2-nr],u=t[e+3-nr];t[e+0+0*nr]=t[e+1+2*nr]=o+f+1>>1,t[e+1+0*nr]=t[e+2+2*nr]=f+c+1>>1,t[e+2+0*nr]=t[e+3+2*nr]=c+i+1>>1,t[e+3+0*nr]=i+u+1>>1,t[e+0+3*nr]=L(a,r,n),t[e+0+2*nr]=L(r,n,o),t[e+0+1*nr]=t[e+1+3*nr]=L(n,o,f),t[e+1+1*nr]=t[e+2+3*nr]=L(o,f,c),t[e+2+1*nr]=t[e+3+3*nr]=L(f,c,i),t[e+3+1*nr]=L(c,i,u)},function(t,e){const n=t[e+1-nr],r=t[e+2-nr],a=t[e+3-nr],o=t[e+4-nr],f=t[e+5-nr],c=t[e+6-nr],i=t[e+7-nr];t[e+0+0*nr]=L(t[e+0-nr],n,r),t[e+1+0*nr]=t[e+0+1*nr]=L(n,r,a),t[e+2+0*nr]=t[e+1+1*nr]=t[e+0+2*nr]=L(r,a,o),t[e+3+0*nr]=t[e+2+1*nr]=t[e+1+2*nr]=t[e+0+3*nr]=L(a,o,f),t[e+3+1*nr]=t[e+2+2*nr]=t[e+1+3*nr]=L(o,f,c),t[e+3+2*nr]=t[e+2+3*nr]=L(f,c,i),t[e+3+3*nr]=L(c,i,i)},function(t,e){const n=t[e+0-nr],r=t[e+1-nr],a=t[e+2-nr],o=t[e+3-nr],f=t[e+4-nr],c=t[e+5-nr],i=t[e+6-nr],u=t[e+7-nr];t[e+0+0*nr]=n+r+1>>1,t[e+1+0*nr]=t[e+0+2*nr]=r+a+1>>1,t[e+2+0*nr]=t[e+1+2*nr]=a+o+1>>1,t[e+3+0*nr]=t[e+2+2*nr]=o+f+1>>1,t[e+0+1*nr]=L(n,r,a),t[e+1+1*nr]=t[e+0+3*nr]=L(r,a,o),t[e+2+1*nr]=t[e+1+3*nr]=L(a,o,f),t[e+3+1*nr]=t[e+2+3*nr]=L(o,f,c),t[e+3+2*nr]=L(f,c,i),t[e+3+3*nr]=L(c,i,u)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1+3*nr],f=t[e-1-nr],c=t[e+0-nr],i=t[e+1-nr],u=t[e+2-nr];t[e+0+0*nr]=t[e+2+1*nr]=n+f+1>>1,t[e+0+1*nr]=t[e+2+2*nr]=r+n+1>>1,t[e+0+2*nr]=t[e+2+3*nr]=a+r+1>>1,t[e+0+3*nr]=o+a+1>>1,t[e+3+0*nr]=L(c,i,u),t[e+2+0*nr]=L(f,c,i),t[e+1+0*nr]=t[e+3+1*nr]=L(n,f,c),t[e+1+1*nr]=t[e+3+2*nr]=L(r,n,f),t[e+1+2*nr]=t[e+3+3*nr]=L(a,r,n),t[e+1+3*nr]=L(o,a,r)},function(t,e){const n=t[e-1+0*nr],r=t[e-1+1*nr],a=t[e-1+2*nr],o=t[e-1+3*nr];t[e+0+0*nr]=n+r+1>>1,t[e+2+0*nr]=t[e+0+1*nr]=r+a+1>>1,t[e+2+1*nr]=t[e+0+2*nr]=a+o+1>>1,t[e+1+0*nr]=L(n,r,a),t[e+3+0*nr]=t[e+1+1*nr]=L(r,a,o),t[e+3+1*nr]=t[e+1+2*nr]=L(a,o,o),t[e+3+2*nr]=t[e+2+2*nr]=t[e+0+3*nr]=t[e+1+3*nr]=t[e+2+3*nr]=t[e+3+3*nr]=o}],Er=[function(t,e){let n,r=16;for(n=0;n<16;++n)r+=t[e-1+n*nr]+t[e+n-nr];N(r>>5,t,e)},function(t,e){G(t,e,16)},function(t,e){let n;for(n=0;n<16;++n)c(t,e+n*nr,t,e-nr,16)},function(t,e){let n;for(n=16;n>0;--n)l(t,e+0,t[e-1],16),e+=nr},function(t,e){let n,r=8;for(n=0;n<16;++n)r+=t[e-1+n*nr];N(r>>4,t,e)},function(t,e){let n,r=8;for(n=0;n<16;++n)r+=t[e+n-nr];N(r>>4,t,e)},function(t,e){N(128,t,e)}],jr=[function(t,e){let n,r=8;for(n=0;n<8;++n)r+=t[e+n-nr]+t[e-1+n*nr];H(1*(r>>4),t,e)},function(t,e){G(t,e,8)},function(t,e){let n;for(n=0;n<8;++n)c(t,e+n*nr,t,e-nr,8)},function(t,e){let n;for(n=0;n<8;++n)l(t,e+0,t[e-1],8),e+=nr},function(t,e){let n,r=4;for(n=0;n<8;++n)r+=t[e-1+n*nr];H(1*(r>>3),t,e)},function(t,e){let n,r=4;for(n=0;n<8;++n)r+=t[e+n-nr];H(1*(r>>3),t,e)},function(t,e){H(128,t,e)}];let Cr,Fr,Gr,Nr,Lr,Hr,zr,qr,Kr,Jr,Yr,xr,Qr,$r,Xr,Zr;var ta=31,ea=[0,2,8],na=3,ra=1,aa=[0+0*nr,4+0*nr,8+0*nr,12+0*nr,0+4*nr,4+4*nr,8+4*nr,12+4*nr,0+8*nr,4+8*nr,8+8*nr,12+8*nr,0+12*nr,4+12*nr,8+12*nr,12+12*nr],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=[-Gn,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=v([tr,er],"");d(4,0);var pa=[[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]],va=134480385,ga=16,Pa=-227,Aa=482,ka=[_t,function(t){return t},function(t,e,n){return e[n+0]},function(t,e,n){return e[n+1]},function(t,e,n){return e[n-1]},function(t,e,n){return Vt(Vt(t,e[n+1]),e[n+0])},function(t,e,n){return Vt(t,e[n-1])},function(t,e,n){return Vt(t,e[n+0])},function(t,e,n){return Vt(e[n-1],e[n+0])},function(t,e,n){return Vt(e[n+0],e[n+1])},function(t,e,n){return Vt(Vt(t,e[n-1]),Vt(e[n+0],e[n+1]))},function(t,e,n){return Math.abs((t>>24&255)-(e[n-1]>>24&255))-Math.abs((e[n+0]>>24&255)-(e[n-1]>>24&255))+(Math.abs((t>>16&255)-(e[n-1]>>16&255))-Math.abs((e[n+0]>>16&255)-(e[n-1]>>16&255)))+(Math.abs((t>>8&255)-(e[n-1]>>8&255))-Math.abs((e[n+0]>>8&255)-(e[n-1]>>8&255)))+(Math.abs((255&t)-(255&e[n-1]))-Math.abs((255&e[n+0])-(255&e[n-1])))<=0?e[n+0]:t},function(t,e,n){return(Ot((t>>24&255)+(e[n+0]>>24&255)-(e[n-1]>>24&255))<<24|Ot((t>>16&255)+(e[n+0]>>16&255)-(e[n-1]>>16&255))<<16|Ot((t>>8&255)+(e[n+0]>>8&255)-(e[n-1]>>8&255))<<8|Ot((255&t)+(255&e[n+0])-(255&e[n-1])))>>>0},function(t,e,n){const r=e[n-1];return(It((t=Vt(t,e[n+0]))>>24&255,r>>24&255)<<24|It(t>>16&255,r>>16&255)<<16|It(t>>8&255,r>>8&255)<<8|It(t>>0&255,r>>0&255))>>>0},_t,_t],ma={Cc:0,Bc:0,Kc:0},wa=16,Sa=16,Ta=16,ya=[2,3,7],Ra=[3,3,11],Va=0,Oa=1,Ia=2,_a=3,Wa=4,Ua=[Pn+An,Pn,Pn,Pn,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),S()}))}},c={};function i(t){var e=c[t];if(void 0!==e)return e.exports;var n=c[t]={exports:{}};return f[t].call(n.exports,n,n.exports,i),n.exports}i.m=f,i.x=()=>{var t=i.O(void 0,[699,866,158],(()=>i(2061)));return i.O(t)},t=[],i.O=(e,n,r,a)=>{if(!n){var o=1/0;for(b=0;b=a)&&Object.keys(i.O).every((t=>i.O[t](n[c])))?n.splice(c--,1):(f=!1,a0&&t[b-1][2]>a;b--)t[b]=t[b-1];t[b]=[n,r,a]},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.f={},i.e=t=>Promise.all(Object.keys(i.f).reduce(((e,n)=>(i.f[n](t,e),e)),[])),i.u=t=>({158:"npm.iobuffer",699:"npm.pako",866:"npm.fast-png"}[t]+"."+{158:"ae3638de6414621ea67b",699:"f16d6f756c34f3914132",866:"f6db8063094ac9670661"}[t]+".chunk.js"),i.miniCssF=t=>{},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;i.g.importScripts&&(t=i.g.location+"");var e=i.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");n.length&&(t=n[n.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=t})(),e=i.u,n=i.e,r=new Map,a=new Map,i.u=function(t){return e(t)+(r.has(t)?"?"+r.get(t):"")},i.e=function(t){return n(t).catch((function(n){var o=a.has(t)?a.get(t):999999;if(o<1){var f=e(t);throw n.message="Loading chunk "+t+" failed after 999999 retries.\n("+f+")",n.request=f,n}return new Promise((function(e){setTimeout((function(){var n=Date.now();r.set(t,n),a.set(t,o-1),e(i.e(t))}),3e3)}))}))},(()=>{var t={61:1};i.f.i=(e,n)=>{t[e]||importScripts(i.p+i.u(e))};var e=this.webpackChunktweb=this.webpackChunktweb||[],n=e.push.bind(e);e.push=e=>{var[r,a,o]=e;for(var f in a)i.o(a,f)&&(i.m[f]=a[f]);for(o&&o(i);r.length;)t[r.pop()]=1;n(e)}})(),o=i.x,i.x=()=>Promise.all([699,866,158].map(i.e,i)).then(o),i.x()})(); -//# sourceMappingURL=61.37d7af7b4663f378384c.chunk.js.map \ No newline at end of file +//# sourceMappingURL=61.9c41f4a95f7a1c80dfdb.chunk.js.map \ No newline at end of file diff --git a/public/61.37d7af7b4663f378384c.chunk.js.map b/public/61.9c41f4a95f7a1c80dfdb.chunk.js.map similarity index 95% rename from public/61.37d7af7b4663f378384c.chunk.js.map rename to public/61.9c41f4a95f7a1c80dfdb.chunk.js.map index 16bfbbb54..1cb24c12b 100644 --- a/public/61.37d7af7b4663f378384c.chunk.js.map +++ b/public/61.9c41f4a95f7a1c80dfdb.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"61.37d7af7b4663f378384c.chunk.js","mappings":"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D,CAAC,IAAK,IACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAE1C,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,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,KAET,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,GACN,SAAUA,EAAGK,EAAGC,GACjB,OAAOD,EAAEC,EAAI,IACZ,SAAUN,EAAGK,EAAGC,GACjB,OAAOD,EAAEC,EAAI,IACZ,SAAUN,EAAGK,EAAGC,GACjB,OAAOD,EAAEC,EAAI,IACZ,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGA,GAAGvE,EAAGK,EAAEC,EAAI,IAAKD,EAAEC,EAAI,KAChC,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGvE,EAAGK,EAAEC,EAAI,KAClB,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGvE,EAAGK,EAAEC,EAAI,KAClB,SAAUN,EACXK,EAAGC,GACH,OAAOiE,GAAGlE,EAAEC,EAAI,GAAID,EAAEC,EAAI,KACzB,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGlE,EAAEC,EAAI,GAAID,EAAEC,EAAI,KACzB,SAAUN,EAAGK,EAAGC,GACjB,OAAOiE,GAAGA,GAAGvE,EAAGK,EAAEC,EAAI,IAAKiE,GAAGlE,EAAEC,EAAI,GAAID,EAAEC,EAAI,MAC7C,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,GACpc,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,GAC5R,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,GACnKuG,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,IAC7CuE,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,IAC7C8H,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,IAC7CgE,GAAIC,GAAIC,GAAIC,IACf6B,KAAK/O,GAAK,SAAUhK,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAG7H,GAAIjG,EAAGK,EAAGC,EAAGE,IAEzBuY,KAAK9O,GAAK,SAAUjK,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAGU,GAAIxO,EAAGK,EAAGC,EAAGE,IAEzBuY,KAAK7O,GAAK,SAAUlK,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAG3B,GAAInM,EAAGK,EAAGC,EAAGE,IAEzBuY,KAAKrQ,GAAK,SAAU1I,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAG9B,GAAIhM,EAAGK,EAAGC,EAAGE,IAEzBuY,KAAK1P,GAAK,SAAUrJ,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAGjB,GACR7M,EAAGK,EAAGC,EAAGE,IAEbuY,KAAKnP,GAAK,SAAU5J,EAAGK,EAAGC,EAAGE,GAC3B,OAAOsN,GAAGnM,GAAI3B,EAAGK,EAAGC,EAAGE,IAEzBuY,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,O,cCt+H7B,MAAMia,EAAMC,KACNC,EAA2B,GAGjC,SAASC,IAEPC,IAGF,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,GAC/C,MAAM7a,GACNib,EAASjb,EAGX,GAAc,IAAXib,EAAc,CACf,MAAMC,EAAWJ,EAAOnV,GASxB,MAAO,CAACsV,OAAAA,EAAQR,OARA,QAAO,CACrB9Q,KAAMuR,EACNlX,MAAO8W,EAAO9W,MACdC,OAAQ6W,EAAO7W,OACfkX,SAAU,EACVC,MAAO,KAMX,MAAO,CAACH,OAAAA,EAAQR,MAAO9Q,GDTA0R,CAASZ,GAAOA,MACjC,MAAMa,GACNC,QAAQC,MAAM,0BAA2BF,EAAK,WAAYjB,EAAKK,SAGjEV,EAAIyB,YAAY,CACdlB,KAAM,cACNG,QAAS,CACPF,SAAAA,EACAC,MAAOE,KAIXR,IAEA,MAGF,QACEA,KAeNH,EAAI0B,iBAAiB,WAAYC,IAXjC,IAAsBtB,EAAAA,EAYPsB,EAAMhS,KAXnBuQ,EAAM9b,KAAKic,GAOXD,SE9DEwB,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,IAOV,OAHAE,EAAoBL,GAAUM,KAAKF,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAGpEK,EAAOD,QAIfJ,EAAoBpZ,EAAI0Z,EAGxBN,EAAoBQ,EAAI,KAGvB,IAAIC,EAAsBT,EAAoB3L,OAAE8L,EAAW,CAAC,IAAI,IAAI,MAAM,IAAOH,EAAoB,QAErG,OADsBA,EAAoB3L,EAAEoM,INhCzCtf,EAAW,GACf6e,EAAoB3L,EAAI,CAACqM,EAAQC,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAeC,EAAAA,EACnB,IAAStf,EAAI,EAAGA,EAAIN,EAASmB,OAAQb,IAAK,CAGzC,IAFA,IAAKkf,EAAUC,EAAIC,GAAY1f,EAASM,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,CACb7f,EAASkgB,OAAO5f,IAAK,GACrB,IAAIsF,EAAI6Z,SACET,IAANpZ,IAAiB2Z,EAAS3Z,IAGhC,OAAO2Z,EAvBNG,EAAWA,GAAY,EACvB,IAAI,IAAIpf,EAAIN,EAASmB,OAAQb,EAAI,GAAKN,EAASM,EAAI,GAAG,GAAKof,EAAUpf,IAAKN,EAASM,GAAKN,EAASM,EAAI,GACrGN,EAASM,GAAK,CAACkf,EAAUC,EAAIC,IOJ/Bb,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,MCJ3EpB,EAAoBnZ,EAAI,GAGxBmZ,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,MCDhC1B,EAAoBnb,EAAI,WACvB,GAA0B,iBAAfmd,WAAyB,OAAOA,WAC3C,IACC,OAAOvF,MAAQ,IAAIwF,SAAS,cAAb,GACd,MAAO9d,GACR,GAAsB,iBAAX+d,OAAqB,OAAOA,QALjB,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,KAK7D,IAAKL,EAAW,MAAM,IAAI/e,MAAM,yDAChC+e,EAAYA,EAAUQ,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpF/C,EAAoBte,EAAI6gB,G,GZbhBnhB,EAAe4e,EAAoBhZ,EACnC3F,EAAgB2e,EAAoB7b,EACpC7C,EAAW,IAAI0hB,IACfzhB,EAAW,IAAIyhB,IACnBhD,EAAoBhZ,EAAI,SAAU0a,GAEhC,OADatgB,EAAasgB,IAEdpgB,EAAS2hB,IAAIvB,GAAW,IAAMpgB,EAASmgB,IAAIC,GAAW,KAGpE1B,EAAoB7b,EAAI,SAAUud,GAEhC,OADargB,EAAcqgB,GACbwB,OAAM,SAAUvD,GAC5B,IAAIwD,EAAU5hB,EAAS0hB,IAAIvB,GAAWngB,EAASkgB,IAAIC,GAAW,OAC9D,GAAIyB,EAAU,EAAG,CACf,IAAIC,EAAUhiB,EAAasgB,GAQ3B,MAPA/B,EAAM0D,QACJ,iBACA3B,EACA,mCACA0B,EACA,IACFzD,EAAM2D,QAAUF,EACVzD,EAER,OAAO,IAAIgC,SAAQ,SAAU4B,GAC3BC,YAAW,WACT,IAEIC,EACKC,KAAKC,MAGdriB,EAASsiB,IAAIlC,EAAS+B,GACtBliB,EAASqiB,IAAIlC,EAASyB,EAAU,GAChCI,EAAQvD,EAAoB7b,EAAEud,MAC7B,Y,MalCb,IAAImC,EAAkB,CACrB,GAAI,GAgBL7D,EAAoBnZ,EAAEpF,EAAI,CAACigB,EAASI,KAE/B+B,EAAgBnC,IAElBc,cAAcxC,EAAoBte,EAAIse,EAAoBhZ,EAAE0a,KAK/D,IAAIoC,EAAqBrH,KAAuB,iBAAIA,KAAuB,kBAAK,GAC5EsH,EAA6BD,EAAmBvhB,KAAKyhB,KAAKF,GAC9DA,EAAmBvhB,KAvBCuL,IACnB,IAAK6S,EAAUsD,EAAaC,GAAWpW,EACvC,IAAI,IAAImS,KAAYgE,EAChBjE,EAAoB3X,EAAE4b,EAAahE,KACrCD,EAAoBpZ,EAAEqZ,GAAYgE,EAAYhE,IAIhD,IADGiE,GAASA,EAAQlE,GACdW,EAASre,QACduhB,EAAgBlD,EAASwD,OAAS,EACnCJ,EAA2BjW,K,GZnBxBtM,EAAOwe,EAAoBQ,EAC/BR,EAAoBQ,EAAI,IAChBmB,QAAQC,IAAI,CAAC,IAAI,IAAI,KAAKwC,IAAIpE,EAAoB7b,EAAG6b,IAAsBqE,KAAK7iB,GaD9Dwe,EAAoBQ,K","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","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/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};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { webp2png } from './webp';\r\nimport type { ConvertWebPTask } from './webpWorkerController';\r\n\r\nconst ctx = self as any as DedicatedWorkerGlobalScope;\r\nconst tasks: ConvertWebPTask[] = [];\r\n//let isProcessing = false;\r\n\r\nfunction finishTask() {\r\n //isProcessing = false;\r\n processTasks();\r\n}\r\n\r\nfunction processTasks() {\r\n //if(isProcessing) return;\r\n\r\n const task = tasks.shift();\r\n if(!task) return;\r\n\r\n //isProcessing = true;\r\n\r\n switch(task.type) {\r\n case 'convertWebp': {\r\n const {fileName, bytes} = task.payload;\r\n\r\n let convertedBytes: Uint8Array;\r\n try {\r\n convertedBytes = webp2png(bytes).bytes;\r\n } catch(err) {\r\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\r\n }\r\n \r\n ctx.postMessage({\r\n type: 'convertWebp', \r\n payload: {\r\n fileName, \r\n bytes: convertedBytes\r\n }\r\n });\r\n\r\n finishTask();\r\n\r\n break;\r\n }\r\n\r\n default:\r\n finishTask();\r\n }\r\n}\r\n\r\nfunction scheduleTask(task: ConvertWebPTask) {\r\n tasks.push(task);\r\n /* if(task.payload.fileName.indexOf('main-') === 0) {\r\n tasks.push(task);\r\n } else {\r\n tasks.unshift(task);\r\n } */\r\n \r\n processTasks();\r\n}\r\n\r\nctx.addEventListener('message', (event) => {\r\n scheduleTask(event.data);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { WebPDecoder } from '../../vendor/libwebp-0.2.0';\r\nimport { encode } from 'fast-png';\r\n\r\nexport function webp2png(data: Uint8Array) {\r\n const decoder = new WebPDecoder();\r\n const config: any = decoder.WebPDecoderConfig;\r\n const buffer = config.j || config.output;\r\n const bitstream = config.input;\r\n\r\n decoder.WebPInitDecoderConfig(config);\r\n decoder.WebPGetFeatures(data, data.length, bitstream);\r\n\r\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\r\n buffer.J = 1;\r\n\r\n let status;\r\n try {\r\n status = decoder.WebPDecode(data, data.length, config);\r\n } catch(e) {\r\n status = e;\r\n }\r\n\r\n if(status === 0) {\r\n const rgbaData = buffer.Jb;\r\n const pngData = encode({\r\n data: rgbaData,\r\n width: buffer.width,\r\n height: buffer.height,\r\n channels: 4,\r\n depth: 8,\r\n });\r\n\r\n return {status, bytes: pngData};\r\n }\r\n\r\n return {status, bytes: data};\r\n}\r\n\r\nexport function webp2pngAsBlob(data: Uint8Array) {\r\n const {status, bytes} = webp2png(data);\r\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\r\n}\r\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\":\"ae3638de6414621ea67b\",\"699\":\"f16d6f756c34f3914132\",\"866\":\"f6db8063094ac9670661\"}[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;","// 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","oldGetScript","oldLoadScript","queryMap","countMap","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","Map","has","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","set","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"61.9c41f4a95f7a1c80dfdb.chunk.js","mappings":"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D,CAAC,IAAK,IACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAE1C,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,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,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","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/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};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {webp2png} from './webp';\r\nimport type {ConvertWebPTask} from './webpWorkerController';\r\n\r\nconst ctx = self as any as DedicatedWorkerGlobalScope;\r\nconst tasks: ConvertWebPTask[] = [];\r\n// let isProcessing = false;\r\n\r\nfunction finishTask() {\r\n // isProcessing = false;\r\n processTasks();\r\n}\r\n\r\nfunction processTasks() {\r\n // if(isProcessing) return;\r\n\r\n const task = tasks.shift();\r\n if(!task) return;\r\n\r\n // isProcessing = true;\r\n\r\n switch(task.type) {\r\n case 'convertWebp': {\r\n const {fileName, bytes} = task.payload;\r\n\r\n let convertedBytes: Uint8Array;\r\n try {\r\n convertedBytes = webp2png(bytes).bytes;\r\n } catch(err) {\r\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\r\n }\r\n\r\n ctx.postMessage({\r\n type: 'convertWebp',\r\n payload: {\r\n fileName,\r\n bytes: convertedBytes\r\n }\r\n });\r\n\r\n finishTask();\r\n\r\n break;\r\n }\r\n\r\n default:\r\n finishTask();\r\n }\r\n}\r\n\r\nfunction scheduleTask(task: ConvertWebPTask) {\r\n tasks.push(task);\r\n /* if(task.payload.fileName.indexOf('main-') === 0) {\r\n tasks.push(task);\r\n } else {\r\n tasks.unshift(task);\r\n } */\r\n\r\n processTasks();\r\n}\r\n\r\nctx.addEventListener('message', (event) => {\r\n scheduleTask(event.data);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {WebPDecoder} from '../../vendor/libwebp-0.2.0';\r\nimport {encode} from 'fast-png';\r\n\r\nexport function webp2png(data: Uint8Array) {\r\n const decoder = new WebPDecoder();\r\n const config: any = decoder.WebPDecoderConfig;\r\n const buffer = config.j || config.output;\r\n const bitstream = config.input;\r\n\r\n decoder.WebPInitDecoderConfig(config);\r\n decoder.WebPGetFeatures(data, data.length, bitstream);\r\n\r\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\r\n buffer.J = 1;\r\n\r\n let status;\r\n try {\r\n status = decoder.WebPDecode(data, data.length, config);\r\n } catch(e) {\r\n status = e;\r\n }\r\n\r\n if(status === 0) {\r\n const rgbaData = buffer.Jb;\r\n const pngData = encode({\r\n data: rgbaData,\r\n width: buffer.width,\r\n height: buffer.height,\r\n channels: 4,\r\n depth: 8\r\n });\r\n\r\n return {status, bytes: pngData};\r\n }\r\n\r\n return {status, bytes: data};\r\n}\r\n\r\nexport function webp2pngAsBlob(data: Uint8Array) {\r\n const {status, bytes} = webp2png(data);\r\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\r\n}\r\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\":\"ae3638de6414621ea67b\",\"699\":\"f16d6f756c34f3914132\",\"866\":\"f6db8063094ac9670661\"}[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;","// 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","oldGetScript","oldLoadScript","queryMap","countMap","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","Map","has","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","set","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file diff --git a/public/641.44a7297520d91123114d.chunk.js b/public/641.44a7297520d91123114d.chunk.js new file mode 100644 index 000000000..c63a894ab --- /dev/null +++ b/public/641.44a7297520d91123114d.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";(()=>{if("undefined"!=typeof __webpack_require__){var e=__webpack_require__.u,t=__webpack_require__.e,r=new Map,i=new Map;__webpack_require__.u=function(t){return e(t)+(r.has(t)?"?"+r.get(t):"")},__webpack_require__.e=function(n){return t(n).catch((function(t){var o=i.has(n)?i.get(n):999999;if(o<1){var a=e(n);throw t.message="Loading chunk "+n+" failed after 999999 retries.\n("+a+")",t.request=a,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();r.set(n,t),i.set(n,o-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"),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;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]]],a=e=>Math.round(255*Math.min(Math.max(e,0),1));importScripts("rlottie-wasm.js");const s=self.Module;class h{constructor(e,t,r){this.reqId=e,this.width=t,this.height=r}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),f("loaded",this.reqId,this.frameCount,this.fps)}catch(e){console.error("init RLottieItem error:",e),f("error",this.reqId,e)}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{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=a(t[2])|a(t[1])<<8|a(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;s.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),f("error",e,r)}}))},destroy:function(e){const t=d[e];t&&(t.destroy(),delete d[e])},renderFrame:function(e,t,r){d[e].render(t,r)}};function f(...e){if(arguments.length<1)throw new TypeError("reply - not enough arguments");if(e=Array.prototype.slice.call(arguments,1),n){const t=[];for(let r=0;r {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","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","/*\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\r\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\r\nimport applyReplacements from './applyReplacements';\r\n\r\nimportScripts('rlottie-wasm.js');\r\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\r\n\r\nconst _Module = (self as any).Module as any;\r\n\r\nconst DEFAULT_FPS = 60;\r\n\r\ntype LottieHandlePointer = number;\r\n\r\n// throw new Error('test');\r\n\r\nexport class RLottieItem {\r\n private stringOnWasmHeap: number;\r\n private handle: LottieHandlePointer;\r\n private frameCount: number;\r\n private fps: number;\r\n\r\n private dead: boolean;\r\n // private context: OffscreenCanvasRenderingContext2D;\r\n\r\n constructor(\r\n private reqId: number,\r\n private width: number,\r\n private height: number/* ,\r\n private canvas: OffscreenCanvas */\r\n ) {\r\n\r\n }\r\n\r\n public init(json: string, fps: number) {\r\n if(this.dead) {\r\n return;\r\n }\r\n\r\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\r\n\r\n // this.context = canvas.getContext('2d');\r\n /* let frame = 0;\r\n setInterval(() => {\r\n if(frame >= this.frameCount) frame = 0;\r\n let _frame = frame++;\r\n this.render(_frame, null);\r\n }, 1000 / this.fps); */\r\n\r\n try {\r\n this.handle = worker.Api.init();\r\n\r\n // @ts-ignore\r\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\r\n\r\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\r\n\r\n worker.Api.resize(this.handle, this.width, this.height);\r\n\r\n reply('loaded', this.reqId, this.frameCount, this.fps);\r\n } catch(e) {\r\n console.error('init RLottieItem error:', e);\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\r\n if(this.dead || this.handle === undefined) return;\r\n // return;\r\n\r\n if(this.frameCount < frameNo || frameNo < 0) {\r\n return;\r\n }\r\n\r\n try {\r\n worker.Api.render(this.handle, frameNo);\r\n\r\n const bufferPointer = worker.Api.buffer(this.handle);\r\n\r\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\r\n\r\n if(!clamped) {\r\n clamped = new Uint8ClampedArray(data);\r\n } else {\r\n clamped.set(data);\r\n }\r\n\r\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\r\n\r\n reply('frame', this.reqId, frameNo, clamped);\r\n } catch(e) {\r\n console.error('Render error:', e);\r\n this.dead = true;\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.dead = true;\r\n\r\n if(this.handle !== undefined) {\r\n worker.Api.destroy(this.handle);\r\n }\r\n }\r\n}\r\n\r\nclass RLottieWorker {\r\n public Api: {\r\n init: () => LottieHandlePointer,\r\n destroy: (handle: LottieHandlePointer) => void,\r\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\r\n buffer: (handle: LottieHandlePointer) => number,\r\n render: (handle: LottieHandlePointer, frameNo: number) => void,\r\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\r\n } = {} as any;\r\n\r\n public initApi() {\r\n this.Api = {\r\n init: _Module.cwrap('lottie_init', '', []),\r\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\r\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\r\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\r\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\r\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number'])\r\n };\r\n }\r\n\r\n public init() {\r\n this.initApi();\r\n reply('ready');\r\n }\r\n}\r\n\r\nconst worker = new RLottieWorker();\r\n\r\n_Module.onRuntimeInitialized = function() {\r\n worker.init();\r\n};\r\n\r\nconst items: {[reqId: string]: RLottieItem} = {};\r\nconst queryableFunctions = {\r\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number/* , canvas: OffscreenCanvas */) {\r\n const item = items[reqId] = new RLottieItem(reqId, width, height/* , canvas */);\r\n readBlobAsText(blob).then((json) => {\r\n try {\r\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(json);\r\n applyReplacements(newAnimationData, toneIndex);\r\n json = JSON.stringify(newAnimationData);\r\n }\r\n\r\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\r\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\r\n throw new Error('Invalid file');\r\n } */\r\n\r\n /* let perf = performance.now();\r\n let json = JSON.parse(jsString);\r\n console.log('sticker decode:', performance.now() - perf); */\r\n\r\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\r\n const frameRate = +match?.[1] || DEFAULT_FPS;\r\n\r\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\r\n\r\n item.init(json, frameRate);\r\n } catch(err) {\r\n console.error('Invalid file for sticker:', json);\r\n reply('error', reqId, err);\r\n }\r\n });\r\n },\r\n destroy: function(reqId: number) {\r\n const item = items[reqId];\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.destroy();\r\n delete items[reqId];\r\n },\r\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\r\n // console.log('worker renderFrame', reqId, frameNo, clamped);\r\n items[reqId].render(frameNo, clamped);\r\n }\r\n};\r\n\r\nfunction reply(...args: any[]) {\r\n if(arguments.length < 1) {\r\n throw new TypeError('reply - not enough arguments');\r\n }\r\n\r\n // if(arguments[0] === 'frame') return;\r\n\r\n args = Array.prototype.slice.call(arguments, 1);\r\n\r\n if(!CAN_USE_TRANSFERABLES) {\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args});\r\n } else {\r\n const transfer: ArrayBuffer[] = [];\r\n for(let i = 0; i < args.length; ++i) {\r\n if(args[i] instanceof ArrayBuffer) {\r\n transfer.push(args[i]);\r\n }\r\n\r\n if(args[i].buffer && args[i].buffer instanceof ArrayBuffer) {\r\n transfer.push(args[i].buffer);\r\n }\r\n }\r\n\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args}, transfer);\r\n }\r\n}\r\n\r\nonmessage = function(e) {\r\n // @ts-ignore\r\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","Map","countMap","chunkId","has","get","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","set","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","console","render","frameNo","clamped","undefined","bufferPointer","buffer","data","HEAPU8","subarray","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","then","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","hasOwnProperty","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","arguments","length","TypeError","Array","prototype","slice","call","transfer","i","ArrayBuffer","push","postMessage","queryMethodListener","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/641.be55089deabe08a3e958.chunk.js b/public/641.be55089deabe08a3e958.chunk.js deleted file mode 100644 index 743777634..000000000 --- a/public/641.be55089deabe08a3e958.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";(()=>{if("undefined"!=typeof __webpack_require__){var e=__webpack_require__.u,t=__webpack_require__.e,r=new Map,i=new Map;__webpack_require__.u=function(t){return e(t)+(r.has(t)?"?"+r.get(t):"")},__webpack_require__.e=function(n){return t(n).catch((function(t){var o=i.has(n)?i.get(n):999999;if(o<1){var a=e(n);throw t.message="Loading chunk "+n+" failed after 999999 retries.\n("+a+")",t.request=a,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();r.set(n,t),i.set(n,o-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"),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;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]]];let a=e=>Math.round(255*Math.min(Math.max(e,0),1));importScripts("rlottie-wasm.js");const s=self.Module;class h{constructor(e,t,r){this.reqId=e,this.width=t,this.height=r}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),f("loaded",this.reqId,this.frameCount,this.fps)}catch(e){console.error("init RLottieItem error:",e),f("error",this.reqId,e)}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{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=a(t[2])|a(t[1])<<8|a(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;s.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),f("error",e,r)}}))},destroy:function(e){const t=d[e];t&&(t.destroy(),delete d[e])},renderFrame:function(e,t,r){d[e].render(t,r)}};function f(...e){if(arguments.length<1)throw new TypeError("reply - not enough arguments");if(e=Array.prototype.slice.call(arguments,1),n){const t=[];for(let r=0;r {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","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","/*\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\nlet convert = (value: number) => {\n\treturn 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\r\nimport readBlobAsText from \"../../helpers/blob/readBlobAsText\";\r\nimport applyReplacements from \"./applyReplacements\";\r\n\r\nimportScripts('rlottie-wasm.js');\r\n//import Module, { allocate, intArrayFromString } from './rlottie-wasm';\r\n\r\nconst _Module = (self as any).Module as any;\r\n\r\nconst DEFAULT_FPS = 60;\r\n\r\ntype LottieHandlePointer = number;\r\n\r\n// throw new Error('test');\r\n\r\nexport class RLottieItem {\r\n private stringOnWasmHeap: number;\r\n private handle: LottieHandlePointer;\r\n private frameCount: number;\r\n private fps: number;\r\n\r\n private dead: boolean;\r\n //private context: OffscreenCanvasRenderingContext2D;\r\n\r\n constructor(\r\n private reqId: number, \r\n private width: number, \r\n private height: number/* , \r\n private canvas: OffscreenCanvas */\r\n ) {\r\n\r\n }\r\n\r\n public init(json: string, fps: number) {\r\n if(this.dead) {\r\n return;\r\n }\r\n\r\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\r\n\r\n //this.context = canvas.getContext('2d');\r\n /* let frame = 0;\r\n setInterval(() => {\r\n if(frame >= this.frameCount) frame = 0;\r\n let _frame = frame++;\r\n this.render(_frame, null);\r\n }, 1000 / this.fps); */\r\n\r\n try {\r\n this.handle = worker.Api.init();\r\n \r\n // @ts-ignore\r\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\r\n \r\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\r\n \r\n worker.Api.resize(this.handle, this.width, this.height);\r\n\r\n reply('loaded', this.reqId, this.frameCount, this.fps);\r\n } catch(e) {\r\n console.error('init RLottieItem error:', e);\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\r\n if(this.dead || this.handle === undefined) return;\r\n //return;\r\n \r\n if(this.frameCount < frameNo || frameNo < 0) {\r\n return;\r\n }\r\n \r\n try {\r\n worker.Api.render(this.handle, frameNo);\r\n \r\n const bufferPointer = worker.Api.buffer(this.handle);\r\n \r\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\r\n \r\n if(!clamped) {\r\n clamped = new Uint8ClampedArray(data);\r\n } else {\r\n clamped.set(data);\r\n }\r\n\r\n //this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\r\n \r\n reply('frame', this.reqId, frameNo, clamped);\r\n } catch(e) {\r\n console.error('Render error:', e);\r\n this.dead = true;\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.dead = true;\r\n\r\n if(this.handle !== undefined) {\r\n worker.Api.destroy(this.handle);\r\n }\r\n }\r\n}\r\n\r\nclass RLottieWorker {\r\n public Api: {\r\n init: () => LottieHandlePointer,\r\n destroy: (handle: LottieHandlePointer) => void,\r\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\r\n buffer: (handle: LottieHandlePointer) => number,\r\n render: (handle: LottieHandlePointer, frameNo: number) => void,\r\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\r\n } = {} as any;\r\n\r\n public initApi() {\r\n this.Api = {\r\n init: _Module.cwrap('lottie_init', '', []),\r\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\r\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\r\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\r\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\r\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\r\n };\r\n }\r\n\r\n public init() {\r\n this.initApi();\r\n reply('ready');\r\n }\r\n}\r\n\r\nconst worker = new RLottieWorker();\r\n\r\n_Module.onRuntimeInitialized = function() {\r\n worker.init();\r\n};\r\n\r\nconst items: {[reqId: string]: RLottieItem} = {};\r\nconst queryableFunctions = {\r\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number/* , canvas: OffscreenCanvas */) {\r\n const item = items[reqId] = new RLottieItem(reqId, width, height/* , canvas */);\r\n readBlobAsText(blob).then((json) => {\r\n try {\r\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(json);\r\n applyReplacements(newAnimationData, toneIndex);\r\n json = JSON.stringify(newAnimationData);\r\n }\r\n\r\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\r\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\r\n throw new Error('Invalid file');\r\n } */\r\n\r\n /* let perf = performance.now();\r\n let json = JSON.parse(jsString);\r\n console.log('sticker decode:', performance.now() - perf); */\r\n\r\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\r\n const frameRate = +match?.[1] || DEFAULT_FPS;\r\n\r\n //console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\r\n\r\n item.init(json, frameRate);\r\n } catch(err) {\r\n console.error('Invalid file for sticker:', json);\r\n reply('error', reqId, err);\r\n }\r\n });\r\n },\r\n destroy: function(reqId: number) {\r\n const item = items[reqId];\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.destroy();\r\n delete items[reqId];\r\n },\r\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\r\n //console.log('worker renderFrame', reqId, frameNo, clamped);\r\n items[reqId].render(frameNo, clamped);\r\n }\r\n};\r\n\r\nfunction reply(...args: any[]) {\r\n if(arguments.length < 1) { \r\n throw new TypeError('reply - not enough arguments'); \r\n }\r\n\r\n //if(arguments[0] === 'frame') return;\r\n\r\n args = Array.prototype.slice.call(arguments, 1);\r\n\r\n if(!CAN_USE_TRANSFERABLES) {\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args});\r\n } else {\r\n const transfer: ArrayBuffer[] = [];\r\n for(let i = 0; i < args.length; ++i) {\r\n if(args[i] instanceof ArrayBuffer) {\r\n transfer.push(args[i]);\r\n }\r\n \r\n if(args[i].buffer && args[i].buffer instanceof ArrayBuffer) {\r\n transfer.push(args[i].buffer);\r\n }\r\n }\r\n\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args}, transfer);\r\n }\r\n}\r\n\r\nonmessage = function(e) {\r\n // @ts-ignore\r\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","Map","countMap","chunkId","has","get","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","set","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","console","render","frameNo","clamped","undefined","bufferPointer","buffer","data","HEAPU8","subarray","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","then","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","hasOwnProperty","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","arguments","length","TypeError","Array","prototype","slice","call","transfer","i","ArrayBuffer","push","postMessage","queryMethodListener","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/642.f2d4e67ea15d5329cd0b.chunk.js b/public/642.97f14a340993585fd1ff.chunk.js similarity index 98% rename from public/642.f2d4e67ea15d5329cd0b.chunk.js rename to public/642.97f14a340993585fd1ff.chunk.js index cb12fc8d5..0f59e754d 100644 --- a/public/642.f2d4e67ea15d5329cd0b.chunk.js +++ b/public/642.97f14a340993585fd1ff.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[642],{4642:(e,a,s)=>{s.r(a),s.d(a,{default:()=>f});const c="zero",r="one",t="two",n="few",u="many";function i(e,a){switch(e){case 27764:if(a%10==1&&(a%100<11||a%100>19))return r;if(a%10>=2&&a%10<=9&&(a%100<11||a%100>19))return n;break;case 27766:if(0==a)return c;if(a%10==1&&a%100!=11)return r;break;case 25465:if(2==a)return t;if(3==a)return n;if(0==a)return c;if(1==a)return r;if(6==a)return u;break;case 25189:case 25203:case 26738:case 29301:case 29544:case 29554:case 30059:if(a%10==1&&a%100!=11)return r;if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return n;if(a%10==0||a%10>=5&&a%10<=9||a%100>=11&&a%100<=14)return u;break;case 7041896:if(0==a)return c;if(1==a)return r;break;case 7563369:if(a>=2&&a<=10)return n;if(a>=0&&a<=1)return r;break;case 26725:if(2==a)return t;if(1==a)return r;if(0!=a&&a%10==0)return u;break;case 25459:case 29547:if(1==a)return r;if(a>=2&&a<=4)return n;break;case 25202:if(0!=a&&a%1e6==0)return u;if(a%10==1&&a%100!=11&&a%100!=71&&a%100!=91)return r;if(a%10==2&&a%100!=12&&a%100!=72&&a%100!=92)return t;if((a%10>=3&&a%10<=4||a%10==9)&&(a%100<10||a%100>19)&&(a%100<70||a%100>79)&&(a%100<90||a%100>99))return n;break;case 29548:if(a%100==2)return t;if(a%100==1)return r;if(a%100>=3&&a%100<=4)return n;break;case 7102823:if(0==a)return c;if(a>=0&&a<=2&&0!=a&&2!=a)return r;break;case 28780:if(1==a)return r;if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return n;if(1!=a&&a%10>=0&&a%10<=1||a%10>=5&&a%10<=9||a%100>=12&&a%100<=14)return u;break;case 26468:if(2==a||12==a)return t;if(1==a||11==a)return r;if(a>=3&&a<=10||a>=13&&a<=19)return n;break;case 26486:if(a%10>=1&&a%10<=2||a%20==0)return r;break;case 28011:if(a%10==1&&11!=a)return r;break;case 28020:if(1==a)return r;if(a%100>=11&&a%100<=19)return u;if(0==a||a%100>=2&&a%100<=10)return n;break;case 28015:case 29295:if(1==a)return r;if(0==a||1!=a&&a%100>=1&&a%100<=19)return n;break;case 26465:if(2==a)return t;if(1==a)return r;if(a>=3&&a<=6)return n;if(a>=7&&a<=10)return u;break;case 26214:case 26226:case 7037282:if(a>=0&&a<=2&&2!=a)return r;break;case 26997:case 27511:case 29541:case 7233905:case 7564641:case 7564649:case 7564650:case 7564654:case 7564659:if(2==a)return t;if(1==a)return r;break;case 24939:case 24941:case 25192:case 26729:case 27758:case 28007:case 29801:case 29804:case 30561:case 6711660:case 6780279:case 7238511:if(a>=0&&a<=1)return r;break;case 7633517:if(a>=0&&a<=1||a>=11&&a<=99)return r;break;case 24934:case 25191:case 25198:case 25441:case 25697:case 25701:case 25718:case 25957:case 25964:case 25966:case 25967:case 25971:case 25972:case 25973:case 26217:case 26223:case 26233:case 26476:case 26485:case 26721:case 26995:case 26996:case 27499:case 27500:case 27507:case 27509:case 27513:case 27746:case 27751:case 28012:case 28014:case 28018:case 28258:case 28260:case 28261:case 28268:case 28270:case 28271:case 28274:case 28281:case 28525:case 28530:case 28531:case 28769:case 28787:case 28788:case 29293:case 29550:case 29551:case 29553:case 29555:case 29556:case 29558:case 29559:case 29793:case 29797:case 29803:case 29806:case 29811:case 30066:case 30309:case 30319:case 30824:case 31349:case 6386529:case 6386548:case 6448493:case 6448506:case 6451832:case 6514535:case 6514802:case 6515554:case 6714738:case 6779767:case 6840695:case 6973295:case 6974819:case 7037290:case 7037799:case 7039850:case 7041890:case 7168371:case 7169903:case 7233896:case 7237224:case 7240046:case 7364976:case 7499622:case 7501675:case 7561585:case 7562600:case 7566201:case 7567730:case 7628143:case 7629159:case 7763310:case 7823717:case 7892839:if(1==a)return r;break;case 24946:if(2==a)return t;if(1==a)return r;if(0==a)return c;if(a%100>=3&&a%100<=10)return n;if(a%100>=11&&a%100<=99)return u}return"other"}const f={PluralRules:class{constructor(e){this.select=i.bind(null,function(e){let a=0;for(let s=0;s 19))) // n mod 10 is 1 and n mod 100 not in 11..19\r\n return NumberPluralizationFormOne;\r\n if((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set2\r\n case 0x6c76: // lv\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set3\r\n case 0x6379: // cy\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 3) // n is 3\r\n return NumberPluralizationFormFew;\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if(n == 6) // n is 6\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set4\r\n case 0x6265: // be\r\n case 0x6273: // bs\r\n case 0x6872: // hr\r\n case 0x7275: // ru\r\n case 0x7368: // sh\r\n case 0x7372: // sr\r\n case 0x756b: // uk\r\n if(((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n if((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if(((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set5\r\n case 0x6b7368: // ksh\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set6\r\n case 0x736869: // shi\r\n if((n >= 2 && n <= 10)) // n in 2..10\r\n return NumberPluralizationFormFew;\r\n if((n >= 0 && n <= 1)) // n within 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set7\r\n case 0x6865: // he\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set8\r\n case 0x6373: // cs\r\n case 0x736b: // sk\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((n >= 2 && n <= 4)) // n in 2..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set9\r\n case 0x6272: // br\r\n if((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\r\n return NumberPluralizationFormMany;\r\n if(((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\r\n return NumberPluralizationFormOne;\r\n if(((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\r\n return NumberPluralizationFormTwo;\r\n if((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set10\r\n case 0x736c: // sl\r\n if((n % 100) == 2) // n mod 100 is 2\r\n return NumberPluralizationFormTwo;\r\n if((n % 100) == 1) // n mod 100 is 1\r\n return NumberPluralizationFormOne;\r\n if(((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set11\r\n case 0x6c6167: // lag\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set12\r\n case 0x706c: // pl\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if(((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set13\r\n case 0x6764: // gd\r\n if((n == 2) || (n == 12)) // n in 2,12\r\n return NumberPluralizationFormTwo;\r\n if((n == 1) || (n == 11)) // n in 1,11\r\n return NumberPluralizationFormOne;\r\n if((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set14\r\n case 0x6776: // gv\r\n if((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set15\r\n case 0x6d6b: // mk\r\n if(((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set16\r\n case 0x6d74: // mt\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if(((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\r\n return NumberPluralizationFormMany;\r\n if((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set17\r\n case 0x6d6f: // mo\r\n case 0x726f: // ro\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n\r\n // set18\r\n case 0x6761: // ga\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if((n >= 3 && n <= 6)) // n in 3..6\r\n return NumberPluralizationFormFew;\r\n if((n >= 7 && n <= 10)) // n in 7..10\r\n return NumberPluralizationFormMany;\r\n break;\r\n\r\n // set19\r\n case 0x6666: // ff\r\n case 0x6672: // fr\r\n case 0x6b6162: // kab\r\n if(((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set20\r\n case 0x6975: // iuw\r\n case 0x6b77: // kw\r\n case 0x7365: // se\r\n case 0x6e6171: // naq\r\n case 0x736d61: // sma\r\n case 0x736d69: // smi\r\n case 0x736d6a: // smj\r\n case 0x736d6e: // smn\r\n case 0x736d73: // sms\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set21\r\n case 0x616b: // ak\r\n case 0x616d: // am\r\n case 0x6268: // bh\r\n case 0x6869: // hi\r\n case 0x6c6e: // ln\r\n case 0x6d67: // mg\r\n case 0x7469: // ti\r\n case 0x746c: // tl\r\n case 0x7761: // wa\r\n case 0x66696c: // fil\r\n case 0x677577: // guw\r\n case 0x6e736f: // nso\r\n if((n >= 0 && n <= 1)) // n in 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set22\r\n case 0x747a6d: // tzm\r\n if(((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set23\r\n case 0x6166: // af\r\n case 0x6267: // bg\r\n case 0x626e: // bn\r\n case 0x6361: // ca\r\n case 0x6461: // da\r\n case 0x6465: // de\r\n case 0x6476: // dv\r\n case 0x6565: // ee\r\n case 0x656c: // el\r\n case 0x656e: // en\r\n case 0x656f: // eo\r\n case 0x6573: // es\r\n case 0x6574: // et\r\n case 0x6575: // eu\r\n case 0x6669: // fi\r\n case 0x666f: // fo\r\n case 0x6679: // fy\r\n case 0x676c: // gl\r\n case 0x6775: // gu\r\n case 0x6861: // ha\r\n case 0x6973: // is\r\n case 0x6974: // it\r\n case 0x6b6b: // kk\r\n case 0x6b6c: // kl\r\n case 0x6b73: // ks\r\n case 0x6b75: // ku\r\n case 0x6b79: // ky\r\n case 0x6c62: // lb\r\n case 0x6c67: // lg\r\n case 0x6d6c: // ml\r\n case 0x6d6e: // mn\r\n case 0x6d72: // mr\r\n case 0x6e62: // nb\r\n case 0x6e64: // nd\r\n case 0x6e65: // ne\r\n case 0x6e6c: // nl\r\n case 0x6e6e: // nn\r\n case 0x6e6f: // no\r\n case 0x6e72: // nr\r\n case 0x6e79: // ny\r\n case 0x6f6d: // om\r\n case 0x6f72: // or\r\n case 0x6f73: // os\r\n case 0x7061: // pa\r\n case 0x7073: // ps\r\n case 0x7074: // pt\r\n case 0x726d: // rm\r\n case 0x736e: // sn\r\n case 0x736f: // so\r\n case 0x7371: // sq\r\n case 0x7373: // ss\r\n case 0x7374: // st\r\n case 0x7376: // sv\r\n case 0x7377: // sw\r\n case 0x7461: // ta\r\n case 0x7465: // te\r\n case 0x746b: // tk\r\n case 0x746e: // tn\r\n case 0x7473: // ts\r\n case 0x7572: // ur\r\n case 0x7665: // ve\r\n case 0x766f: // vo\r\n case 0x7868: // xh\r\n case 0x7a75: // zu\r\n case 0x617361: // asa\r\n case 0x617374: // ast\r\n case 0x62656d: // bem\r\n case 0x62657a: // bez\r\n case 0x627278: // brx\r\n case 0x636767: // cgg\r\n case 0x636872: // chr\r\n case 0x636b62: // ckb\r\n case 0x667572: // fur\r\n case 0x677377: // gsw\r\n case 0x686177: // haw\r\n case 0x6a676f: // jgo\r\n case 0x6a6d63: // jmc\r\n case 0x6b616a: // kaj\r\n case 0x6b6367: // kcg\r\n case 0x6b6b6a: // kkj\r\n case 0x6b7362: // ksb\r\n case 0x6d6173: // mas\r\n case 0x6d676f: // mgo\r\n case 0x6e6168: // nah\r\n case 0x6e6e68: // nnh\r\n case 0x6e796e: // nyn\r\n case 0x706170: // pap\r\n case 0x726f66: // rof\r\n case 0x72776b: // rwk\r\n case 0x736171: // saq\r\n case 0x736568: // seh\r\n case 0x737379: // ssy\r\n case 0x737972: // syr\r\n case 0x74656f: // teo\r\n case 0x746967: // tig\r\n case 0x76756e: // vun\r\n case 0x776165: // wae\r\n case 0x786f67: // xog\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n\r\n // set24\r\n case 0x6172: // ar\r\n if(n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if(n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if(n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if(((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\r\n return NumberPluralizationFormFew;\r\n if(((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\r\n return NumberPluralizationFormMany;\r\n break;\r\n }\r\n\r\n return NumberPluralizationFormOther;\r\n}\r\n\r\n\r\nfunction languageCodehash(code: string) {\r\n let lc = 0;\r\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\r\n return lc;\r\n}\r\n\r\nconst Intl = {\r\n PluralRules: class {\r\n public select: (n: number) => Intl.LDMLPluralRule;\r\n\r\n constructor(code: string) {\r\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\r\n }\r\n }\r\n};\r\n\r\nexport default Intl;\r\n"],"names":["NumberPluralizationFormZero","NumberPluralizationFormOne","NumberPluralizationFormTwo","NumberPluralizationFormFew","NumberPluralizationFormMany","numberPluralizationForm","lc","n","PluralRules","constructor","code","this","select","bind","i","length","charCodeAt","languageCodehash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/642.f2d4e67ea15d5329cd0b.chunk.js.map b/public/642.f2d4e67ea15d5329cd0b.chunk.js.map deleted file mode 100644 index c2597b0ce..000000000 --- a/public/642.f2d4e67ea15d5329cd0b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"642.f2d4e67ea15d5329cd0b.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lib/pluralPolyfill.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nconst NumberPluralizationFormZero: Intl.LDMLPluralRule = 'zero';\r\nconst NumberPluralizationFormOne: Intl.LDMLPluralRule = 'one';\r\nconst NumberPluralizationFormTwo: Intl.LDMLPluralRule = 'two';\r\nconst NumberPluralizationFormFew: Intl.LDMLPluralRule = 'few';\r\nconst NumberPluralizationFormMany: Intl.LDMLPluralRule = 'many';\r\nconst NumberPluralizationFormOther: Intl.LDMLPluralRule = 'other';\r\n\r\nfunction numberPluralizationForm(lc: number, n: number): Intl.LDMLPluralRule {\r\n switch (lc) {\r\n \r\n // set1\r\n case 0x6c74: // lt\r\n if (((n % 10) == 1) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 is 1 and n mod 100 not in 11..19\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set2\r\n case 0x6c76: // lv\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set3\r\n case 0x6379: // cy\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 3) // n is 3\r\n return NumberPluralizationFormFew;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 6) // n is 6\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set4\r\n case 0x6265: // be\r\n case 0x6273: // bs\r\n case 0x6872: // hr\r\n case 0x7275: // ru\r\n case 0x7368: // sh\r\n case 0x7372: // sr\r\n case 0x756b: // uk\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set5\r\n case 0x6b7368: // ksh\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set6\r\n case 0x736869: // shi\r\n if ((n >= 2 && n <= 10)) // n in 2..10\r\n return NumberPluralizationFormFew;\r\n if ((n >= 0 && n <= 1)) // n within 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set7\r\n case 0x6865: // he\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set8\r\n case 0x6373: // cs\r\n case 0x736b: // sk\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 2 && n <= 4)) // n in 2..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set9\r\n case 0x6272: // br\r\n if ((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\r\n return NumberPluralizationFormMany;\r\n if (((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\r\n return NumberPluralizationFormOne;\r\n if (((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\r\n return NumberPluralizationFormTwo;\r\n if ((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set10\r\n case 0x736c: // sl\r\n if ((n % 100) == 2) // n mod 100 is 2\r\n return NumberPluralizationFormTwo;\r\n if ((n % 100) == 1) // n mod 100 is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set11\r\n case 0x6c6167: // lag\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set12\r\n case 0x706c: // pl\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set13\r\n case 0x6764: // gd\r\n if ((n == 2) || (n == 12)) // n in 2,12\r\n return NumberPluralizationFormTwo;\r\n if ((n == 1) || (n == 11)) // n in 1,11\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set14\r\n case 0x6776: // gv\r\n if ((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set15\r\n case 0x6d6b: // mk\r\n if (((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set16\r\n case 0x6d74: // mt\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\r\n return NumberPluralizationFormMany;\r\n if ((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set17\r\n case 0x6d6f: // mo\r\n case 0x726f: // ro\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set18\r\n case 0x6761: // ga\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 6)) // n in 3..6\r\n return NumberPluralizationFormFew;\r\n if ((n >= 7 && n <= 10)) // n in 7..10\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set19\r\n case 0x6666: // ff\r\n case 0x6672: // fr\r\n case 0x6b6162: // kab\r\n if (((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set20\r\n case 0x6975: // iuw\r\n case 0x6b77: // kw\r\n case 0x7365: // se\r\n case 0x6e6171: // naq\r\n case 0x736d61: // sma\r\n case 0x736d69: // smi\r\n case 0x736d6a: // smj\r\n case 0x736d6e: // smn\r\n case 0x736d73: // sms\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set21\r\n case 0x616b: // ak\r\n case 0x616d: // am\r\n case 0x6268: // bh\r\n case 0x6869: // hi\r\n case 0x6c6e: // ln\r\n case 0x6d67: // mg\r\n case 0x7469: // ti\r\n case 0x746c: // tl\r\n case 0x7761: // wa\r\n case 0x66696c: // fil\r\n case 0x677577: // guw\r\n case 0x6e736f: // nso\r\n if ((n >= 0 && n <= 1)) // n in 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set22\r\n case 0x747a6d: // tzm\r\n if (((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set23\r\n case 0x6166: // af\r\n case 0x6267: // bg\r\n case 0x626e: // bn\r\n case 0x6361: // ca\r\n case 0x6461: // da\r\n case 0x6465: // de\r\n case 0x6476: // dv\r\n case 0x6565: // ee\r\n case 0x656c: // el\r\n case 0x656e: // en\r\n case 0x656f: // eo\r\n case 0x6573: // es\r\n case 0x6574: // et\r\n case 0x6575: // eu\r\n case 0x6669: // fi\r\n case 0x666f: // fo\r\n case 0x6679: // fy\r\n case 0x676c: // gl\r\n case 0x6775: // gu\r\n case 0x6861: // ha\r\n case 0x6973: // is\r\n case 0x6974: // it\r\n case 0x6b6b: // kk\r\n case 0x6b6c: // kl\r\n case 0x6b73: // ks\r\n case 0x6b75: // ku\r\n case 0x6b79: // ky\r\n case 0x6c62: // lb\r\n case 0x6c67: // lg\r\n case 0x6d6c: // ml\r\n case 0x6d6e: // mn\r\n case 0x6d72: // mr\r\n case 0x6e62: // nb\r\n case 0x6e64: // nd\r\n case 0x6e65: // ne\r\n case 0x6e6c: // nl\r\n case 0x6e6e: // nn\r\n case 0x6e6f: // no\r\n case 0x6e72: // nr\r\n case 0x6e79: // ny\r\n case 0x6f6d: // om\r\n case 0x6f72: // or\r\n case 0x6f73: // os\r\n case 0x7061: // pa\r\n case 0x7073: // ps\r\n case 0x7074: // pt\r\n case 0x726d: // rm\r\n case 0x736e: // sn\r\n case 0x736f: // so\r\n case 0x7371: // sq\r\n case 0x7373: // ss\r\n case 0x7374: // st\r\n case 0x7376: // sv\r\n case 0x7377: // sw\r\n case 0x7461: // ta\r\n case 0x7465: // te\r\n case 0x746b: // tk\r\n case 0x746e: // tn\r\n case 0x7473: // ts\r\n case 0x7572: // ur\r\n case 0x7665: // ve\r\n case 0x766f: // vo\r\n case 0x7868: // xh\r\n case 0x7a75: // zu\r\n case 0x617361: // asa\r\n case 0x617374: // ast\r\n case 0x62656d: // bem\r\n case 0x62657a: // bez\r\n case 0x627278: // brx\r\n case 0x636767: // cgg\r\n case 0x636872: // chr\r\n case 0x636b62: // ckb\r\n case 0x667572: // fur\r\n case 0x677377: // gsw\r\n case 0x686177: // haw\r\n case 0x6a676f: // jgo\r\n case 0x6a6d63: // jmc\r\n case 0x6b616a: // kaj\r\n case 0x6b6367: // kcg\r\n case 0x6b6b6a: // kkj\r\n case 0x6b7362: // ksb\r\n case 0x6d6173: // mas\r\n case 0x6d676f: // mgo\r\n case 0x6e6168: // nah\r\n case 0x6e6e68: // nnh\r\n case 0x6e796e: // nyn\r\n case 0x706170: // pap\r\n case 0x726f66: // rof\r\n case 0x72776b: // rwk\r\n case 0x736171: // saq\r\n case 0x736568: // seh\r\n case 0x737379: // ssy\r\n case 0x737972: // syr\r\n case 0x74656f: // teo\r\n case 0x746967: // tig\r\n case 0x76756e: // vun\r\n case 0x776165: // wae\r\n case 0x786f67: // xog\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set24\r\n case 0x6172: // ar\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\r\n return NumberPluralizationFormFew;\r\n if (((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\r\n return NumberPluralizationFormMany;\r\n break;\r\n }\r\n \r\n return NumberPluralizationFormOther;\r\n}\r\n\r\n\r\nfunction languageCodehash(code: string) {\r\n let lc = 0;\r\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\r\n return lc;\r\n}\r\n\r\nconst Intl = {\r\n PluralRules: class {\r\n public select: (n: number) => Intl.LDMLPluralRule;\r\n\r\n constructor(code: string) {\r\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\r\n }\r\n }\r\n};\r\n\r\nexport default Intl;\r\n"],"names":["NumberPluralizationFormZero","NumberPluralizationFormOne","NumberPluralizationFormTwo","NumberPluralizationFormFew","NumberPluralizationFormMany","numberPluralizationForm","lc","n","PluralRules","constructor","code","this","select","bind","i","length","charCodeAt","languageCodehash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/661.93c62f6378053baa4749.chunk.js b/public/661.93c62f6378053baa4749.chunk.js new file mode 100644 index 000000000..f7c6f993c --- /dev/null +++ b/public/661.93c62f6378053baa4749.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[661],{5814:(f,e,d)=>{d.d(e,{Z:()=>b});var t=d(3512),i=d(4762),a=d(410),s=d(8487),n=d(3772),c=d(1655),o=d(7625),r=d(2586),h=d(3013);const l=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver((f=>{for(const e of f){const f=e.target;for(const d in this.byGroups){if(this.intersectionLockedGroups[d])continue;const t=this.byGroups[d].find((e=>e.el===f));if(t){if(e.isIntersecting)this.visible.add(t),this.checkAnimation(t,!1);else{this.visible.delete(t),this.checkAnimation(t,!0);const f=t.animation;f instanceof n.Z&&f.clearCache()}break}}}})),this.overrideIdleGroups=new Set,h.Z.addEventListener("play",(({doc:f})=>{"round"===f.type&&(this.videosLocked=!0,this.checkAnimations())})),h.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})),r.Z.addEventListener("change",(f=>{this.checkAnimations(f)}))}setOverrideIdleGroup(f,e){e?this.overrideIdleGroups.add(f):this.overrideIdleGroups.delete(f)}getAnimations(f){const e=[];for(const d in this.byGroups)for(const t of this.byGroups[d])t.el===f&&e.push(t);return e}removeAnimation(f){const{el:e,animation:d}=f;d.remove(),d instanceof HTMLVideoElement&&i.IS_SAFARI&&setTimeout((()=>{d.src="",d.load()}),1e3);const t=this.byGroups[f.group];t&&((0,c.Z)(t,f),t.length||delete this.byGroups[f.group]),this.observer.unobserve(e),this.visible.delete(f)}addAnimation(f,e=""){var d,i,a;const s={el:f instanceof n.Z?f.el:f,animation:f,group:e};f instanceof n.Z&&!t.Z.settings.stickers.loop&&f.loop&&(f.loop=t.Z.settings.stickers.loop),(null!==(d=(i=this.byGroups)[a=e])&&void 0!==d?d:i[a]=[]).push(s),this.observer.observe(s.el)}checkAnimations(f,e,d=!1){if(void 0!==e&&!this.byGroups[e])return;const t=void 0!==e?[e]:Object.keys(this.byGroups);for(const e of t){const t=this.byGroups[e];(0,o.Z)(t,(e=>{this.checkAnimation(e,f,d)}))}}checkAnimation(f,e=!1,d=!1){const{el:t,animation:i,group:a}=f;d||!(0,s.Z)(t)&&!this.lockedGroups[a]?this.removeAnimation(f):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||i instanceof HTMLVideoElement&&this.videosLocked?i.paused||i.pause():!(i.paused&&this.visible.has(f)&&i.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||r.Z.isIdle&&!this.overrideIdleGroups.has(f.group)||i.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(f=""){this.onlyOnePlayableGroup=f}lockGroup(f){this.lockedGroups[f]=!0}unlockGroup(f){delete this.lockedGroups[f],this.checkAnimations(void 0,f)}refreshGroup(f){const e=this.byGroups[f];e&&e.length&&(e.forEach((f=>{this.observer.unobserve(f.el)})),window.requestAnimationFrame((()=>{e.forEach((f=>{this.observer.observe(f.el)}))})))}lockIntersectionGroup(f){this.intersectionLockedGroups[f]=!0}unlockIntersectionGroup(f){delete this.intersectionLockedGroups[f],this.refreshGroup(f)}};a.GO&&(a.GO.animationIntersector=l);const b=l},3013:(f,e,d)=>{d.d(e,{Z:()=>M});var t=d(3512),i=d(3725),a=d(4762),s=d(410),n=d(6669),c=d(5432),o=d(2325),r=d(3719),h=d(8479),l=d(6848),b=d(3699),u=d(7530),p=d(493),m=d(7309),g=d(925),v=d(3241),y=function(f,e,d,t){return new(d||(d=Promise))((function(i,a){function s(f){try{c(t.next(f))}catch(f){a(f)}}function n(f){try{c(t.throw(f))}catch(f){a(f)}}function c(f){var e;f.done?i(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(s,n)}c((t=t.apply(f,e||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(f){return!1}})();class k extends v.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=(f,e=this.playingMedia)=>{e&&(e.currentTime=Math.max(0,e.currentTime-(f.seekOffset||10)))},this.seekForward=(f,e=this.playingMedia)=>{e&&(e.currentTime=Math.min(e.duration,e.currentTime+(f.seekOffset||10)))},this.seekTo=(f,e=this.playingMedia)=>{e&&(e.currentTime=f.seekTime)},this.onMediaDocumentLoad=f=>y(this,void 0,void 0,(function*(){const e=this.mediaDetails.get(f),d=yield this.managers.appDocsManager.getDoc(e.docId);"audio"===d.type&&d.supportsStreaming&&w&&this.handleSafariStreamable(f);const t=yield this.managers.thumbsStorage.getCacheContext(d);f.src=t.url,this.playingMedia===f&&(f.playbackRate=this.playbackRate,"audio"===d.type&&(f.loop=this.loop));const i=this.waitingDocumentsForLoad[d.id];i&&(i.delete(f),i.size||delete this.waitingDocumentsForLoad[d.id])})),this.onPlay=f=>{const e=f.target,d=this.mediaDetails.get(e),{peerId:t,mid:i}=d,a=this.pip;a&&a.pause();const s=this.getMessageByMedia(e);if(this.playingMedia!==e){this.stop(),this.setMedia(e,s);const f=f=>f.mid===i&&f.peerId===t,d=this.listLoader,a=d.getCurrent();if(!a||!f(a)){let e;for(const t of[!1,!0]){const i=d.getPrevious(t);let a=i.findIndex(f);if(-1!==a?e=-(i.length-a):(a=d.getNext(t).findIndex(f),-1!==a&&(e=a+1)),void 0!==e)break}e?this.go(e,!1):this.setTargets({peerId:t,mid:i})}}setTimeout((()=>{this.playingMedia===e&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=f=>{this.dispatchEvent("pause")},this.onEnded=f=>{if(!f.isTrusted)return;this.onPause(f);const e=this.listLoader;!this.lockedSwitchers&&(this.round||!e.current||e.next.length)&&e.getNext(!0).length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(f=this.playingMedia)=>{if(!f)return!1;if(f.paused||f.pause(),f.currentTime=0,(0,n.Z)(f,"ended"),f===this.playingMedia){const e=this.mediaDetails.get(f);if(null==e?void 0:e.clean){f.src="";const d=e.peerId,t=e.isScheduled?this.scheduled:this.media,i=t.get(d);i&&(i.delete(e.mid),i.size||t.delete(d)),f.remove(),this.mediaDetails.delete(f)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=f=>{const{peerId:e,mid:d}=f,t=this.searchContext.isScheduled;this.getMedia(e,d,t).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(e,d,t)}),0)},this.go=(f,e)=>{const d=this.listLoader;if(!this.lockedSwitchers&&d)return"audio"===this.playingMediaType?d.goRound(f,e):d.go(f,e)},this.browserPlay=this.bindBrowserCallback((f=>this.toggle(!0,f))),this.browserPause=this.bindBrowserCallback((f=>this.toggle(!1,f))),this.browserStop=this.bindBrowserCallback((f=>this.stop(f))),this.browserSeekBackward=this.bindBrowserCallback(((f,e)=>this.seekBackward(e,f))),this.browserSeekForward=this.bindBrowserCallback(((f,e)=>this.seekForward(e,f))),this.browserSeekTo=this.bindBrowserCallback(((f,e)=>this.seekTo(e,f))),this.browserNext=this.bindBrowserCallback((f=>f||this.next())),this.browserPrevious=this.bindBrowserCallback((f=>f?this.seekToStart(f):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(f){if(this.managers=f,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const f={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 e in f)try{navigator.mediaSession.setActionHandler(e,f[e])}catch(f){console.warn("MediaSession action is not supported:",e)}}t.Z.addEventListener("document_downloaded",(f=>{const e=this.waitingDocumentsForLoad[f];if(e)for(const f of e)this.onMediaDocumentLoad(f)})),t.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const e={};["volume","muted","playbackRate","loop","round"].forEach((f=>{const d="_"+f;e[f]={get:()=>this[d],set:e=>{this[d]!==e&&(this[d]=e,!this.playingMedia||"loop"===f&&"audio"!==this.playingMediaType||"round"===f||(this.playingMedia[f]=e),"playbackRate"===f&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=e),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,e)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:f,muted:e,playbackRate:d,playbackRates:t,loop:i,round:a}=this;return{volume:f,muted:e,playbackRate:d,playbackRates:t,loop:i,round:a}}setPlaybackParams(f){this.playbackRates=f.playbackRates,this._volume=f.volume,this._muted=f.muted,this._playbackRate=f.playbackRate,this._loop=f.loop,this._round=f.round}addMedia(f,e,d){const{peerId:a,mid:s}=f,n=f.pFlags.is_scheduled?this.scheduled:this.media;let c=n.get(f.peerId);c||n.set(f.peerId,c=new Map);let o=c.get(s);if(o)return o;const r=(0,u.Z)(f);c.set(s,o=document.createElement("round"===r.type||"video"===r.type?"video":"audio")),"round"===r.type&&o.setAttribute("playsinline","true");const h={peerId:a,mid:s,docId:r.id,doc:r,message:f,clean:d,isScheduled:f.pFlags.is_scheduled};this.mediaDetails.set(o,h),o.volume=1,this.container.append(o),o.addEventListener("play",this.onPlay),o.addEventListener("pause",this.onPause),o.addEventListener("ended",this.onEnded),"audio"!==r.type&&(null==f?void 0:f.pFlags.media_unread)&&f.fromId!==t.Z.myId&&o.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[s])}),{once:!0});const l=(0,i.Z)();if(e)l.resolve();else{const e=f.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let d=e.get(a);d||e.set(a,d=new Map),d.set(s,l)}return l.then((()=>y(this,void 0,void 0,(function*(){if(r.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(r)).url)this.onMediaDocumentLoad(o);else{let f=this.waitingDocumentsForLoad[r.id];f||(f=this.waitingDocumentsForLoad[r.id]=new Set),f.add(o),m.Z.downloadMediaURL({media:r})}})))),o}getMedia(f,e,d){const t=(d?this.scheduled:this.media).get(f);return null==t?void 0:t.get(e)}handleSafariStreamable(f){f.addEventListener("play",(()=>{const e=f.currentTime;f.addEventListener("progress",(()=>{f.currentTime=f.duration-1,f.addEventListener("progress",(()=>{f.currentTime=e,f.paused||f.play()}),{once:!0})}),{once:!0})}))}resolveWaitingForLoadMedia(f,e,d){const t=d?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,i=t.get(f);if(!i)return;const a=i.get(e);a&&(a.resolve(),i.delete(e),i.size||t.delete(f))}isSafariBuffering(f){return!!f.safariBuffering}setSafariBuffering(f,e){f.safariBuffering=e}setNewMediadata(f,e=this.playingMedia){var d,t;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,g.Z)(e,void 0,!1);const i=(0,u.Z)(f),s=[],n="voice"===i.type||"round"===i.type;let r="",h="";if(null===(d=i.thumbs)||void 0===d?void 0:d.length){const d=i.thumbs[i.thumbs.length-1];if(!d.bytes){const t=yield this.managers.thumbsStorage.getCacheContext(i,d.type);t.url?s.push({src:t.url,sizes:`${d.w}x${d.h}`,type:"image/jpeg"}):m.Z.downloadMediaURL({media:i,thumb:d}).then((()=>{this.playingMedia===e&&t.url&&this.setNewMediadata(f)}))}}else if(n){const e=f.fromId||f.peerId;yield this.managers.appPeersManager.getPeerPhoto(e),r=yield(0,p.Z)(e,!0,!1),h=o.ZP.format("voice"===i.type?"AttachAudio":"AttachRound",!0)}if(!n){const f=i.attributes.find((f=>"documentAttributeAudio"===f._));r=null!==(t=null==f?void 0:f.title)&&void 0!==t?t:i.file_name,h=null==f?void 0:f.performer}s.length||(a.IS_APPLE?c.Z?s.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):s.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach((f=>{const e=`${f}x${f}`;s.push({src:`assets/img/android-chrome-${e}.png`,sizes:e,type:"image/png"})})));const l=new MediaMetadata({title:r,artist:h,artwork:s});navigator.mediaSession.metadata=l}))}setCurrentMediadata(){const{playingMedia:f}=this;if(!f)return;const e=this.getMessageByMedia(f);this.setNewMediadata(e,f)}getMessageByMedia(f){return this.mediaDetails.get(f).message}getPlayingDetails(){const{playingMedia:f}=this;if(!f)return;const e=this.getMessageByMedia(f);return{doc:(0,u.Z)(e),message:e,media:f,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,t.Z.dispatchEvent("media_play")}toggle(f,e=this.playingMedia){return!!e&&(void 0===f&&(f=e.paused),e.paused===f&&(f?e.play():e.pause(),!0))}bindBrowserCallback(f){return e=>{f(this.pip,e)}}seekToStart(f){return(null==f?void 0:f.currentTime)>5&&(f.currentTime=0,this.toggle(!0,f),!0)}willBePlayed(f){this.willBePlayedMedia=f}setSearchContext(f){return!(0,l.Z)(this.searchContext,f)&&(this.searchContext=(0,h.Z)(f),!0)}getSearchContext(){return this.searchContext}setTargets(f,e,d){let t=this.listLoader;t?t.reset():t=this.listLoader=new r.Z({loadCount:10,loadWhenLeft:5,processItem:f=>(this.addMedia(f,!1),{peerId:f.peerId,mid:f.mid}),onJump:(f,e)=>{this.playItem(f)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const i=void 0===this.searchContext.folderId;e?t.setTargets(e,d,i):t.reverse=i,t.setSearchContext(this.searchContext),t.current=f,t.load(!0),t.load(!1)}getPlaybackMediaTypeFromMessage(f){const e=(0,u.Z)(f);let d="audio";return(null==e?void 0:e.type)&&("voice"===e.type||"round"===e.type?d="voice":"video"===e.type&&(d="video")),d}setMedia(f,e){const d=this.getPlaybackMediaTypeFromMessage(e);this._playbackRate=this.playbackRates[d],this.playingMedia=f,this.playingMediaType=d,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===d&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(e)}setSingleMedia(f,e){const d=this.playingMedia,t=this.pause();let i;return f?(i=()=>{const f=this.pip;f&&f.pause(),this.pauseMediaInOtherTabs()},f.paused||i(),f.addEventListener("play",i)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),f?this.setMedia(f,e):this.playingMedia=void 0,this.toggleSwitchers(!1),(e=t)=>{this.toggleSwitchers(!0),d&&(this.mediaDetails.get(d)?this.setMedia(d,this.getMessageByMedia(d)):this.next()||this.previous()),this.playingMedia===f&&(this.playingMedia=void 0,this.playingMediaType=void 0),f&&f.removeEventListener("play",i),e&&this.play()}}toggleSwitchers(f){this.lockedSwitchers=!f}setPictureInPicture(f){this.pip=f;const e=new b.Z;e.add(f)("leavepictureinpicture",(()=>{this.pip===f&&(this.pip=void 0,e.removeAll())}),{once:!0}),e.add(f)("play",(e=>{this.playingMedia!==f&&this.pause(),this.pauseMediaInOtherTabs()}))}}const L=new k;s.GO.appMediaPlaybackController=L;const M=L},6008:(f,e,d)=>{d.d(e,{X:()=>r});var t=d(426),i=d(3512),a=d(3035),s=d(4789),n=d(5975),c=d(2648),o=d(2738);function r(f,e,d,r,h=250,l,b){const u=(0,t.v)(e,f||"tabs"===e.dataset.animation?"tabs":"navigation",h,r,void 0,b);if(!f)return u;const p=new Proxy(u,{apply:(e,d,t)=>{const i=+t[0],a=void 0===t[1]||t[1],s=f.querySelector(`[data-tab="${i}"]`)||f.children[i];m(s,i,a)}}),m=(t,n,c=!0)=>{return o=this,r=void 0,p=function*(){const o=e.children[n];if(d){const f=d(n,o,c),e=f instanceof Promise?yield f:f;if(void 0!==e&&!e)return}l&&l.scrollIntoViewNew({element:t.parentElement.children[n],position:"center",forceDirection:c?void 0:s.f.Static,forceDuration:h,axis:"x"}),i.Z.settings.animationsEnabled||(c=!1);const r=u.prevId();if(t.classList.contains("active")||n===r)return!1;const b=c?a.T2:f=>f(),p=f.querySelector(v.toLowerCase()+".active");p&&b((()=>{p.classList.remove("active")})),g&&-1!==r&&c&&b((()=>{const f=t.querySelector("i"),e=t.parentElement.children[r].querySelector("i");e.classList.remove("animate"),f.classList.remove("animate");const d=e.parentElement.parentElement.offsetLeft-f.parentElement.parentElement.offsetLeft,i=e.clientWidth/f.clientWidth;f.style.transform=`translate3d(${d}px, 0, 0) scale3d(${i}, 1, 1)`,(0,a.T2)((()=>{f.classList.add("animate"),f.style.transform="none"}))})),b((()=>{t.classList.add("active")})),u(n,c)},new((b=void 0)||(b=Promise))((function(f,e){function d(f){try{i(p.next(f))}catch(f){e(f)}}function t(f){try{i(p.throw(f))}catch(f){e(f)}}function i(e){var i;e.done?f(e.value):(i=e.value,i instanceof b?i:new b((function(f){f(i)}))).then(d,t)}i((p=p.apply(o,r||[])).next())}));var o,r,b,p},g=!f.classList.contains("no-stripe"),v=f.firstElementChild.tagName;return(0,o.fc)(f,(e=>{let d,t=e.target;if(t=(0,n.Z)(t,f),!t)return!1;if(t.dataset.tab){if(d=+t.dataset.tab,-1===d)return!1}else d=(0,c.Z)(t);m(t,d)}),{listenerSetter:b}),p}},426:(f,e,d)=>{d.d(e,{v:()=>r});var t=d(3512),i=d(3725),a=d(8594),s=d(2648),n=d(3910);function c(f,e,d){const t=e.getBoundingClientRect().width,i=[f,e];return d&&i.reverse(),i[0].style.filter="brightness(80%)",i[0].style.transform=`translate3d(${.25*-t}px, 0, 0)`,i[1].style.transform=`translate3d(${t}px, 0, 0)`,f.classList.add("active"),f.offsetWidth,f.style.transform="",f.style.filter="",()=>{e.style.transform=e.style.filter=""}}function o(f,e,d){const t=e.getBoundingClientRect().width,i=[f,e];return d&&i.reverse(),i[0].style.transform=`translate3d(${-t}px, 0, 0)`,i[1].style.transform=`translate3d(${t}px, 0, 0)`,f.classList.add("active"),f.offsetWidth,f.style.transform="",()=>{e.style.transform=""}}const r=(f,e,d,t,i=!0,a)=>{let s=null;switch(e){case"tabs":s=o;break;case"navigation":s=c}return f.dataset.animation=e,h(f,s,d,t,i,void 0,void 0,a)},h=(f,e,d,c,o=!0,r=!1,h=!0,l)=>{const b=new Map;let u,p=null;if(h){const d=e?"transitionend":"animationend",t=e=>{if((0,n.Z)(e),e.target.parentElement!==f)return;const i=b.get(e.target);null==i||i(),e.target===p&&(!u&&o||(u&&(u.resolve(),u=void 0),c&&c(m.prevId()),f.classList.remove("animating","backwards","disable-hover"),r&&(l?l.removeManual(f,d,t):f.removeEventListener(d,t),p=u=void 0,b.clear())))};l?l.add(f)(d,t):f.addEventListener(d,t)}function m(n,r=!0,l){l&&(p=l),n instanceof HTMLElement&&(n=(0,s.Z)(n));const g=m.prevId();if(n===g)return!1;const v=f.children[n];if(t.Z.settings.animationsEnabled&&-1!==g||(r=!1),!h){const e=f.dataset.timeout;void 0!==e&&clearTimeout(+e),delete f.dataset.timeout}if(!r){if(p)p.classList.remove("active","to","from");else if(v){const f=b.get(v);null==f||f()}return v&&(v.classList.remove("to","from"),v.classList.add("active")),f.classList.remove("animating","backwards","disable-hover"),p=v,void(c&&c(n))}h||(f.dataset.timeout=""+window.setTimeout((()=>{v.classList.remove("to"),p&&p.classList.remove("from"),f.classList.remove("animating","backwards","disable-hover"),delete f.dataset.timeout}),d)),p&&(p.classList.remove("to"),p.classList.add("from")),f.classList.add("animating");const y=g{v.classList.remove("to"),b.delete(v)})),p){let f;const e=p,t=()=>{clearTimeout(f),e.classList.remove("active","from"),w&&(null==w||w()),b.delete(e)};v?(f=window.setTimeout(t,d+100),b.set(e,t)):(f=window.setTimeout(t,d),b.set(e,(()=>{clearTimeout(f),b.delete(e)}))),o&&(u||(u=(0,i.Z)()),(0,a.YW)(u,2*d))}p=v}return m.prevId=()=>p?(0,s.Z)(p):-1,m}},493:(f,e,d)=>{d.d(e,{Z:()=>n});var t=d(8456),i=d(2325),a=d(8115),s=d(3512);function n(f,e=!1,d=!1,n,c=s.Z.managers){return o=this,r=void 0,l=function*(){f||(f=s.Z.myId);let o="";if(f.isUser()){const e=yield c.appUsersManager.getUser(f.toUserId());e.first_name&&(o+=e.first_name),!e.last_name||d&&o||(o+=" "+e.last_name),o=o?o.trim():e.pFlags.deleted?i.ZP.format(d?"Deleted":"HiddenName",!0):e.username}else o=(yield c.appChatsManager.getChat(f.toChatId())).title,d&&(o=o.split(" ")[0]);return void 0!==n&&(o=(0,t.Z)(o,n,n)),e?o:(0,a.Z)(o)},new((h=void 0)||(h=Promise))((function(f,e){function d(f){try{i(l.next(f))}catch(f){e(f)}}function t(f){try{i(l.throw(f))}catch(f){e(f)}}function i(e){var i;e.done?f(e.value):(i=e.value,i instanceof h?i:new h((function(f){f(i)}))).then(d,t)}i((l=l.apply(o,r||[])).next())}));var o,r,h,l}},3447:(f,e,d)=>{d.d(e,{Z:()=>a,i:()=>t});const t={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}},i=t[""];for(const f in t)f&&Object.assign(i,t[f]);const a=i},5296:(f,e,d)=>{d.d(e,{Kx:()=>s,cK:()=>n,jt:()=>c});var t=d(3035),i=d(3725);const a=new Map;function s(f){const e=function(f){return a.get(f)}(f);e&&(e.isCancelled=!0,e.deferred.resolve())}function n(f,e,d){return d||(d=function(f){s(f);const e={isCancelled:!1,deferred:(0,i.Z)()};return a.set(f,e),e.deferred.then((()=>{a.delete(f)})),e}(e)),(0,t.T2)((()=>{d.isCancelled||(f()?n(f,e,d):d.deferred.resolve())})),d.deferred}function c(f){(0,t.T2)((()=>{f()&&c(f)}))}},9897:(f,e,d)=>{d.d(e,{Z:()=>a});var t=d(410),i=d(9405);function a(f,e,d,t,a=!0){if(fd/t?n=e*d/f|0:(s=f*t/e|0,s>d&&(n=n*d/s|0,s=d)),a&&s>=f&&n>=e&&(s=f,n=e),(0,i.C)(s,n)}t.GO.calcImageInBox=a},2738:(f,e,d)=>{d.d(e,{EN:()=>n,fc:()=>s,pf:()=>a,tH:()=>c});var t=d(5432),i=d(6669);const a=t.Z?"mousedown":"click";function s(f,e,d={}){const t=d.listenerSetter?d.listenerSetter.add(f):f.addEventListener.bind(f);d.touchMouseDown=!0,t(a,e,d)}function n(f,e,d){f.removeEventListener(a,e,d)}function c(f){(0,i.Z)(f,a)}},6669:(f,e,d)=>{function t(f,e){const d=new Event(e,{bubbles:!0,cancelable:!0});f.dispatchEvent(d)}d.d(e,{Z:()=>t})},5975:(f,e,d)=>{function t(f,e){if(f.parentElement===e)return f;for(;f.parentElement;)if((f=f.parentElement).parentElement===e)return f;return null}d.d(e,{Z:()=>t})},8487:(f,e,d)=>{function t(f){return null==f?void 0:f.isConnected}d.d(e,{Z:()=>t})},2648:(f,e,d)=>{function t(f){if(!f.parentNode)return-1;let e=0;for(;null!==(f=f.previousElementSibling);)++e;return e}d.d(e,{Z:()=>t})},4789:(f,e,d)=>{d.d(e,{Z:()=>o,f:()=>t});var t,i=d(8594),a=d(3035),s=d(5296),n=d(3512),c=d(8487);function o(f){if(void 0===f.margin&&(f.margin=0),void 0===f.maxDistance&&(f.maxDistance=1500),void 0===f.axis&&(f.axis="y"),n.Z.settings.animationsEnabled||(f.forceDirection=t.Static),f.forceDirection===t.Static)return f.forceDuration=0,r(f);const e=(0,a.AD)().then((()=>r(f)));return"y"===f.axis?(0,i.YW)(e):e}function r(f){const{element:e,container:d,getNormalSize:t,axis:i,margin:a,position:n,forceDirection:o,maxDistance:b,forceDuration:u}=f;if(!(0,c.Z)(e))return(0,s.Kx)(d),Promise.resolve();const p="y"===i?"top":"left",m="y"===i?"bottom":"right",g="y"===i?"height":"width",v="y"===i?"scrollHeight":"scrollWidth",y="y"===i?"scrollTop":"scrollLeft",w=e.getBoundingClientRect(),k=d.getBoundingClientRect?d.getBoundingClientRect():document.body.getBoundingClientRect(),L=w[p]-k[p],M=e[v],E=t?t({rect:k}):k[g];let x=d[y];const C=d[v];let F;switch(n){case"start":F=L-a;break;case"end":F=w[m]-k[m]+a;break;case"nearest":case"center":if(Mb?(x=d.scrollTop+=F-b,F=b):F<-b&&(x=d.scrollTop+=F+b,F=-b)),F<0){const f=-x;F=Math.max(F,f)}else if(F>0){const f=C-(x+E);F=Math.min(F,f)}const S=d[y]+F,I=Math.abs(F),Z=null!=u?u:250+I/1500*350,P=Date.now(),D=I<500?l:h,A=()=>{const f=Z?Math.min((Date.now()-P)/Z,1):1,e=F*(1-D(f));return d[y]=Math.round(S-e),f<1};if(!Z||!F)return(0,s.Kx)(d),A(),Promise.resolve();if(f.startCallback){const e=C-Math.round(S+d["y"===i?"offsetHeight":"offsetWidth"]);f.startCallback({scrollSize:C,scrollPosition:x,distanceToEnd:e,path:F,duration:Z,containerRect:k,elementRect:w})}return(0,s.cK)(A,d)}function h(f){return 1-Math.pow(1-f,5)}function l(f){return 1-Math.pow(1-f,3.5)}!function(f){f[f.Up=0]="Up",f[f.Down=1]="Down",f[f.Static=2]="Static"}(t||(t={}))},8801:(f,e,d)=>{d.d(e,{P:()=>i});const t="_";function i(f,e){const d=""["".length-1]||"";let i;switch(f._){case"inputPhotoFileLocation":i=["photo",""[0],f.id,f.thumb_size].filter(Boolean).join(t);break;case"inputDocumentFileLocation":i=["document",""[0],f.id,f.thumb_size].filter(Boolean).join(t);break;case"inputPeerPhotoFileLocation":i=["peerPhoto",f.photo_id,f.pFlags.big?"big":"small"].join(t);break;case"inputStickerSetThumb":i=["stickerSetThumb",f.stickerset.id||f.stickerset.short_name||f.stickerset.emoticon||f.stickerset._,f.thumb_version].join(t);break;case"inputFileLocation":i=f.volume_id+"_"+f.local_id;break;case"inputWebFileLocation":i=["webFile",f.url].join(t);break;default:console.error("Unrecognized location:",f),i=""}return i+((null==e?void 0:e.downloadId)?"_download":"")+(d?"."+d:d)}},1708:(f,e,d)=>{d.d(e,{Z:()=>i});var t=d(7625);function i(f){(0,t.Z)(f.history,((e,d,t)=>{e.action.photo||(t.splice(d,1),void 0!==f.count&&--f.count)}))}},6074:(f,e,d)=>{d.d(e,{Z:()=>a});var t=d(7625),i=d(5953);class a{constructor(f){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,i.Z)(this,f)}setTargets(f,e,d){this.previous=f,this.next=e,this.reverse=d}get index(){return void 0!==this.count?this.previous.length:-1}reset(f=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,f),this.setLoaded(!1,f)}go(f,e=!0){let d,t;if(f>0){if(d=this.next.splice(0,f),t=d.pop(),!t)return;void 0!==this.current&&d.unshift(this.current),this.previous.push(...d)}else{if(d=this.previous.splice(Math.max(0,this.previous.length+f),-f),t=d.shift(),!t)return;void 0!==this.current&&d.push(this.current),this.next.unshift(...d)}return this.next.length0),this.current}unsetCurrent(f){f?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(f,e){const d=f>0?Math.max(0,f-this.next.length):Math.min(0,f+this.previous.length),t=this.go(f,!d&&e);return{item:d?void 0:t,leftLength:d}}setLoaded(f,e){return(f?this.loadedAllDown:this.loadedAllUp)!==e&&(f?this.loadedAllDown=e:this.loadedAllUp=e,e||(f?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(f){if(f?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let e,d=f?this.loadPromiseDown:this.loadPromiseUp;return d||(e=f?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=e||(e=this.current),d=this.loadMore(e,f,this.loadCount).then((e=>{return i=this,a=void 0,n=function*(){if((f?this.loadPromiseDown:this.loadPromiseUp)!==d)return;e.items.length{const e=this.processItem?this.processItem(f):f;e&&i.push(e)}));const a=yield Promise.all(i);f?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((s=void 0)||(s=Promise))((function(f,e){function d(f){try{c(n.next(f))}catch(f){e(f)}}function t(f){try{c(n.throw(f))}catch(f){e(f)}}function c(e){var i;e.done?f(e.value):(i=e.value,i instanceof s?i:new s((function(f){f(i)}))).then(d,t)}c((n=n.apply(i,a||[])).next())}));var i,a,s,n}),(()=>{})).then((()=>{f?this.loadPromiseDown=null:this.loadPromiseUp=null})),f?this.loadPromiseDown=d:this.loadPromiseUp=d,d)}}},3699:(f,e,d)=>{d.d(e,{Z:()=>t});class t{constructor(){this.listeners=new Set}add(f){return(e,d,t)=>{const i={element:f,event:e,callback:d,options:t};return this.addManual(i),i}}addManual(f){var e;f.element.addEventListener(f.event,f.callback,f.options),(null===(e=f.options)||void 0===e?void 0:e.once)&&(f.onceCallback=()=>{this.remove(f),f.onceFired=!0},f.element.addEventListener(f.event,f.onceCallback,f.options)),this.listeners.add(f)}remove(f){f.onceFired||(f.element.removeEventListener(f.event,f.callback,f.options),f.onceCallback&&f.element.removeEventListener(f.event,f.onceCallback,f.options)),this.listeners.delete(f)}removeManual(f,e,d,t){let i;for(const a of this.listeners)if(a.element===f&&a.event===e&&a.callback===d&&a.options===t){i=a;break}i&&this.remove(i)}removeAll(){this.listeners.forEach((f=>{this.remove(f)}))}}},9405:(f,e,d)=>{d.d(e,{C:()=>a,c:()=>i});var t=d(9897);class i{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return(0,t.Z)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function a(f,e){return new i(f,e)}},4755:(f,e,d)=>{d.d(e,{Z:()=>o,_:()=>t});var t,i=d(410),a=d(3241),s=d(9405);!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class n extends a.Z{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:(0,s.C)(270,270),webpage:(0,s.C)(270,200),album:(0,s.C)(270,0),esgSticker:(0,s.C)(68,68),animatedSticker:(0,s.C)(180,180),staticSticker:(0,s.C)(180,180),emojiSticker:(0,s.C)(112,112),poll:(0,s.C)(240,0),round:(0,s.C)(200,200),documentName:(0,s.C)(200,0),invoice:(0,s.C)(240,240)},desktop:{regular:(0,s.C)(420,340),webpage:(0,s.C)(420,340),album:(0,s.C)(420,0),esgSticker:(0,s.C)(80,80),animatedSticker:(0,s.C)(200,200),staticSticker:(0,s.C)(200,200),emojiSticker:(0,s.C)(112,112),poll:(0,s.C)(330,0),round:(0,s.C)(280,280),documentName:(0,s.C)(240,0),invoice:(0,s.C)(320,260)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const c=new n;i.GO.mediaSizes=c;const o=c},3228:(f,e,d)=>{function t(f,e,d){return fd?d:f}d.d(e,{Z:()=>t})},925:(f,e,d)=>{d.d(e,{Z:()=>i});var t=d(4762);function i(f,e=f.HAVE_METADATA,d){return new Promise((i=>{f.readyState>=e?i():f.addEventListener(t.IS_APPLE_MOBILE&&!d?"loadeddata":"canplay",(()=>i()),{once:!0})}))}},3719:(f,e,d)=>{d.d(e,{Z:()=>r});var t=d(3781),i=d(2790),a=d(3512),s=d(7625),n=d(1708),c=d(6074),o=function(f,e,d,t){return new(d||(d=Promise))((function(i,a){function s(f){try{c(t.next(f))}catch(f){a(f)}}function n(f){try{c(t.throw(f))}catch(f){a(f)}}function c(f){var e;f.done?i(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(s,n)}c((t=t.apply(f,e||[])).next())}))};class r extends c.Z{constructor(f={}){var e;super(Object.assign(Object.assign({},f),{loadMore:(f,e,d)=>{const a=e?0:d;let s=null==f?void 0:f.mid;var c;return void 0===s&&(s=this.searchContext.maxId),e||(c=s,1,s=(0,t.Z)((0,i.Z)(c)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==f?void 0:f.peerId),maxId:s,limit:a?0:d,backLimit:a})).then((f=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,n.Z)(f),f.next_rate&&(this.searchContext.nextRate=f.next_rate),{count:f.count,items:f.history})))},processItem:e=>o(this,void 0,void 0,(function*(){if((yield this.filterMids([e.mid])).length)return f.processItem(e)}))})),this.onHistoryDelete=({peerId:f,msgs:e})=>{const d=d=>d.peerId===f&&e.has(d.mid),t=(f,e,t)=>{d(f)&&t.splice(e,1)};(0,s.Z)(this.previous,t),(0,s.Z)(this.next,t),this.current&&d(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=f=>o(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(f.peerId!==this.searchContext.peerId)return;const e=yield this.filterMids([f.mid]),d=(yield Promise.all(e.map((f=>this.processItem(f))))).filter(Boolean);d.length&&(this.current?this.next.push(...d):this.previous.push(...d))})),this.onMessageSent=({message:f})=>{this.onHistoryMultiappend(f)},null!==(e=this.managers)&&void 0!==e||(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),f.isInner||(this.otherSideLoader=new r(Object.assign(Object.assign({},f),{isInner:!0})))}filterMids(f){return o(this,void 0,void 0,(function*(){const e=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._,f,e,f.length)}))}setSearchContext(f){this.searchContext=f,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(f)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(f){let e=this.previous;return this.otherSideLoader&&f&&(e=e.concat(this.otherSideLoader.previous)),e}getNext(f){let e=this.next;return this.otherSideLoader&&f&&(e=e.concat(this.otherSideLoader.next)),e}getCurrent(){var f;return this.current||(null===(f=this.otherSideLoader)||void 0===f?void 0:f.current)}goToOtherEnd(f){return f>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(f,e){var d;let t;if(null===(d=this.otherSideLoader)||void 0===d?void 0:d.current){if(t=this.otherSideLoader.goUnsafe(f,e),t.item)return t.item;if(!((f=t.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(f>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(f>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||f<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(f);this.otherSideLoader.unsetCurrent(f>0)}}if(t=this.goUnsafe(f,e),!t.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(f);this.otherSideLoader&&(f=t.leftLength,t=this.otherSideLoader.goUnsafe(f,e),t.item&&this.unsetCurrent(f>0))}return null==t?void 0:t.item}setLoaded(f,e){var d;const t=super.setLoaded(f,e);if(t&&this.otherSideLoader&&e&&!1!==(null===(d=this.searchContext)||void 0===d?void 0:d.useSearch)){const f=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:f?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(f,!0),this.otherSideLoader.load(!f)}return t}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)}}},4056:(f,e,d)=>{function t(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(f=>"&#"+f.charCodeAt(0)+";")).replace(//g,">")}d.d(e,{Z:()=>t})},8456:(f,e,d)=>{function t(f,e,d=e+10){return(f=f.trim()).length>d&&(f=f.slice(0,e)+"..."),f}d.d(e,{Z:()=>t})},8594:(f,e,d)=>{d.d(e,{YW:()=>b,ZP:()=>g,e9:()=>m,gp:()=>p});var t=d(3725),i=d(410),a=d(5418);const s=new(d(3241).Z),n="start",c="end";let o=!1,r=(0,t.Z)(),h=0;r.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function b(f,e){o||(r=(0,t.Z)(),s.dispatchEvent(n),o=!0,i.ZP&&l("start")),++h,i.ZP&&l("attach promise, length:",h,e);const d=[void 0!==e?(0,a.Z)(e):void 0,f.finally((()=>{}))].filter(Boolean),c=performance.now(),b=r;return Promise.race(d).then((()=>{r!==b||r.isFulfilled||(--h,i.ZP&&l("promise end, length:",h,performance.now()-c),h<=0&&u())})),r}function u(){r.isFulfilled||(o=!1,h=0,s.dispatchEvent(c),r.resolve(),i.ZP&&l("end"))}function p(){u()}function m(){return r}function g(f,e,d){o&&f();const t=d?d.add(s):s.addEventListener.bind(s),i=d?d.removeManual.bind(d,s):s.removeEventListener.bind(s);return t(n,f),t(c,e),()=>{i(c,e),i(n,f)}}},7309:(f,e,d)=>{d.d(e,{Z:()=>b});var t=d(3725),i=d(2202),a=d(3512),s=d(410),n=d(319),c=d(1243),o=d(7086),r=d(1655),h=d(5471);const l=new class{constructor(){this.downloads={},this.progress={}}construct(f){this.managers=f,a.Z.addEventListener("download_progress",(f=>{var e;const d=this.downloads[f.fileName];(null===(e=null==d?void 0:d.main)||void 0===e?void 0:e.notifyAll)&&(this.progress[f.fileName]=f,d.main.notifyAll(f))}))}getNewDeferred(f,e){const d=(0,t.Z)();let i=this.downloads[f];if(i){const f=i.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((e=>{f[e]&&(d[e]=f[e].bind(f))}))}else i=this.downloads[f]={main:d},d.cancel=()=>{const e=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(f),d.reject(e),d.cancel=n.Z},d.catch((()=>{this.clearDownload(f,e)})).finally((()=>{delete this.progress[f]}));return"disc"===e&&d.catch(n.Z).finally((()=>{this.clearDownload(f,e)})),i[e]=d}getNewDeferredForUpload(f,e){const d=this.getNewDeferred(f);return e.then(d.resolve,d.reject),d.finally((()=>{this.clearDownload(f)})),d}clearDownload(f,e){const d=this.downloads[f];if(!d)return;delete d[e];const t=Object.keys(d).length;(!t||d.main&&1===t)&&delete this.downloads[f]}getUpload(f){let e=this.getDownload(f);return e||(e=this.getNewDeferred(f),this.managers.appMessagesManager.getUploadPromise(f).then(e.resolve,e.reject),e)}d(f,e,d){let t=this.getDownload(f,d);return t||(t=this.getNewDeferred(f,d),e().then(t.resolve,t.reject),t)}download(f){const e=(0,o.Z)(f);return this.d(e,(()=>this.managers.apiFileManager.download(f)),"blob")}downloadMedia(f,e="blob"){const{downloadOptions:d,fileName:t}=(0,c.Z)(f);return this.d(t,(()=>{let d;return"url"===e?d=this.managers.apiFileManager.downloadMediaURL:"void"===e||"disc"===e?d=this.managers.apiFileManager.downloadMediaVoid:"blob"===e&&(d=this.managers.apiFileManager.downloadMedia),d(f)}),e)}downloadMediaURL(f){return this.downloadMedia(f,"url")}downloadMediaVoid(f){return this.downloadMedia(f,"void")}upload(f,e,d){return e||(e=(0,i.Z)(f)),d||(d=this.managers.apiFileManager.upload({file:f,fileName:e})),this.getNewDeferredForUpload(e,d)}getDownload(f,e){const d=this.downloads[f];return d&&d[e]}downloadToDisc(f,e){const d=f.media;"document"===d._||f.thumb||(f.thumb=d.sizes.slice().pop());const t=""+(2147483647*Math.random()|0),i=`download/${t}`;f.downloadId=t;const a=this.downloadMedia(f,"disc");if(e)return a;const s=document.createElement("iframe");s.hidden=!0,s.src=i,document.body.append(s);let c,o=!1;const h=()=>{o||(o=!0,c=s,(0,r.Z)(a.listeners,h))};return a.addNotifyListener(h),a.catch(n.Z).finally((()=>{o||h(),setTimeout((()=>{null==c||c.remove()}),1e3)})),a}};s.GO&&(s.GO.appDownloadManager=l);const b=l},7530:(f,e,d)=>{function t(f){if(f)return f.action?f.action.photo:f.media&&(f.media.photo||f.media.document||f.media.webpage&&(f.media.webpage.document||f.media.webpage.photo))}d.d(e,{Z:()=>t})},8115:(f,e,d)=>{d.d(e,{Z:()=>a});var t=d(6535),i=d(3178);function a(f,e=!1){if(!f)return(0,i.Z)("");const d=(0,t.Z)(f).filter((f=>"messageEntityEmoji"===f._));return(0,i.Z)(f,{entities:d,wrappingDraft:e})}},3178:(f,e,d)=>{d.d(e,{Z:()=>m});var t=d(2423),i=d(3447),a=d(9976),s=d(4762),n=d(8479),c=d(4056),o=d(1379),r=d(6535);function h(f){return f.target="_blank",f.rel="noopener noreferrer",f}var l=d(3591);const b={};a.Z&&(b[""]=!0,[["14","🫱🏻"]].forEach((([f,e])=>{b[f]=function(f){const e=document.createElement("span");e.classList.add("emoji"),document.body.appendChild(e),e.innerText=f;const d=e.offsetWidth;e.innerText="❤️";const t=e.offsetWidth;return document.body.removeChild(e),Math.abs(d-t)<5}(e)})));const u=b;var p=d(2738);function m(f,e={}){var d,b,g,v,y;const w=document.createDocumentFragment();if(!f)return w;const k=null!==(d=e.nasty)&&void 0!==d?d:e.nasty={i:0,usedLength:0,text:f},L=null!==(b=e.entities)&&void 0!==b?b:e.entities=(0,r.Z)(k.text),M=null!==(g=e.passEntities)&&void 0!==g?g:e.passEntities={},E=null!==(v=e.contextSite)&&void 0!==v?v:e.contextSite="Telegram",x="Telegram"!==E,C=k.text.length,F=L.length;let S;for(;k.i=C){if("messageEntityCaret"!==f._)continue}else f.offset+f.length>C&&(f=(0,n.Z)(f),f.length=f.offset+f.length-C);f.length&&(k.lastEntity=f);let d=L[k.i+1];const r=f.offset,b=r+f.length,g=Math.min(b,null!==(y=null==d?void 0:d.offset)&&void 0!==y?y:65535),v=k.text.slice(r,b);let F=k.text.slice(r,g);k.usedLengthF.length&&Z?Z:w,e.voodoo)return w}var I;return k.lastEntity&&(k.usedLength=k.lastEntity.offset+k.lastEntity.length),k.usedLength{d.d(e,{Z:()=>u});var t=d(5814),i=d(410),a=d(5418),s=d(5003),n=d(3772),c=d(4762),o=d(3241);class r extends o.Z{constructor(f){super(),this.worker=f,this.worker.onerror=f=>{try{this.dispatchEvent("workerError",f),this.cleanup(),this.terminate()}catch(f){}},this.worker.onmessage=f=>{this.dispatchEvent(f.data.queryMethodListener,...f.data.queryMethodArguments)}}postMessage(f){this.worker.postMessage(f)}terminate(){this.worker.terminate()}sendQuery(f,...e){if(c.IS_SAFARI)this.worker.postMessage({queryMethod:f,queryMethodArguments:e});else{const d=[];e.forEach((f=>{f instanceof ArrayBuffer&&d.push(f),"object"==typeof f&&f.buffer instanceof ArrayBuffer&&d.push(f.buffer)})),this.worker.postMessage({queryMethod:f,queryMethodArguments:e},d)}}}var h=d(8975),l=d(3789);const b=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=(0,s.kg)("LOTTIE",s.v9.Error),this.onPlayerLoaded=(f,e,d)=>{const t=this.players[f];t?(this.log.debug("onPlayerLoaded"),t.onLoad(e,d)):this.log.warn("onPlayerLoaded on destroyed player:",f,e)},this.onFrame=(f,e,d)=>{const t=this.players[f];t?(void 0!==t.clamped&&(t.clamped=d),t.renderFrame(d,e)):this.log.warn("onFrame on destroyed player:",f,e)},this.onPlayerError=(f,e)=>{const d=this.players[f];d&&t.Z.getAnimations(d.el).forEach((f=>{t.Z.checkAnimation(f,!0,!0)}))}}getAnimation(f){for(const e in this.players)if(this.players[e].el===f)return this.players[e];return null}setLoop(f){for(const e in this.players){const d=this.players[e];d.loop=f,d.autoplay=d._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((f,e)=>{let t=this.workersLimit;for(let i=0;i{this.log("worker #"+i+" ready"),s.addEventListener("frame",this.onFrame),s.addEventListener("loaded",this.onPlayerLoaded),s.addEventListener("error",this.onPlayerError),--t,t||(this.log("workers ready"),f(),this.loaded=!0)}),{once:!0}),s.addEventListener("workerError",(f=>{e("rlottie load error: "+f.message),this.loaded=!1}),{once:!0})}}))}loadAnimationAsAsset(f,e){return f.name=e,this.loadAnimationFromURL(f,"assets/tgs/"+e+".json")}loadAnimationFromURL(f,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then((f=>f.headers&&"application/octet-stream"!==f.headers.get("content-type")?f.blob():f.arrayBuffer().then((f=>l.Z.invokeCrypto("gzipUncompress",f))).then((f=>(0,h.Z)(f,""))))).then((d=>{const t=Object.assign(f,{animationData:d,needUpscale:!0});return t.name||(t.name=e),this.loadAnimationWorker(t)}))):this.loadPromise}waitForFirstFrame(f){return Promise.race([new Promise((e=>{f.addEventListener("firstFrame",e,{once:!0})})),(0,a.Z)(2500)]).then((()=>f))}loadAnimationWorker(f,e=f.group||"",d){return i=this,a=void 0,n=function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),d&&!d())throw new Error("middleware");if(f.width&&f.height||(f.width=parseInt(f.container.style.width),f.height=parseInt(f.container.style.height)),!f.width||!f.height)throw new Error("No size for sticker!");f.group=e;const i=this.initPlayer(f.container,f);return"none"!==e&&t.Z.addAnimation(i,e),i},new((s=void 0)||(s=Promise))((function(f,e){function d(f){try{c(n.next(f))}catch(f){e(f)}}function t(f){try{c(n.throw(f))}catch(f){e(f)}}function c(e){var i;e.done?f(e.value):(i=e.value,i instanceof s?i:new s((function(f){f(i)}))).then(d,t)}c((n=n.apply(i,a||[])).next())}));var i,a,s,n}onDestroy(f){delete this.players[f]}destroyWorkers(){this.workers.forEach(((f,e)=>{f.terminate(),this.log("worker #"+e+" terminated")})),this.log("workers destroyed"),this.workers.length=0}initPlayer(f,e){const d=new n.Z({el:f,worker:this.workers[this.curWorkerNum++],options:e});return this.players[d.reqId]=d,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),d.loadFromData(e.animationData),d}};i.GO.lottieLoader=b;const u=b},3772:(f,e,d)=>{d.d(e,{Z:()=>h});var t=d(7328),i=d(8189),a=d(4762),s=d(3241),n=d(4755),c=d(3228),o=d(2384);const r=new class{constructor(){this.cache=new Map}getCache(f){let e=this.cache.get(f);return e||this.cache.set(f,e={frames:new Map,counter:0}),++e.counter,e.frames}releaseCache(f){const e=this.cache.get(f);e&&!--e.counter&&this.cache.delete(f)}getCacheCounter(f){const e=this.cache.get(f);return null==e?void 0:e.counter}generateName(f,e,d,t,i){return[f,e,d,t?"colored":"",i||""].filter(Boolean).join("-")}};class h extends s.Z{constructor({el:f,worker:e,options:d}){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.reqId=++h.reqId,this.el=f,this.worker=e;for(const f in d)this.hasOwnProperty(f)&&(this[f]=d[f]);let s;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=d.initFrame,this.color=d.color,this.inverseColor=d.inverseColor,this.name=d.name,this.skipFirstFrameRendering=d.skipFirstFrameRendering,this.toneIndex=d.toneIndex,void 0!==d.skipRatio?s=d.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!i.Z)&&this.width<100&&this.height<100&&!d.needUpscale&&(s=.5),this.skipDelta=void 0!==s?1/s|0:1;const o=(0,c.Z)(window.devicePixelRatio,1,2);o>1&&(d.needUpscale?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>1&&(this.width>100&&this.height>100?a.IS_APPLE||!n.Z.isMobile?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>2.5&&(this.width=Math.round(this.width*(o-1.5)),this.height=Math.round(this.height*(o-1.5))):(this.width=Math.round(this.width*Math.max(1.5,o-1.5)),this.height=Math.round(this.height*Math.max(1.5,o-1.5))))),this.width=Math.round(this.width),this.height=Math.round(this.height),d.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=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height,this.canvas.dpr=o),this.context=this.canvas.getContext("2d"),t.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=r.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=r.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&r.getCacheCounter(this.cacheName)>1||this.frames.clear())}sendQuery(f,...e){this.worker.sendQuery(f,this.reqId,...e)}loadFromData(f){this.sendQuery("loadFromData",f,this.width,this.height,this.toneIndex)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(f=!0){this.paused||(this.paused=!0,f&&clearTimeout(this.rafId))}resetCurrentFrame(){var f;return this.curFrame=null!==(f=this.initFrame)&&void 0!==f?f:1===this.direction?this.minFrame:this.maxFrame}stop(f=!0){this.pause();const e=this.resetCurrentFrame();f&&this.requestFrame(e)}restart(){this.stop(!1),this.play()}setSpeed(f){this.speed!==f&&(this.speed=f,this.paused||this.setMainLoop())}setDirection(f){this.direction!==f&&(this.direction=f,this.paused||this.setMainLoop())}remove(){o.Z.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&r.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(f){const[e,d,t]=this.color;for(let i=0,a=f.length;i{this.renderFrame2(f,e)}),this.frInterval>-d?-d%this.frInterval:this.frInterval)}this.renderFrame2(f,e)}requestFrame(f){const e=this.frames.get(f);e?this.renderFrame(e,f):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",f,this.clamped))}onLap(){return!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:f,maxFrame:e}=this,d=this.curFrame+f>e?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=f;return this.requestFrame(d),!(d+f>e)||this.onLap()}mainLoopBackwards(){const{skipDelta:f,minFrame:e}=this,d=this.curFrame-fe?1:-1,callback:t})}playToFrame(f){this.pause();const{frame:e,speed:d,callback:t,direction:i}=f;this.setDirection(void 0===i?this.curFrame>e?-1:1:i),void 0!==d&&this.setSpeed(d);const a=[this.curFrame,e];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),t&&(this.playToFrameOnFrameCallback=f=>{f===e&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),t())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(f,e){this.color=f,e&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(f){this.inverseColor=f}setMinMax(f=0,e=this.frameCount-1){this.minFrame=f,this.maxFrame=e}onLoad(f,e){return d=this,t=void 0,a=function*(){this.frameCount=f,this.fps=e,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,c.Z)(this.initFrame,this.minFrame,this.maxFrame));const d=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const f=60/e;this.skipDelta=this.skipDelta/f|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(d),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const f=Date.now();this.frThen=f+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((i=void 0)||(i=Promise))((function(f,e){function s(f){try{c(a.next(f))}catch(f){e(f)}}function n(f){try{c(a.throw(f))}catch(f){e(f)}}function c(e){var d;e.done?f(e.value):(d=e.value,d instanceof i?d:new i((function(f){f(d)}))).then(s,n)}c((a=a.apply(d,t||[])).next())}));var d,t,i,a}}h.reqId=0},4874:(f,e,d)=>{d.d(e,{Z:()=>r});var t=d(2384),i=d(6008),a=d(410),s=d(4789),n=d(2648);const c=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,i.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var f;(null===(f=this.page)||void 0===f?void 0:f.onShown)&&this.page.onShown()}))}setPage(f){if(f.isAuthPage){this.pagesDiv.style.display="";const e=(0,n.Z)(f.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&t.Z.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&(0,s.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",f.pageEl.style.display="",this.pageId=-1;this.page=f}};a.GO.pagesManager=c;const o=c;class r{constructor(f,e,d,t,i){this.isAuthPage=e,this.onFirstMount=d,this.onMount=t,this.onShown=i,this.installed=!1,this.pageEl=document.body.querySelector("."+f)}mount(...f){return e=this,d=void 0,i=function*(){if(this.onMount&&this.onMount(...f),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...f);e instanceof Promise&&(yield e)}catch(f){console.error("PAGE MOUNT ERROR:",f)}this.installed=!0}o.setPage(this)},new((t=void 0)||(t=Promise))((function(f,a){function s(f){try{c(i.next(f))}catch(f){a(f)}}function n(f){try{c(i.throw(f))}catch(f){a(f)}}function c(e){var d;e.done?f(e.value):(d=e.value,d instanceof t?d:new t((function(f){f(d)}))).then(s,n)}c((i=i.apply(e,d||[])).next())}));var e,d,t,i}}},671:(f,e,d)=>{function t(f){return n(s(f)).join("-")}d.d(e,{Ml:()=>o,N0:()=>t,tB:()=>c,w1:()=>n,zu:()=>r});const i=/\uFE0F/g,a=String.fromCharCode(8205),s=f=>f.indexOf(a)<0?f.replace(i,""):f;function n(f){const e=[];let d=0,t=0,i=0;for(;i55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function c(f){const e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function o(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function r(f){return f.split("-").reduce(((f,e)=>f+String.fromCodePoint(parseInt(e,16))),"")}}}]); +//# sourceMappingURL=661.93c62f6378053baa4749.chunk.js.map \ No newline at end of file diff --git a/public/661.93c62f6378053baa4749.chunk.js.map b/public/661.93c62f6378053baa4749.chunk.js.map new file mode 100644 index 000000000..17f5dc460 --- /dev/null +++ b/public/661.93c62f6378053baa4749.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"661.93c62f6378053baa4749.chunk.js","mappings":"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AAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,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,wBAAw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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.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/number/clamp.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.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"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport {IS_SAFARI} from '../environment/userAgent';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\r\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\r\nimport forEachReverse from '../helpers/array/forEachReverse';\r\nimport idleController from '../helpers/idleController';\r\nimport appMediaPlaybackController from './appMediaPlaybackController';\r\n\r\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\r\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\r\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER';\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: AnimationItemGroup,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n private observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private overrideIdleGroups: Set;\r\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]} = {};\r\n private lockedGroups: {[group in AnimationItemGroup]?: true} = {};\r\n private onlyOnePlayableGroup: AnimationItemGroup = '';\r\n\r\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n\r\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\r\n animation.src = animation.dataset.src;\r\n animation.load();\r\n } */\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n const animation = player.animation;\r\n if(animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\r\n // console.warn('will clear cache', player);\r\n animation.clearCache();\r\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\r\n animation.dataset.src = animation.src;\r\n animation.src = '';\r\n animation.load();\r\n } */\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.overrideIdleGroups = new Set();\r\n\r\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n appMediaPlaybackController.addEventListener('pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n idleController.addEventListener('change', (idle) => {\r\n this.checkAnimations(idle);\r\n });\r\n }\r\n\r\n public setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group as AnimationItemGroup]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n // console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\r\n }\r\n\r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group: AnimationItemGroup = '') {\r\n const player: AnimationItem = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation,\r\n animation: animation,\r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group as AnimationItemGroup] ??= []).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: AnimationItemGroup, destroy = false) {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n if(group !== undefined && !this.byGroups[group]) {\r\n // console.warn('no animation group:', group);\r\n return;\r\n }\r\n\r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (player) => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n // return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n // console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused &&\r\n this.visible.has(player) &&\r\n animation.autoplay &&\r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\r\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\r\n ) {\r\n // console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public getOnlyOnePlayableGroup() {\r\n return this.onlyOnePlayableGroup;\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: AnimationItemGroup) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: AnimationItemGroup) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: AnimationItemGroup) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach((animation) => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach((animation) => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: AnimationItemGroup) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: AnimationItemGroup) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport simulateEvent from '../helpers/dom/dispatchEvent';\r\nimport type {SearchSuperContext} from './appSearchSuper.';\r\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport I18n from '../lib/langPack';\r\nimport SearchListLoader from '../helpers/searchListLoader';\r\nimport copy from '../helpers/object/copy';\r\nimport deepEqual from '../helpers/object/deepEqual';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\r\nimport getPeerTitle from './wrappers/getPeerTitle';\r\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\r\nimport onMediaLoad from '../helpers/onMediaLoad';\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId,\r\n mid: number,\r\n docId: DocId,\r\n doc: MyDocument,\r\n message: Message.message,\r\n clean?: boolean,\r\n isScheduled?: boolean,\r\n isSingle?: boolean\r\n};\r\n\r\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\r\n\r\nexport class AppMediaPlaybackController extends EventListenerBase<{\r\n play: (details: ReturnType) => void,\r\n pause: () => void,\r\n playbackParams: (params: ReturnType) => void,\r\n stop: () => void,\r\n}> {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n private playingMediaType: PlaybackMediaType;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n\r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n public loop: boolean;\r\n public round: boolean;\r\n private _volume: number;\r\n private _muted: boolean;\r\n private _playbackRate: number;\r\n private _loop: boolean;\r\n private _round: boolean;\r\n private lockedSwitchers: boolean;\r\n private playbackRates: Record = {\r\n voice: 1,\r\n video: 1,\r\n audio: 1\r\n };\r\n\r\n private pip: HTMLVideoElement;\r\n private managers: AppManagers;\r\n private skipMediaPlayEvent: boolean;\r\n\r\n construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.container = document.createElement('div');\r\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.browserPlay,\r\n pause: this.browserPause,\r\n stop: this.browserStop,\r\n seekbackward: this.browserSeekBackward,\r\n seekforward: this.browserSeekForward,\r\n seekto: this.browserSeekTo,\r\n previoustrack: this.browserPrevious,\r\n nexttrack: this.browserNext\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (docId) => {\r\n const set = this.waitingDocumentsForLoad[docId];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_play', () => {\r\n if(this.skipMediaPlayEvent) {\r\n this.skipMediaPlayEvent = false;\r\n return;\r\n }\r\n\r\n if(!this.pause() && this.pip) {\r\n this.pip.pause();\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const,\r\n 'muted' as const,\r\n 'playbackRate' as const,\r\n 'loop' as const,\r\n 'round' as const\r\n ];\r\n keys.forEach((key) => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\r\n this.playbackRates[this.playingMediaType] = value as number;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\r\n }\r\n\r\n public getPlaybackParams() {\r\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\r\n return {\r\n volume,\r\n muted,\r\n playbackRate,\r\n playbackRates,\r\n loop,\r\n round\r\n };\r\n }\r\n\r\n public setPlaybackParams(params: ReturnType) {\r\n this.playbackRates = params.playbackRates;\r\n this._volume = params.volume;\r\n this._muted = params.muted;\r\n this._playbackRate = params.playbackRate;\r\n this._loop = params.loop;\r\n this._round = params.round;\r\n }\r\n\r\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc = getMediaFromMessage(message) as Document.document;\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n // const source = document.createElement('source');\r\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n // media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n doc,\r\n message,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n // media.autoplay = true;\r\n media.volume = 1;\r\n // media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n\r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(async() => {\r\n // media.autoplay = true;\r\n // console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDownloadManager.downloadMediaURL({media: doc});\r\n }\r\n }/* , onError */);\r\n\r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n\r\n if(this.playingMedia === media) {\r\n media.playbackRate = this.playbackRate;\r\n\r\n if(doc.type === 'audio') {\r\n media.loop = this.loop;\r\n }\r\n }\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n // media.volume = 0;\r\n const currentTime = media.currentTime;\r\n // this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n // media.volume = 1;\r\n // this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n // @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n if(document.pictureInPictureElement) {\r\n return;\r\n }\r\n\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = getMediaFromMessage(message) as MyDocument;\r\n\r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n // if(result.cached) {\r\n // const url = await result.loadPromise;\r\n // artwork.push({\r\n // src: url,\r\n // sizes: '160x160',\r\n // type: 'image/jpeg'\r\n // });\r\n // } else {\r\n // result.loadPromise.then((url) => {\r\n // if(this.playingMedia !== playingMedia || !url) {\r\n // return;\r\n // }\r\n\r\n // this.setNewMediadata(message);\r\n // });\r\n // }\r\n }\r\n\r\n title = await getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute?.title ?? doc.file_name;\r\n artist = attribute?.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n public setCurrentMediadata() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) return;\r\n const message = this.getMessageByMedia(playingMedia);\r\n this.setNewMediadata(message, playingMedia);\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\r\n const details = this.mediaDetails.get(media);\r\n return details.message;\r\n // const {peerId, mid} = details;\r\n // const message = details.isScheduled ?\r\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\r\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\r\n // return message;\r\n }\r\n\r\n public getPlayingDetails() {\r\n const {playingMedia} = this;\r\n if(!playingMedia) {\r\n return;\r\n }\r\n\r\n const message = this.getMessageByMedia(playingMedia);\r\n return {\r\n doc: getMediaFromMessage(message) as MyDocument,\r\n message,\r\n media: playingMedia,\r\n playbackParams: this.getPlaybackParams()\r\n };\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n this.setMedia(media, message);\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n const listLoader = this.listLoader;\r\n const current = listLoader.getCurrent();\r\n if(!current || !verify(current)) {\r\n let jumpLength: number;\r\n\r\n for(const withOtherSide of [false, true]) {\r\n const previous = listLoader.getPrevious(withOtherSide);\r\n\r\n let idx = previous.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = -(previous.length - idx);\r\n } else {\r\n const next = listLoader.getNext(withOtherSide);\r\n idx = next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n\r\n if(jumpLength !== undefined) {\r\n break;\r\n }\r\n }\r\n\r\n if(jumpLength) {\r\n this.go(jumpLength, false);\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n if(this.playingMedia !== media) {\r\n return;\r\n }\r\n\r\n this.dispatchEvent('play', this.getPlayingDetails());\r\n this.pauseMediaInOtherTabs();\r\n }, 0);\r\n };\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n // if(this.pip) {\r\n // this.pip.play();\r\n // }\r\n\r\n this.dispatchEvent('pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n // console.log('on media end');\r\n\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers ||\r\n (!this.round && listLoader.current && !listLoader.next.length) ||\r\n !listLoader.getNext(true).length ||\r\n !this.next()) {\r\n this.stop();\r\n this.dispatchEvent('stop');\r\n }\r\n };\r\n\r\n public pauseMediaInOtherTabs() {\r\n this.skipMediaPlayEvent = true;\r\n rootScope.dispatchEvent('media_play');\r\n }\r\n\r\n // public get pip() {\r\n // return document.pictureInPictureElement as HTMLVideoElement;\r\n // }\r\n\r\n public toggle(play?: boolean, media = this.playingMedia) {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = media.paused;\r\n }\r\n\r\n if(media.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n media.play();\r\n } else {\r\n media.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = (media = this.playingMedia) => {\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n if(media === this.playingMedia) {\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n\r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n\r\n media.remove();\r\n\r\n this.mediaDetails.delete(media);\r\n }\r\n\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n\r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public go = (length: number, dispatchJump?: boolean) => {\r\n const listLoader = this.listLoader;\r\n if(this.lockedSwitchers || !listLoader) {\r\n return;\r\n }\r\n\r\n if(this.playingMediaType === 'audio') {\r\n return listLoader.goRound(length, dispatchJump);\r\n } else {\r\n return listLoader.go(length, dispatchJump);\r\n }\r\n };\r\n\r\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\r\n const handler: MediaSessionActionHandler = (details) => {\r\n cb(this.pip, details);\r\n };\r\n\r\n return handler;\r\n }\r\n\r\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\r\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\r\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\r\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\r\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\r\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\r\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\r\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\r\n\r\n public next = () => {\r\n return this.go(1);\r\n };\r\n\r\n public previous = () => {\r\n if(this.seekToStart(this.playingMedia)) {\r\n return;\r\n }\r\n\r\n return this.go(-1);\r\n };\r\n\r\n public seekToStart(media: HTMLMediaElement) {\r\n if(media?.currentTime > 5) {\r\n media.currentTime = 0;\r\n this.toggle(true, media);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n let listLoader = this.listLoader;\r\n if(!listLoader) {\r\n listLoader = this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n this.dispatchEvent('stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n listLoader.reverse = reverse;\r\n }\r\n\r\n listLoader.setSearchContext(this.searchContext);\r\n listLoader.current = current;\r\n\r\n listLoader.load(true);\r\n listLoader.load(false);\r\n }\r\n\r\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\r\n const doc = getMediaFromMessage(message) as MyDocument;\r\n let mediaType: PlaybackMediaType = 'audio';\r\n if(doc?.type) {\r\n if(doc.type === 'voice' || doc.type === 'round') {\r\n mediaType = 'voice';\r\n } else if(doc.type === 'video') {\r\n mediaType = 'video';\r\n }\r\n }\r\n\r\n return mediaType;\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\r\n\r\n this._playbackRate = this.playbackRates[mediaType];\r\n\r\n this.playingMedia = media;\r\n this.playingMediaType = mediaType;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if(mediaType === 'audio') {\r\n this.playingMedia.loop = this.loop;\r\n }\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n let onPlay: () => void;\r\n if(media) {\r\n onPlay = () => {\r\n const pip = this.pip;\r\n if(pip) {\r\n pip.pause();\r\n }\r\n\r\n this.pauseMediaInOtherTabs();\r\n };\r\n\r\n if(!media.paused) {\r\n onPlay();\r\n }\r\n\r\n media.addEventListener('play', onPlay);\r\n } else { // maybe it's voice recording\r\n this.pauseMediaInOtherTabs();\r\n }\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return (playPaused = wasPlaying) => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n\r\n // If it's still not cleaned\r\n if(this.playingMedia === media) {\r\n this.playingMedia = undefined;\r\n this.playingMediaType = undefined;\r\n }\r\n\r\n if(media) {\r\n media.removeEventListener('play', onPlay);\r\n }\r\n\r\n // I don't remember what it was for\r\n // if(media && this.playingMedia === media) {\r\n // this.stop();\r\n // }\r\n\r\n if(playPaused) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n\r\n public setPictureInPicture(video: HTMLVideoElement) {\r\n this.pip = video;\r\n\r\n // let wasPlaying = this.pause();\r\n\r\n const listenerSetter = new ListenerSetter();\r\n listenerSetter.add(video)('leavepictureinpicture', () => {\r\n if(this.pip !== video) {\r\n return;\r\n }\r\n\r\n this.pip = undefined;\r\n // if(wasPlaying) {\r\n // this.play();\r\n // }\r\n\r\n listenerSetter.removeAll();\r\n }, {once: true});\r\n\r\n listenerSetter.add(video)('play', (e) => {\r\n if(this.playingMedia !== video) {\r\n this.pause();\r\n }\r\n\r\n this.pauseMediaInOtherTabs();\r\n // if(this.pause()) {\r\n // listenerSetter.add(video)('pause', () => {\r\n // this.play();\r\n // }, {once: true});\r\n // }\r\n });\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {TransitionSlider} from './transition';\r\nimport {ScrollableX} from './scrollable';\r\nimport rootScope from '../lib/rootScope';\r\nimport {fastRaf} from '../helpers/schedulers';\r\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\nimport whichChild from '../helpers/dom/whichChild';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement,\r\n content: HTMLElement,\r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\r\n onTransitionEnd?: () => void,\r\n transitionTime = 250,\r\n scrollableX?: ScrollableX,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd, undefined, listenerSetter);\r\n\r\n if(!tabs) {\r\n return selectTab;\r\n }\r\n\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n\r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const result1 = onClick(id, tabContent, animate);\r\n const canChange = result1 instanceof Promise ? await result1 : result1;\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement,\r\n position: 'center',\r\n forceDirection: animate ? undefined : FocusDirection.Static,\r\n forceDuration: transitionTime,\r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n\r\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\r\n\r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n if(prev) {\r\n mutateCallback(() => {\r\n prev.classList.remove('active');\r\n });\r\n }\r\n\r\n // a great stripe from Jolly Cobra\r\n if(useStripe && prevId !== -1 && animate) {\r\n mutateCallback(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n\r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n\r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n\r\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n\r\n fastRaf(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n\r\n mutateCallback(() => {\r\n target.classList.add('active');\r\n });\r\n\r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n attachClickEvent(tabs, (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n target = findUpAsChild(target, tabs);\r\n\r\n // console.log('tabs click:', target);\r\n\r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n }, {listenerSetter});\r\n\r\n return proxy;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\r\nimport whichChild from '../helpers/dom/whichChild';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n\r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n // window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n // void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n\r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n // });\r\n\r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement,\r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */,\r\n transitionTime: number,\r\n onTransitionEnd?: (id: number) => void,\r\n isHeavy = true,\r\n listenerSetter?: ListenerSetter\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n\r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy, undefined, undefined, listenerSetter);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement,\r\n animationFunction: TransitionFunction,\r\n transitionTime: number,\r\n onTransitionEnd?: (id: number) => void,\r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true,\r\n listenerSetter?: ListenerSetter\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n\r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n\r\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n\r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n callback?.();\r\n\r\n if(e.target !== from) {\r\n return;\r\n }\r\n\r\n if(!animationDeferred && isHeavy) return;\r\n\r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n\r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n if(once) {\r\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\r\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n\r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\r\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n // console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n callback?.();\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n // prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n let timeout: number;\r\n const _from = from;\r\n const callback = () => {\r\n clearTimeout(timeout);\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback?.();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n\r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n\r\n from = to;\r\n }\r\n\r\n // selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n\r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getPeerTitle(peerId: PeerId, plainText: true, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText?: false, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText: boolean, onlyFirstName?: boolean, _limitSymbols?: number, managers?: AppManagers): Promise;\nexport default async function getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false, _limitSymbols?: number, managers: AppManagers = rootScope.managers): Promise {\n if(!peerId) {\n peerId = rootScope.myId;\n }\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n\n if(!title) title = user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : user.username;\n else title = title.trim();\n } else {\n const chat: Chat.chat = await managers.appChatsManager.getChat(peerId.toChatId());\n title = chat.title;\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);\n}\n","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false,\r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n\r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport {makeMediaSize} from './mediaSize';\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from '../listenerSetter';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport simulateEvent from './dispatchEvent';\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n\r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: HTMLElement, parent: HTMLElement): HTMLElement {\r\n if(el.parentElement === parent) return el;\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n\r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\r\nimport {fastRaf, fastRafPromise} from './schedulers';\r\nimport {animateSingle, cancelAnimationByKey} from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\nexport type ScrollStartCallbackDimensions = {\r\n scrollSize: number,\r\n scrollPosition: number,\r\n distanceToEnd: number,\r\n path: number,\r\n duration: number,\r\n containerRect: DOMRect,\r\n elementRect: DOMRect,\r\n};\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement,\r\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n // return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = fastRafPromise().then(() => scrollWithJs(options));\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n // const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n\r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n\r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n\r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n\r\n }); */\r\n\r\n if(options.startCallback) {\r\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\r\n options.startCallback({\r\n scrollSize,\r\n scrollPosition,\r\n distanceToEnd,\r\n path,\r\n duration,\r\n containerRect,\r\n elementRect\r\n });\r\n }\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\r\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string,\r\n downloadId: string\r\n}>) {\r\n const fileName = '';// (options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n\r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n // console.log('getFileURL', location);\r\n // const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return /* '/' + */type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from './eventListenerBase';\r\n\r\nexport type Listener = {\r\n element: ListenerElement,\r\n event: ListenerEvent,\r\n callback: ListenerCallback,\r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T,\r\n event: ListenerEvent,\r\n callback: ListenerCallback,\r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element &&\r\n _listener.event === event &&\r\n _listener.callback === callback &&\r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach((listener) => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport EventListenerBase from './eventListenerBase';\r\nimport {makeMediaSize, MediaSize} from './mediaSize';\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize,\r\n documentName: MediaSize,\r\n invoice: MediaSize\r\n};\r\n\r\nexport type MediaSizeType = keyof MediaTypeSizes;\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200),\r\n documentName: makeMediaSize(200, 0),\r\n invoice: makeMediaSize(240, 240)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280),\r\n documentName: makeMediaSize(240, 0),\r\n invoice: makeMediaSize(320, 260)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n // this.isMobile = innerWidth <= 720;\r\n\r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n // console.time('esg');\r\n // const computedStyle = window.getComputedStyle(document.documentElement);\r\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n // console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n // console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth\r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\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) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {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 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","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","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport {AnyToVoidFunction} from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport DEBUG from '../config/debug';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\n\r\nconst eventListener = new EventListenerBase<{\r\n start: () => void,\r\n end: () => void\r\n}>();\r\nconst ANIMATION_START_EVENT = 'start';\r\nconst ANIMATION_END_EVENT = 'end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n\r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n // useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n // }, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\r\nimport type {AppMessagesManager} from './appMessagesManager';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport {InputFile, Photo, PhotoSize} from '../../layer';\r\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\r\nimport {AppManagers} from './managers';\r\nimport rootScope from '../rootScope';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport noop from '../../helpers/noop';\r\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\r\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport makeError from '../../helpers/makeError';\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadUrl = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n// export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\r\n\r\nexport class AppDownloadManager {\r\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\r\n // private downloadsToDisc: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n // private progressCallbacks: {[fileName: string]: Array} = {};\r\n private managers: AppManagers;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n rootScope.addEventListener('download_progress', (details) => {\r\n // const callbacks = this.progressCallbacks[details.fileName];\r\n // if(callbacks) {\r\n // callbacks.forEach((callback) => callback(details));\r\n // }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download?.main?.notifyAll) {\r\n this.progress[details.fileName] = details;\r\n download.main.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string, type?: DownloadType) {\r\n const deferred = deferredPromise();\r\n\r\n let download = this.downloads[fileName];\r\n if(!download) {\r\n download = this.downloads[fileName] = {\r\n main: deferred as any\r\n };\r\n\r\n deferred.cancel = () => {\r\n const error = makeError('DOWNLOAD_CANCELED');\r\n\r\n this.managers.apiFileManager.cancelDownload(fileName);\r\n\r\n deferred.reject(error);\r\n deferred.cancel = noop;\r\n };\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName, type);\r\n }).finally(() => {\r\n delete this.progress[fileName];\r\n // delete this.progressCallbacks[fileName];\r\n });\r\n } else {\r\n const main = download.main;\r\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\r\n if(!main[key]) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n deferred[key] = main[key].bind(main);\r\n });\r\n }\r\n\r\n const haveToClear = type === 'disc';\r\n if(haveToClear) {\r\n deferred.catch(noop).finally(() => {\r\n this.clearDownload(fileName, type);\r\n });\r\n }\r\n\r\n return download[type] = deferred as any;\r\n }\r\n\r\n public getNewDeferredForUpload>(fileName: string, promise: T) {\r\n const deferred = this.getNewDeferred(fileName);\r\n promise.then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as CancellablePromise>;\r\n }\r\n\r\n private clearDownload(fileName: string, type?: DownloadType) {\r\n const downloads = this.downloads[fileName];\r\n if(!downloads) {\r\n return;\r\n }\r\n\r\n delete downloads[type];\r\n\r\n const length = Object.keys(downloads).length;\r\n if(!length || (downloads.main && length === 1)) {\r\n delete this.downloads[fileName];\r\n }\r\n }\r\n\r\n public getUpload(fileName: string): ReturnType['promise'] {\r\n let deferred: CancellablePromise = this.getDownload(fileName);\r\n if(deferred) {\r\n return deferred;\r\n }\r\n\r\n deferred = this.getNewDeferred(fileName);\r\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\r\n return deferred;\r\n }\r\n\r\n /* public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then((response) => response.blob())\r\n .then((blob) => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n } */\r\n\r\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\r\n let deferred = this.getDownload(fileName, type);\r\n if(deferred) return deferred;\r\n\r\n deferred = this.getNewDeferred(fileName, type);\r\n getPromise().then(deferred.resolve, deferred.reject);\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getDownloadFileNameFromOptions(options);\r\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob'): DownloadBlob {\r\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\r\n\r\n return this.d(fileName, () => {\r\n let cb: any;\r\n if(type === 'url') {\r\n cb = this.managers.apiFileManager.downloadMediaURL;\r\n } else if(type === 'void' || type === 'disc') {\r\n cb = this.managers.apiFileManager.downloadMediaVoid;\r\n } else if(type === 'blob') {\r\n cb = this.managers.apiFileManager.downloadMedia;\r\n }\r\n\r\n return cb(options);\r\n }, type) as any;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\r\n return this.downloadMedia(options, 'url') as any;\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\r\n return this.downloadMedia(options, 'void');\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\r\n if(!fileName) {\r\n fileName = getFileNameForUpload(file);\r\n }\r\n\r\n if(!promise) {\r\n promise = this.managers.apiFileManager.upload({file, fileName});\r\n }\r\n\r\n const deferred = this.getNewDeferredForUpload(fileName, promise);\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string, type?: DownloadType) {\r\n const d = this.downloads[fileName];\r\n return d && d[type];\r\n }\r\n\r\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n // const progress = this.progress[fileName];\r\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n // if(progress) {\r\n // callback(progress);\r\n // }\r\n // }\r\n\r\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\r\n const media = options.media;\r\n const isDocument = media._ === 'document';\r\n if(!isDocument && !options.thumb) {\r\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\r\n }\r\n\r\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\r\n // if(justAttach) {\r\n // const promise = this.downloadsToDisc[cacheFileName];\r\n // if(promise) {\r\n // return promise;\r\n // }\r\n // }\r\n\r\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\r\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\r\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\r\n // const id = 'test';\r\n const url = `download/${id}`;\r\n options.downloadId = id;\r\n\r\n const promise = this.downloadMedia(options, 'disc');\r\n // this.downloadsToDisc[cacheFileName] = promise;\r\n\r\n if(justAttach) {\r\n return promise;\r\n }\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.hidden = true;\r\n iframe.src = url;\r\n document.body.append(iframe);\r\n // createDownloadAnchor(url, 'asd.txt');\r\n\r\n // const events = [\r\n // 'emptied',\r\n // 'abort',\r\n // 'suspend',\r\n // 'reset',\r\n // 'error',\r\n // 'ended',\r\n // 'load'\r\n // ].forEach((event) => {\r\n // iframe.addEventListener(event, () => alert(event));\r\n // iframe.contentWindow.addEventListener(event, () => alert(event));\r\n // });\r\n\r\n let element: HTMLElement, hadProgress = false;\r\n const onProgress = () => {\r\n if(hadProgress) {\r\n return;\r\n }\r\n\r\n hadProgress = true;\r\n element = iframe;\r\n\r\n indexOfAndSplice(promise.listeners, onProgress);\r\n };\r\n\r\n promise.addNotifyListener(onProgress);\r\n promise.catch(noop).finally(() => {\r\n if(!hadProgress) {\r\n onProgress();\r\n }\r\n\r\n setTimeout(() => {\r\n element?.remove();\r\n }, 1000);\r\n\r\n // if(this.downloadsToDisc[cacheFileName] === promise) {\r\n // delete this.downloadsToDisc[cacheFileName];\r\n // }\r\n });\r\n\r\n return promise;\r\n // } else {\r\n // const promise = this.downloadMedia(options, 'blob');\r\n // promise.then((blob) => {\r\n // const url = URL.createObjectURL(blob);\r\n // createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\r\n // URL.revokeObjectURL(url);\r\n // });\r\n // });\r\n // return promise;\r\n // }\r\n\r\n // const promise = this.downloadMedia(options);\r\n // promise.then((blob) => {\r\n // const url = URL.createObjectURL(blob);\r\n // const downloadOptions = isDocument ?\r\n // getDocumentDownloadOptions(media) :\r\n // getPhotoDownloadOptions(media as any, options.thumb);\r\n // const fileName = (options.media as Document.document).file_name || getFileNameByLocation(downloadOptions.location);\r\n // createDownloadAnchor(url, fileName, () => {\r\n // URL.revokeObjectURL(url);\r\n // });\r\n // }, noop);\r\n\r\n // return promise;\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","import {Document, Message, MessageAction, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n const media = (message as Message.messageService).action ?\n ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo :\n (message as Message.message).media && (\n ((message as Message.message).media as MessageMedia.messageMediaPhoto).photo ||\n ((message as Message.message).media as MessageMedia.messageMediaDocument).document || (\n ((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage && (\n (((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document ||\n (((message as Message.message).media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).photo\n )\n )\n );\n\n return media as Photo.photo | Document.document;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return wrapRichText('');\n\n const entities = parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\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 {IS_SAFARI} from '../../environment/userAgent';\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';\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\n contextHashtag?: string,\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean\n}> = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontWeight = 'bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontStyle = 'italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: line-through;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n element = document.createElement('span');\n element.style.cssText = `${styleName}: underline;`;\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'var(--font-monospace)';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version 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 // } 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.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 const {url, onclick} = wrapUrl('t.me/' + username);\n\n element = document.createElement('a');\n element.className = 'mention';\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n // insertPart(entity, ``, '');\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 } else if(options.wrappingDraft) {\n element = document.createElement('span');\n element.style.fontFamily = 'spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentElement) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentElement) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(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 return fragment;\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","/*\n * 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 EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => 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(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: Transferable[] = [];\n args.forEach((arg) => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n\n if(typeof(arg) === 'object' && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n\n // console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer);\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport {logger, LogTypes} from '../logger';\r\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport rootScope from '../rootScope';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\r\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\r\n\r\n queryableWorker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n queryableWorker.addEventListener('frame', this.onFrame);\r\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\r\n queryableWorker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n queryableWorker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n\r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then((res) => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data)).then((arr) => blobConstruct(arr as Uint8Array, ''))\r\n } else {\r\n return res.blob();\r\n }\r\n })\r\n /* .then((str) => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then((blob) => {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(\r\n params: RLottieOptions,\r\n group: AnimationItemGroup = params.group || '',\r\n middleware?: () => boolean\r\n ): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n // params.autoplay = true;\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw new Error('middleware');\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n // rlPlayer.addListener('firstFrame', () => {\r\n // animationIntersector.addAnimation(player, group);\r\n // }, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n if(rlPlayer.clamped !== undefined) {\r\n rlPlayer.clamped = frame;\r\n }\r\n\r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach((animation) => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el,\r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 lottieLoader from './lottieLoader';\nimport QueryableWorker from './queryableWorker';\nimport {AnimationItemGroup} from '../../components/animationIntersector';\n\nexport type RLottieOptions = {\n container: HTMLElement,\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: boolean,\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};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\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 cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\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}> {\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 private name: string;\n private 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 context: 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 = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\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 frames: RLottieCacheMap;\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 constructor({el, worker, options}: {\n el: HTMLElement,\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\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 = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n // this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n this.width = Math.round(this.width);\n this.height = Math.round(this.height);\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 // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n\n // console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.canvas.dpr = pixelRatio;\n }\n\n this.context = this.canvas.getContext('2d');\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n // console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery('loadFromData', data, this.width, this.height, this.toneIndex/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n // return;\n\n // console.log('RLOTTIE PLAY' + this.reqId);\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 }\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 // alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n // this.removed = true;\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, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\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 // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n // let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n // console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n\n // console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n // console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\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 // console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n 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);\n }\n }\n\n private onLap() {\n // this.playedTimes++;\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\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.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\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\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from './page';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport {horizontalMenu} from '../components/horizontalMenu';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\r\nimport whichChild from '../helpers/dom/whichChild';\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n const id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv,\r\n element: this.scrollableDiv.firstElementChild as HTMLElement,\r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from './pagesManager';\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n // this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n\r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if(char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}\n"],"names":["animationIntersector","constructor","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","this","observer","IntersectionObserver","entries","entry","target","group","player","find","p","el","isIntersecting","add","checkAnimation","delete","animation","clearCache","overrideIdleGroups","doc","type","checkAnimations","idle","setOverrideIdleGroup","override","getAnimations","element","found","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","addAnimation","loop","observe","blurred","destroy","undefined","groups","Object","keys","animations","paused","pause","has","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","window","requestAnimationFrame","lockIntersectionGroup","unlockIntersectionGroup","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","Map","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","get","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","set","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","item","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","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","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","proxy","Proxy","apply","that","args","animate","querySelector","children","selectTarget","tabContent","result1","canChange","Promise","scrollIntoViewNew","parentElement","position","forceDirection","forceDuration","axis","prevId","classList","contains","mutateCallback","tagName","toLowerCase","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","firstElementChild","tab","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","filter","offsetWidth","slideTabs","TransitionSlider","isHeavy","animationFunction","Transition","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeManual","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","onTransitionEndCallback","_from","getPeerTitle","plainText","onlyFirstName","_limitSymbols","isUser","user","appUsersManager","getUser","toUserId","first_name","last_name","trim","deleted","username","appChatsManager","getChat","toChatId","split","EmojiVersions","Emoji","version","assign","instances","cancelAnimationByKey","instance","getAnimationInstance","isCancelled","animateSingle","tick","createAnimationInstance","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","CLICK_EVENT_NAME","attachClickEvent","elem","options","bind","touchMouseDown","detachClickEvent","simulateClickEvent","simulateEvent","name","event","Event","bubbles","cancelable","findUpAsChild","parent","isInDOM","isConnected","whichChild","parentNode","i","previousElementSibling","FocusDirection","fastSmoothScroll","margin","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","containerRect","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","abs","scrollTop","remainingPath","absPath","startAt","Date","now","transition","shortTransition","longTransition","t","currentPath","startCallback","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","location","ext","str","thumb_size","Boolean","join","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","error","downloadId","filterChatPhotosMessages","history","arr","photo","splice","count","ListLoader","loadedAllUp","loadedAllDown","index","loadedAll","setLoaded","items","pop","unshift","shift","unsetCurrent","toPrevious","goUnsafe","leftLength","down","loadPromiseDown","loadPromiseUp","anchor","loadMore","result","processedArr","processed","results","all","onLoadedMore","ListenerSetter","listeners","listener","addManual","onceCallback","onceFired","_listener","MediaSize","height","aspect","boxSize","fitted","aspectFitted","aspectCovered","makeMediaSize","ScreenSize","MediaSizes","super","screenSizes","mobile","medium","large","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","documentName","invoice","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","active","rAF","cancelAnimationFrame","mediaSizes","clamp","v","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","IS_APPLE_MOBILE","SearchListLoader","backLimit","maxId","messageId","generateMessageId","getServerMessageId","getSearch","limit","inputFilter","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","forEachReverse","onHistoryMultiappend","filtered","targets","map","onMessageSent","rootScope","isInner","otherSideLoader","mids","storageKey","filterMessagesByInputFilterFromStorage","useSearch","concat","goToOtherEnd","ret","changed","cleanup","encodeEntities","replace","charCodeAt","limitSymbols","limitFrom","slice","eventListener","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","log","dispatchHeavyAnimationEvent","promises","finally","perf","performance","_heavyAnimationPromise","race","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","appDownloadManager","downloads","progress","download","fileName","main","notifyAll","getNewDeferred","cancel","apiFileManager","cancelDownload","reject","catch","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","d","getPromise","downloadMedia","downloadOptions","downloadMediaURL","downloadMediaVoid","upload","file","downloadToDisc","justAttach","random","iframe","hidden","hadProgress","onProgress","addNotifyListener","getMediaFromMessage","wrapEmojiText","text","isDraft","entities","wrappingDraft","setBlankToAnchor","rel","EMOJI_VERSIONS_SUPPORTED","emoji","inlineEl","appendChild","innerText","newEmojiWidth","legacyEmojiWidth","removeChild","isEmojiSupported","wrapRichText","fragment","createDocumentFragment","nasty","usedLength","parseEntities","passEntities","contextSite","contextExternal","textLength","lastElement","entity","offset","copy","lastEntity","nextEntity","startOffset","endOffset","endPartOffset","fullEntityText","partText","property","usedText","noTextFormat","fontWeight","fontStyle","styleName","fontFamily","className","noLinks","bot","atPos","command","indexOf","fromBot","href","encodeURIComponent","isSupported","hasOwnProperty","unicode","onclick","masked","wrapped","wrapUrl","currentContext","electronHelpers","contextUrl","hashtag","user_id","follow","encoded","encodeSpoiler","entityText","textContent","onSpoilerClick","voodoo","QueryableWorker","worker","onerror","terminate","onmessage","data","queryMethodListener","queryMethodArguments","postMessage","sendQuery","queryMethod","transfer","arg","ArrayBuffer","buffer","lottieLoader","isWebAssemblySupported","loadPromise","loaded","workersLimit","players","workers","curWorkerNum","logger","onPlayerLoaded","reqId","frameCount","fps","rlPlayer","debug","onLoad","onFrame","frameNo","frame","clamped","renderFrame","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","URL","queryableWorker","loadAnimationAsAsset","loadAnimationFromURL","fetch","res","headers","blob","arrayBuffer","blobConstruct","newParams","animationData","needUpscale","loadAnimationWorker","waitForFirstFrame","middleware","Error","parseInt","initPlayer","onDestroy","destroyWorkers","loadFromData","cache","getCache","frames","counter","releaseCache","getCacheCounter","generateName","color","toneIndex","RLottiePlayer","direction","speed","cachingDelta","skipRatio","initFrame","inverseColor","skipFirstFrameRendering","IS_ANDROID","skipDelta","pixelRatio","devicePixelRatio","noCache","Infinity","canvas","dpr","getContext","Uint8ClampedArray","imageData","ImageData","cacheName","methodName","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","curFrame","minFrame","maxFrame","renderFirstFrame","requestFrame","restart","setSpeed","setDirection","applyColor","r","g","b","applyInversing","renderFrame2","putImageData","frInterval","delta","frThen","onLap","mainLoopForwards","mainLoopBackwards","method","currentMethod","frameListener","listenerResults","enterFrame","playPart","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setColor","renderIfPaused","setInverseColor","diff","time","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","setPage","isAuthPage","display","pageEl","Page","onFirstMount","onMount","installed","mount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","char","toString","getEmojiToneIndex","input","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","curr","fromCodePoint"],"sourceRoot":""} \ No newline at end of file diff --git a/public/665.36cc8e85c02a51d78eff.chunk.js b/public/665.36cc8e85c02a51d78eff.chunk.js new file mode 100644 index 000000000..4d083e4a0 --- /dev/null +++ b/public/665.36cc8e85c02a51d78eff.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[665],{9807:(e,t,s)=>{s.d(t,{Z:()=>c});var i=s(1405),n=s(2325),o=s(9750),l=s(3512),r=s(3789);class c{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);const s=this.input=document.createElement("input");if(s.classList.add("checkbox-field-input"),s.type="checkbox",e.name&&(s.id="input-"+e.name),e.checked&&(s.checked=!0),e.stateKey){let t=!1;const i=()=>{if(!t)return;let i;i=e.stateValues?e.stateValues[s.checked?1:0]:s.checked,l.Z.managers.appStateManager.setByKey(e.stateKey,i)};r.Z.getState().then((s=>{t=!0;const i=(0,o.Z)(s,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(i):i,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(s)("change",i):s.addEventListener("change",i)}let c;if(e.text?(c=this.span=document.createElement("span"),c.classList.add("checkbox-caption"),(0,n.$d)(c,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(s),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 s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("checkbox-box-check"),s.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),s.append(i);const n=document.createElement("div");n.classList.add("checkbox-box-background");const o=document.createElement("div");o.classList.add("checkbox-box-border"),e.append(o,n,s),t.append(e)}c&&t.append(c),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,i.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)}}},5431:(e,t,s)=>{s.d(t,{Z:()=>E});var i=s(9976),n=s(3910),o=s(6669),l=s(8497),r=s(4668),c=s(5565),a=s(130),d=s(4789),h=s(144),u=s(2325),p=s(8115),m=s(3512),v=s(671),g=s(503),f=s(8805);let y;const S=()=>{y=u.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 L=()=>{S(),m.Z.addEventListener("language_change",(()=>{S()}))};class E extends g.Z{constructor(e={}){super(Object.assign({label:"Country",name:(0,h.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,s;const i=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),l=null==n?void 0:n.innerText,r=l&&l.replace(/\D/g,"");(0,c.Z)(this.input,(0,u.ag)(i)),(0,o.Z)(this.input,"input"),this.lastCountrySelected=y.find((e=>e.default_name===i)),this.lastCountryCodeSelected=r&&this.lastCountrySelected.country_codes.find((e=>e.country_code===r)),null===(s=(t=this.options).onCountryChange)||void 0===s||s.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},L&&(L(),L=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 s=document.createElement("span");s.classList.add("arrow","arrow-down"),this.container.append(s);const m=document.createElement("ul");t.appendChild(m),new f.ZP(t);let g=()=>{g=null,y.forEach((t=>{const s=(0,v.Ml)(t.iso2),n=[];for(let o=0,l=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);o{if(0!==e.button)return;const t=(0,r.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};g(),this.input.addEventListener("focus",(e=>{g?g():y.forEach((e=>{this.liMap.get(e.iso2).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,d.Z)({container:(0,l.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{S||(document.addEventListener("mousedown",E,{capture:!0}),S=!0)}),0)}));let S=!1;const E=e=>{(0,l.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",E,{capture:!0}),S=!1)},b=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const s=this.value.toLowerCase(),i=[];y.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const s=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");s.length>1&&t.push(s)}));const n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(s)));this.liMap.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&i.push(e)})),0===i.length?y.forEach((e=>{this.liMap.get(e.iso2).forEach((e=>e.style.display=""))})):1===i.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(i[0].iso2)[0]))};this.input.addEventListener("keyup",b),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&b(e)})),s.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,s){var i,n;(0,c.Z)(this.input,e?(0,u.ag)(e.default_name):s),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(i=this.options).onCountryChange)||void 0===n||n.call(i,this.lastCountrySelected,this.lastCountryCodeSelected)}}},8805:(e,t,s)=>{s.d(t,{ZP:()=>d,v7:()=>h});var i=s(5432),n=s(5003),o=s(4789),l=s(8594),r=s(3910);const c=s(4762).IS_ANDROID?200:24;class a{constructor(e,t="",s=document.createElement("div")){this.el=e,this.container=s,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,l.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,o.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class d extends a{constructor(e,t="",s=300,i){super(e,t),this.onScrollOffset=s,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,s=this.lastScrollPosition;this.onScrolledTop&&s<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-s<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}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 h extends a{constructor(e,t="",s=300,n=15,o=document.createElement("div")){if(super(e,t,o),this.onScrollOffset=s,this.splitCount=n,this.container=o,this.container.classList.add("scrollable-x"),!i.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"}}},709:(e,t,s)=>{s.d(t,{Z:()=>r});var i=s(2398),n=s(6272),o=s(4762),l=s(503);class r extends l.Z{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 s;o.IS_APPLE?s=-.16*e:o.IS_ANDROID&&(s=0),t.style.setProperty("--letter-spacing",s+"px")}const s=this.setValueSilently.bind(this);this.setValueSilently=e=>{s(e),(0,i.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const s=this.value;let i;Math.abs(s.length-this.lastValue.length)>1&&!this.pasted&&o.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+s),this.pasted=!1,this.setLabel();let l,r,c,a="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=(0,n.u)(this.value),l=i.formatted,r=i.country,a=i.leftPattern,c=i.code,this.setValueSilently(this.lastValue=l?"+"+l:"")),t.dataset.leftPattern=a,e.onInput&&e.onInput(i)})),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}))}}},4668:(e,t,s)=>{function i(e,t){return e.closest(t)}s.d(t,{Z:()=>i})},2398:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(5432);function n(e,t=!1){if(!i.Z||t&&document.activeElement===e)if(e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else if(void 0!==window.getSelection&&void 0!==document.createRange){var s=document.createRange();s.selectNodeContents(e),s.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(s)}else if(void 0!==document.body.createTextRange){var o=document.body.createTextRange();o.moveToElementText(e),o.collapse(!1),o.select()}}window.placeCaretAtEnd=n},1656:(e,t,s)=>{function i(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>i(e,!t)}s.d(t,{Z:()=>i})},6272:(e,t,s)=>{s.d(t,{u:()=>r});var i=s(2325);const n=new Map;let o=0;const l=(e,t,s="")=>{s=t.country_code+s,o=Math.max(o,s.length),n.set(s,{country:e,code:t})};function r(e){e=e||"",n.size||i.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((s=>{l(e,t,s)})):l(e,t)}))}));let t=e.replace(/\D/g,"");const s=t.slice(0,o);let r;for(let e=s.length-1;e>=0&&(r=n.get(s.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const c=r.country,a=r.code.patterns||[],d=t.slice(r.code.country_code.length);let h="",u=0,p="";for(let e=a.length-1;e>=0;--e){h=a[e];const t=h.replace(/ /g,"");let s=0;for(let e=0,i=Math.min(d.length,t.length);eu&&(u=s,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,s)=>{" "===e&&" "!==t[s]&&t.length>s&&(t=t.slice(0,s)+" "+t.slice(s))}));let m=h&&h.length>t.length?h.slice(t.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:t,country:c,code:r.code,leftPattern:m}}},9750:(e,t,s)=>{function i(e,t){const s=t.split(".");let i=e;return s.forEach((e=>{e&&(i=i[e])})),i}s.d(t,{Z:()=>i})}}]); +//# sourceMappingURL=665.36cc8e85c02a51d78eff.chunk.js.map \ No newline at end of file diff --git a/public/665.36cc8e85c02a51d78eff.chunk.js.map b/public/665.36cc8e85c02a51d78eff.chunk.js.map new file mode 100644 index 000000000..afc6b00ed --- /dev/null +++ b/public/665.36cc8e85c02a51d78eff.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"665.36cc8e85c02a51d78eff.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/object/getDeepProperty.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from '../helpers/listenerSetter';\r\nimport ripple from './ripple';\r\nimport {LangPackKey, _i18n} from '../lib/langPack';\r\nimport getDeepProperty from '../helpers/object/getDeepProperty';\r\nimport rootScope from '../lib/rootScope';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string,\r\n round?: boolean,\r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n listenerSetter?: ListenerSetter\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n let loaded = false;\r\n const onChange = () => {\r\n if(!loaded) {\r\n return;\r\n }\r\n\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\r\n };\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n loaded = true;\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n });\r\n\r\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\r\n else input.addEventListener('change', onChange);\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n\r\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n\r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n\r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n\r\n box.append(border, bg, checkSvg);\r\n\r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n // label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\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\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 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 this.liMap.get(c.iso2).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 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 this.liMap.get(c.iso2).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 this.liMap.get(c.iso2).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 simulateEvent(this.input, 'input');\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport {logger, LogTypes} from '../lib/logger';\r\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\r\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {IS_ANDROID} from '../environment/userAgent';\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\r\n //_el.style.display = '';\r\n //return;\r\n\r\n let el = _el.parentElement;\r\n let height = el.scrollHeight;\r\n let width = el.scrollWidth;\r\n el.style.width = width + 'px';\r\n el.style.height = height + 'px';\r\n _el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver((entries) => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nconst SCROLL_THROTTLE = IS_ANDROID ? 200 : 24;\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n\r\n protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach((c) => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n // this.onScroll();\r\n }\r\n\r\n public addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n\r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\r\n }\r\n\r\n public destroy() {\r\n this.removeListeners();\r\n this.onAdditionalScroll = undefined;\r\n this.onScrolledTop = undefined;\r\n this.onScrolledBottom = undefined;\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n // return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n // if(this.debug) {\r\n // this.log('onScroll call', this.onScrollMeasure);\r\n // }\r\n\r\n // return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) return;\r\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = window.setTimeout(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n // lastScrollDirection check is useless here, every callback should decide on its own\r\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\r\n this.onAdditionalScroll();\r\n }\r\n\r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n // });\r\n }, SCROLL_THROTTLE);\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n // window.cancelAnimationFrame(this.onScrollMeasure);\r\n clearTimeout(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\r\n }\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n\r\n get scrollTop() {\r\n // this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n\r\n public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\r\n }\r\n\r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n\r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag)\r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n\r\n el.focus();\r\n if(el instanceof HTMLInputElement) {\r\n const length = el.value.length;\r\n el.selectionStart = length;\r\n el.selectionEnd = length;\r\n } else if(typeof window.getSelection !== 'undefined' && typeof document.createRange !== 'undefined') {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== 'undefined') {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n\r\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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] || _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","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach((key) => {\n if(!key) {\n return;\n }\n\n // @ts-ignore\n o = o[key];\n });\n\n return o;\n}\n"],"names":["CheckboxField","constructor","options","label","this","document","createElement","classList","add","restriction","round","disabled","toggleDisability","input","type","name","id","checked","stateKey","loaded","onChange","value","stateValues","then","state","stateValue","indexOf","setValueSilently","listenerSetter","addEventListener","span","text","textArgs","append","toggle","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withRipple","undefined","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","countries","setCountries","country","pFlags","hidden","sort","a","b","default_name","localeCompare","init","CountryInputField","super","hidePicker","hideTimeout","selectWrapper","remove","window","setTimeout","selectCountryByTarget","target","defaultName","querySelector","dataset","phoneCodeEl","phoneCode","innerText","countryCode","replace","lastCountrySelected","find","c","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","Map","container","arrowDown","selectList","appendChild","initSelect","forEach","emoji","iso2","liArr","i","length","Math","min","noPhoneCodes","Infinity","li","wrapped","spanEmoji","el","push","set","e","button","get","style","display","clearTimeout","offsetWidth","select","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","onKeyPress","key","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","good","str","blur","cancelBubble","preventDefault","focus","getSelected","code","selectCountryByIso2","override","countryName","SCROLL_THROTTLE","IS_ANDROID","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollPosition","scrollProperty","checkForTriggers","log","Array","from","children","addScrollListener","addedScrollListener","passive","removeScrollListener","setListeners","removeHeavyAnimationListener","removeListeners","destroy","scrollIntoViewNew","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setVirtualContainer","prepend","elements","padding","getDistanceToEnd","offsetHeight","isScrolledDown","y","setScrollTopSilently","ignoreNextScrollEvent","once","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","TelInputField","pasted","lastValue","telEl","HTMLInputElement","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","IS_APPLE","setProperty","originalFunc","bind","formattedPhoneNumber","abs","IS_APPLE_MOBILE","setLabel","formatted","leftPattern","onInput","metaKey","shiftKey","findUpTag","tag","closest","placeCaretAtEnd","ignoreTouchCheck","activeElement","selectionStart","selectionEnd","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","setAttribute","removeAttribute","prefixes","maxPrefixLength","setPrefix","prefix","max","formatPhoneNumber","originalStr","size","slice","prefixCountry","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","symbol","idx","getDeepProperty","object","splitted","o"],"sourceRoot":""} \ No newline at end of file diff --git a/public/665.bd7f059d45a21bedf74a.chunk.js b/public/665.bd7f059d45a21bedf74a.chunk.js deleted file mode 100644 index 50da48c4a..000000000 --- a/public/665.bd7f059d45a21bedf74a.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[665],{9807:(e,t,s)=>{s.d(t,{Z:()=>a});var i=s(1405),n=s(2325),o=s(9750),l=s(3512),r=s(3789);class a{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);const s=this.input=document.createElement("input");if(s.classList.add("checkbox-field-input"),s.type="checkbox",e.name&&(s.id="input-"+e.name),e.checked&&(s.checked=!0),e.stateKey){let t=!1;const i=()=>{if(!t)return;let i;i=e.stateValues?e.stateValues[s.checked?1:0]:s.checked,l.Z.managers.appStateManager.setByKey(e.stateKey,i)};r.Z.getState().then((s=>{t=!0;const i=(0,o.Z)(s,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(i):i,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(s)("change",i):s.addEventListener("change",i)}let a;if(e.text?(a=this.span=document.createElement("span"),a.classList.add("checkbox-caption"),(0,n.$d)(a,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(s),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 s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("checkbox-box-check"),s.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),s.append(i);const n=document.createElement("div");n.classList.add("checkbox-box-background");const o=document.createElement("div");o.classList.add("checkbox-box-border"),e.append(o,n,s),t.append(e)}a&&t.append(a),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,i.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)}}},5431:(e,t,s)=>{s.d(t,{Z:()=>E});var i=s(9976),n=s(3910),o=s(6669),l=s(8497),r=s(4668),a=s(5565),c=s(130),d=s(4789),h=s(144),u=s(2325),p=s(8115),m=s(3512),v=s(671),g=s(503),f=s(8805);let y;const S=()=>{y=u.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 L=()=>{S(),m.Z.addEventListener("language_change",(()=>{S()}))};class E extends g.Z{constructor(e={}){super(Object.assign({label:"Country",name:(0,h.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,s;const i=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),l=null==n?void 0:n.innerText,r=l&&l.replace(/\D/g,"");(0,a.Z)(this.input,(0,u.ag)(i)),(0,o.Z)(this.input,"input"),this.lastCountrySelected=y.find((e=>e.default_name===i)),this.lastCountryCodeSelected=r&&this.lastCountrySelected.country_codes.find((e=>e.country_code===r)),null===(s=(t=this.options).onCountryChange)||void 0===s||s.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},L&&(L(),L=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 s=document.createElement("span");s.classList.add("arrow","arrow-down"),this.container.append(s);const m=document.createElement("ul");t.appendChild(m),new f.ZP(t);let g=()=>{g=null,y.forEach((t=>{const s=(0,v.Ml)(t.iso2),n=[];for(let o=0,l=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);o{if(0!==e.button)return;const t=(0,r.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};g(),this.input.addEventListener("focus",(e=>{g?g():y.forEach((e=>{this.liMap.get(e.iso2).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,d.Z)({container:(0,l.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{S||(document.addEventListener("mousedown",E,{capture:!0}),S=!0)}),0)}));let S=!1;const E=e=>{(0,l.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",E,{capture:!0}),S=!1)},b=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;let s=this.value.toLowerCase(),i=[];y.forEach((e=>{const t=[e.name,e.default_name,e.iso2];t.filter(Boolean).forEach((e=>{const s=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");s.length>1&&t.push(s)}));let n=!!t.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(s)));this.liMap.get(e.iso2).forEach((e=>e.style.display=n?"":"none")),n&&i.push(e)})),0===i.length?y.forEach((e=>{this.liMap.get(e.iso2).forEach((e=>e.style.display=""))})):1===i.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(i[0].iso2)[0]))};this.input.addEventListener("keyup",b),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&b(e)})),s.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,s){var i,n;(0,a.Z)(this.input,e?(0,u.ag)(e.default_name):s),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(i=this.options).onCountryChange)||void 0===n||n.call(i,this.lastCountrySelected,this.lastCountryCodeSelected)}}},8805:(e,t,s)=>{s.d(t,{ZP:()=>c,v7:()=>d});var i=s(5432),n=s(5003),o=s(4789),l=s(8594),r=s(3910);class a{constructor(e,t="",s=document.createElement("div")){this.el=e,this.container=s,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,l.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,o.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class c extends a{constructor(e,t="",s=300,i){super(e,t),this.onScrollOffset=s,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,s=this.lastScrollPosition;this.onScrolledTop&&s<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-s<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}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 d extends a{constructor(e,t="",s=300,n=15,o=document.createElement("div")){if(super(e,t,o),this.onScrollOffset=s,this.splitCount=n,this.container=o,this.container.classList.add("scrollable-x"),!i.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"}}},709:(e,t,s)=>{s.d(t,{Z:()=>r});var i=s(2398),n=s(6272),o=s(4762),l=s(503);class r extends l.Z{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let 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 s;o.IS_APPLE?s=-.16*e:o.IS_ANDROID&&(s=0),t.style.setProperty("--letter-spacing",s+"px")}const s=this.setValueSilently.bind(this);this.setValueSilently=e=>{s(e),(0,i.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const s=this.value;let i;Math.abs(s.length-this.lastValue.length)>1&&!this.pasted&&o.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+s),this.pasted=!1,this.setLabel();let l,r,a,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=(0,n.u)(this.value),l=i.formatted,r=i.country,c=i.leftPattern,a=i.code,this.setValueSilently(this.lastValue=l?"+"+l:"")),t.dataset.leftPattern=c,e.onInput&&e.onInput(i)})),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}))}}},4668:(e,t,s)=>{function i(e,t){return e.closest(t)}s.d(t,{Z:()=>i})},2398:(e,t,s)=>{s.d(t,{Z:()=>n});var i=s(5432);function n(e,t=!1){if(!i.Z||t&&document.activeElement===e)if(e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else if(void 0!==window.getSelection&&void 0!==document.createRange){var s=document.createRange();s.selectNodeContents(e),s.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(s)}else if(void 0!==document.body.createTextRange){var o=document.body.createTextRange();o.moveToElementText(e),o.collapse(!1),o.select()}}window.placeCaretAtEnd=n},1656:(e,t,s)=>{function i(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>i(e,!t)}s.d(t,{Z:()=>i})},6272:(e,t,s)=>{s.d(t,{u:()=>r});var i=s(2325);const n=new Map;let o=0;const l=(e,t,s="")=>{s=t.country_code+s,o=Math.max(o,s.length),n.set(s,{country:e,code:t})};function r(e){e=e||"",n.size||i.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((s=>{l(e,t,s)})):l(e,t)}))}));let t,s=e.replace(/\D/g,""),r=s.slice(0,o);for(let e=r.length-1;e>=0&&(t=n.get(r.slice(0,e+1)),!t);--e);if(!t)return{formatted:s,country:void 0,code:void 0,leftPattern:""};const a=t.country,c=t.code.patterns||[],d=s.slice(t.code.country_code.length);let h="",u=0,p="";for(let e=c.length-1;e>=0;--e){h=c[e];const t=h.replace(/ /g,"");let s=0;for(let e=0,i=Math.min(d.length,t.length);eu&&(u=s,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=t.code.country_code+" "+h,h.split("").forEach(((e,t)=>{" "===e&&" "!==s[t]&&s.length>t&&(s=s.slice(0,t)+" "+s.slice(t))}));let m=h&&h.length>s.length?h.slice(s.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:s,country:a,code:t.code,leftPattern:m}}},9750:(e,t,s)=>{function i(e,t){const s=t.split(".");let i=e;return s.forEach((e=>{e&&(i=i[e])})),i}s.d(t,{Z:()=>i})}}]); -//# sourceMappingURL=665.bd7f059d45a21bedf74a.chunk.js.map \ No newline at end of file diff --git a/public/665.bd7f059d45a21bedf74a.chunk.js.map b/public/665.bd7f059d45a21bedf74a.chunk.js.map deleted file mode 100644 index a3d98a5fa..000000000 --- a/public/665.bd7f059d45a21bedf74a.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"665.bd7f059d45a21bedf74a.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/object/getDeepProperty.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ripple from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport getDeepProperty from \"../helpers/object/getDeepProperty\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n listenerSetter?: ListenerSetter\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n let loaded = false;\r\n const onChange = () => {\r\n if(!loaded) {\r\n return;\r\n }\r\n\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\r\n };\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n loaded = true;\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n });\r\n\r\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\r\n else input.addEventListener('change', onChange);\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\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\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 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 let 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 this.liMap.get(c.iso2).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 let _value = this.value.toLowerCase();\n let matches: HelpCountry[] = [];\n countries.forEach((c) => {\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 let good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\n\n this.liMap.get(c.iso2).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 this.liMap.get(c.iso2).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 simulateEvent(this.input, 'input');\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver((entries) => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n \r\n protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach((c) => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n public addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n \r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\r\n }\r\n\r\n public destroy() {\r\n this.removeListeners();\r\n this.onAdditionalScroll = undefined;\r\n this.onScrolledTop = undefined;\r\n this.onScrolledBottom = undefined;\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n // return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) return;\r\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = window.setTimeout(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n // lastScrollDirection check is useless here, every callback should decide on its own\r\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n // });\r\n }, 200);\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n // window.cancelAnimationFrame(this.onScrollMeasure);\r\n clearTimeout(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\r\n }\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n \r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n\r\n public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 let 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(el instanceof HTMLInputElement) {\r\n const length = el.value.length;\r\n el.selectionStart = length;\r\n el.selectionEnd = length;\r\n } else if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n\r\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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 let 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] || _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","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach((key) => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n"],"names":["CheckboxField","constructor","options","label","this","document","createElement","classList","add","restriction","round","disabled","toggleDisability","input","type","name","id","checked","stateKey","loaded","onChange","value","stateValues","then","state","stateValue","indexOf","setValueSilently","listenerSetter","addEventListener","span","text","textArgs","append","toggle","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withRipple","undefined","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","countries","setCountries","country","pFlags","hidden","sort","a","b","default_name","localeCompare","init","CountryInputField","super","hidePicker","hideTimeout","selectWrapper","remove","window","setTimeout","selectCountryByTarget","target","defaultName","querySelector","dataset","phoneCodeEl","phoneCode","innerText","countryCode","replace","lastCountrySelected","find","c","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","Map","container","arrowDown","selectList","appendChild","initSelect","forEach","emoji","iso2","liArr","i","length","Math","min","noPhoneCodes","Infinity","li","wrapped","spanEmoji","el","push","set","e","button","get","style","display","clearTimeout","offsetWidth","select","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","onKeyPress","key","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","good","str","blur","cancelBubble","preventDefault","focus","getSelected","code","selectCountryByIso2","override","countryName","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollPosition","scrollProperty","checkForTriggers","log","Array","from","children","addScrollListener","addedScrollListener","passive","removeScrollListener","setListeners","removeHeavyAnimationListener","removeListeners","destroy","scrollIntoViewNew","Scrollable","onScrollOffset","withPaddingContainer","loadedAll","top","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setVirtualContainer","prepend","elements","padding","getDistanceToEnd","offsetHeight","isScrolledDown","y","setScrollTopSilently","ignoreNextScrollEvent","once","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","TelInputField","pasted","lastValue","telEl","HTMLInputElement","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","IS_APPLE","IS_ANDROID","setProperty","originalFunc","bind","formattedPhoneNumber","abs","IS_APPLE_MOBILE","setLabel","formatted","leftPattern","onInput","metaKey","shiftKey","findUpTag","tag","closest","placeCaretAtEnd","ignoreTouchCheck","activeElement","selectionStart","selectionEnd","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","setAttribute","removeAttribute","prefixes","maxPrefixLength","setPrefix","prefix","max","formatPhoneNumber","originalStr","size","prefixCountry","slice","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","symbol","idx","getDeepProperty","object","splitted","o"],"sourceRoot":""} \ No newline at end of file diff --git a/public/709.77e1421caf56d9ff127a.chunk.js b/public/709.77e1421caf56d9ff127a.chunk.js new file mode 100644 index 000000000..d46078e8f --- /dev/null +++ b/public/709.77e1421caf56d9ff127a.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[709],{4494:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2325),r=n(1405);const a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),(0,r.Z)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append((0,i.ag)(t.text)),n}},9638:(e,t,n)=>{n.d(t,{Z:()=>p});var i=n(3910),r=n(2738),a=n(4541),s=n(2325),o=n(3512),d=n(4494),l=n(279);let c,u=!1;function p(e){u||(c||(c=o.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==s.ZP.lastRequestedLangCode?Promise.all([e,s.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),s.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const c=[];n.forEach((e=>{const t=s.ZP.strings.get(e.key);t&&(c.push(t),s.ZP.strings.set(e.key,e))}));const p="Login.ContinueOnLanguage",g=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:p});g.lastElementChild.classList.remove("i18n"),(0,a.Z)({text:[s.ZP.format(p,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(g)}))})),o.Z.addEventListener("language_change",(()=>{g.remove()}),{once:!0}),c.forEach((e=>{s.ZP.strings.set(e.key,e)})),(0,r.fc)(g,(e=>{(0,i.Z)(e),u=!0,g.disabled=!0,(0,l.y)(g),s.ZP.getLangPack(t.suggested_lang_code)}))}))}},279:(e,t,n)=>{function i(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function r(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,i(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}n.d(t,{p:()=>r,y:()=>i}),n(410).GO.putPreloader=i},1405:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(8497),r=n(9674),a=n(5432),s=n(3512),o=n(5975);let d=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,c=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[l?"prepend":"append"](u);const g=(e,i)=>{const s=Date.now(),o=document.createElement("div"),l=d++,c=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");p=()=>{const e=Date.now()-s,t=()=>{r.Z.mutate((()=>{o.remove()})),n&&n(l)};if(eo.classList.add("hiding")),Math.max(n-c/2,0)),setTimeout(t,n)}else o.classList.add("hiding"),setTimeout(t,c/2);a.Z||window.removeEventListener("contextmenu",p),p=null,h=!1},t&&t(l),window.requestAnimationFrame((()=>{const t=u.getBoundingClientRect();o.classList.add("c-ripple__circle");const n=e-t.left,r=i-t.top,a=Math.sqrt(Math.pow(Math.abs(r-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),s=n-a/2,d=r-a/2;o.style.width=o.style.height=a+"px",o.style.left=s+"px",o.style.top=d+"px",u.append(o)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,i.Z)(t.target,"c-ripple")!==u)&&(c===e||!(0,o.Z)(t.target,c));let h=!1;if(a.Z){const e=()=>{p&&p()};c.addEventListener("touchstart",(t=>{if(!s.Z.settings.animationsEnabled)return;if(t.touches.length>1||h||m(t))return;h=!0;const{clientX:n,clientY:i}=t.touches[0];g(n,i),c.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),c.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else c.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!s.Z.settings.animationsEnabled)return;if("0"===c.dataset.ripple||m(e))return;if(h)return void(h=!1);const{clientX:t,clientY:n}=e;g(t,n),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},4484:(e,t,n)=>{function i(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ii})},9674:(e,t,n)=>{n.d(t,{Z:()=>d});var i=n(3035),r=n(3725),a=n(410),s=n(8487);const o=new class{constructor(){this.promises={},this.raf=i.T2.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=(0,r.Z)()),void 0!==t&&n.then((()=>t())),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=(0,s.Z)(e),i=n?this.mutate():Promise.resolve();return void 0!==t&&(n?t():i.then((()=>t()))),i}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=o);const d=o},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var i=n(4874),r=n(4159),a=n(4494),s=n(2325),o=n(3512),d=n(279),l=n(9638),c=n(5418),u=n(4484);function p(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var g=function(e,t,n,i){return new(n||(n=Promise))((function(r,a){function s(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,o)}d((i=i.apply(e,t||[])).next())}))};let m;const h=new i.Z("page-signQR",!0,(()=>m),(()=>{m||(m=g(void 0,void 0,void 0,(function*(){const e=h.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const i=document.createElement("div");i.classList.add("input-wrapper");const v=(0,a.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});i.append(v),(0,l.Z)(i);const f=e.parentElement,w=document.createElement("h4");(0,s.$d)(w,"Login.QR.Title");const y=document.createElement("ol");y.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,s.ag)(e)),y.append(t)})),f.append(w,y,i),v.addEventListener("click",(()=>{Promise.all([n.e(458),n.e(665),n.e(53)]).then(n.bind(n,810)).then((e=>e.default.mount())),Z=!0}));const L=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let Z=!1;o.Z.addEventListener("user_auth",(()=>{Z=!0,m=null}),{once:!0});const E={ignoreErrors:!0};let b;const P=i=>g(void 0,void 0,void 0,(function*(){try{let a=yield o.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:r.Z.id,api_hash:r.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===a._&&(E.dcId||(E.dcId=a.dc_id,o.Z.managers.apiManager.setBaseDcId(a.dc_id)),a=yield o.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:a.token},E)),"auth.loginTokenSuccess"===a._){const e=a.authorization;return o.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!b||!(0,u.Z)(b,a.token)){b=a.token;const n="tg://login?token="+function(e){let t,n="";for(let i=e.length,r=0,a=0;a>>t&24),2!==t&&i-a!=1||(n+=String.fromCharCode(p(r>>>18&63),p(r>>>12&63),p(r>>>6&63),p(63&r)),r=0);return n.replace(/A(?=A$|$)/g,"=")}(a.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""),i=window.getComputedStyle(document.documentElement),r=i.getPropertyValue("--surface-color").trim(),s=i.getPropertyValue("--primary-text-color").trim(),o=i.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${o}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)}))})),l=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:s,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:r},qrOptions:{errorCorrectionLevel:"L"}});let u;l.append(e),e.lastChild.classList.add("qr-canvas"),u=l._drawingPromise?l._drawingPromise:Promise.race([(0,c.Z)(1e3),new Promise((e=>{l._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield u.then((()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout((()=>{n.style.display=""}),150),setTimeout((()=>{n.style.animation=""}),500),t=void 0}else Array.from(e.children).slice(0,-1).forEach((e=>{e.remove()}))}))}if(i){const e=Date.now()/1e3,t=a.expires-e-(yield o.Z.managers.timeManager.getServerTimeOffset());yield(0,c.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,Promise.all([n.e(458),n.e(774)]).then(n.bind(n,9437)).then((e=>e.default.mount())),Z=!0,m=null):(console.error("pageSignQR: default error:",e),Z=!0),!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(Z=!1;!Z&&!(yield P(!0)););}))}))),m.then((e=>{e()})),o.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),v=h}}]); +//# sourceMappingURL=709.77e1421caf56d9ff127a.chunk.js.map \ No newline at end of file diff --git a/public/709.77e1421caf56d9ff127a.chunk.js.map b/public/709.77e1421caf56d9ff127a.chunk.js.map new file mode 100644 index 000000000..33aa212a2 --- /dev/null +++ b/public/709.77e1421caf56d9ff127a.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"709.77e1421caf56d9ff127a.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport ripple from './ripple';\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true,\r\n onlyMobile: true,\r\n icon: string,\r\n rippleSquare: true,\r\n text: LangPackKey,\r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport rootScope from '../lib/rootScope';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement,\r\n callback: (id: number) => Promise = () => Promise.resolve(),\r\n onEnd: (id: number) => void = null,\r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n // return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n\r\n const r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n // let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n\r\n // console.log('ripple drawRipple');\r\n\r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n // console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n // handler = () => animationEndPromise.then((duration) => {\r\n // console.log('ripple animation was:', duration);\r\n\r\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n // return;\r\n const elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n\r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n const delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n // });\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n // console.log('ripple after promise', Date.now() - startTime);\r\n // console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n\r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n // r.classList.add('active');\r\n // handler();\r\n });\r\n // });\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\r\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem ||\r\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n const touchEnd = () => {\r\n handler && handler();\r\n };\r\n\r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n // console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n\r\n // console.log('touchstart', e);\r\n touchStartFired = true;\r\n\r\n const {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n\r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n\r\n const {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element\r\n * @param callback\r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26 ?\n nUint6 + 65 :\n nUint6 < 52 ?\n nUint6 + 71 :\n nUint6 < 62 ?\n nUint6 - 4 :\n nUint6 === 62 ?\n 43 :\n nUint6 === 63 ?\n 47 :\n 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {DcId} from '../types';\r\nimport Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then((m) => m.default.mount());\r\n stop = true;\r\n });\r\n\r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n\r\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then((res) => res.text())\r\n .then((text) => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n // return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: 'L'\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\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"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","lastElementChild","remove","window","requestAnimationFrame","once","e","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","addEventListener","touches","length","cancelBubble","stopPropagation","passive","dataset","bytesCmp","bytes1","bytes2","len","i","sequentialDom","promises","raf","scheduled","do","kind","promise","this","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","uint6ToBase64","nUint6","imageDiv","pageEl","preloader","inputWrapper","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","ignoreErrors","prevToken","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","diff","expires","err","console","warn","handled","error","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/709.c86dad481a67083f516b.chunk.js b/public/709.c86dad481a67083f516b.chunk.js deleted file mode 100644 index f96380211..000000000 --- a/public/709.c86dad481a67083f516b.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[709],{4494:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2325),r=n(1405);const a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),(0,r.Z)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append((0,i.ag)(t.text)),n}},9638:(e,t,n)=>{n.d(t,{Z:()=>p});var i=n(3910),r=n(2738),a=n(4541),s=n(2325),o=n(3512),d=n(4494),l=n(279);let c,u=!1;function p(e){u||(c||(c=o.Z.managers.apiManager.getConfig().then((e=>e.suggested_lang_code!==s.ZP.lastRequestedLangCode?Promise.all([e,s.ZP.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),s.ZP.getCacheLangPack()]):[])))).then((([t,n])=>{if(!t)return;const c=[];n.forEach((e=>{const t=s.ZP.strings.get(e.key);t&&(c.push(t),s.ZP.strings.set(e.key,e))}));const p="Login.ContinueOnLanguage",g=(0,d.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:p});g.lastElementChild.classList.remove("i18n"),(0,a.Z)({text:[s.ZP.format(p,!0)]}).then((()=>{window.requestAnimationFrame((()=>{e.append(g)}))})),o.Z.addEventListener("language_change",(()=>{g.remove()}),{once:!0}),c.forEach((e=>{s.ZP.strings.set(e.key,e)})),(0,r.fc)(g,(e=>{(0,i.Z)(e),u=!0,g.disabled=!0,(0,l.y)(g),s.ZP.getLangPack(t.suggested_lang_code)}))}))}},279:(e,t,n)=>{function i(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function r(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,i(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}n.d(t,{p:()=>r,y:()=>i}),n(410).GO.putPreloader=i},1405:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(8497),r=n(9674),a=n(5432),s=n(3512),o=n(5975);let d=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,c=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u,p=document.createElement("div");p.classList.add("c-ripple"),e.classList.contains("rp-square")&&p.classList.add("is-square"),e[l?"prepend":"append"](p);const g=(e,i)=>{const s=Date.now(),o=document.createElement("div"),l=d++,c=1e3*+window.getComputedStyle(p).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let e=Date.now()-s;const t=()=>{r.Z.mutate((()=>{o.remove()})),n&&n(l)};if(eo.classList.add("hiding")),Math.max(n-c/2,0)),setTimeout(t,n)}else o.classList.add("hiding"),setTimeout(t,c/2);a.Z||window.removeEventListener("contextmenu",u),u=null,h=!1},t&&t(l),window.requestAnimationFrame((()=>{const t=p.getBoundingClientRect();o.classList.add("c-ripple__circle");const n=e-t.left,r=i-t.top,a=Math.sqrt(Math.pow(Math.abs(r-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),s=n-a/2,d=r-a/2;o.style.width=o.style.height=a+"px",o.style.left=s+"px",o.style.top=d+"px",p.append(o)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,i.Z)(t.target,"c-ripple")!==p)&&(c===e||!(0,o.Z)(t.target,c));let h=!1;if(a.Z){let e=()=>{u&&u()};c.addEventListener("touchstart",(t=>{if(!s.Z.settings.animationsEnabled)return;if(t.touches.length>1||h||m(t))return;h=!0;let{clientX:n,clientY:i}=t.touches[0];g(n,i),c.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),c.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else c.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!s.Z.settings.animationsEnabled)return;if("0"===c.dataset.ripple||m(e))return;if(h)return void(h=!1);let{clientX:t,clientY:n}=e;g(t,n),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})}),{passive:!0})}},4484:(e,t,n)=>{function i(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ii})},9674:(e,t,n)=>{n.d(t,{Z:()=>d});var i=n(3035),r=n(3725),a=n(410),s=n(8487);const o=new class{constructor(){this.promises={},this.raf=i.T2.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=(0,r.Z)()),void 0!==t&&n.then((()=>t())),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=(0,s.Z)(e),i=n?this.mutate():Promise.resolve();return void 0!==t&&(n?t():i.then((()=>t()))),i}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=o);const d=o},9709:(e,t,n)=>{n.r(t),n.d(t,{default:()=>v});var i=n(4874),r=n(4159),a=n(4494),s=n(2325),o=n(3512),d=n(279),l=n(9638),c=n(5418),u=n(4484);function p(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}var g=function(e,t,n,i){return new(n||(n=Promise))((function(r,a){function s(e){try{d(i.next(e))}catch(e){a(e)}}function o(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,o)}d((i=i.apply(e,t||[])).next())}))};let m;const h=new i.Z("page-signQR",!0,(()=>m),(()=>{m||(m=g(void 0,void 0,void 0,(function*(){const e=h.pageEl.querySelector(".auth-image");let t=(0,d.y)(e,!0);const i=document.createElement("div");i.classList.add("input-wrapper");const v=(0,a.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});i.append(v),(0,l.Z)(i);const f=e.parentElement,w=document.createElement("h4");(0,s.$d)(w,"Login.QR.Title");const y=document.createElement("ol");y.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach((e=>{const t=document.createElement("li");t.append((0,s.ag)(e)),y.append(t)})),f.append(w,y,i),v.addEventListener("click",(()=>{Promise.all([n.e(458),n.e(665),n.e(53)]).then(n.bind(n,810)).then((e=>e.default.mount())),Z=!0}));const L=(yield Promise.all([n.e(630).then(n.t.bind(n,1915,23))]))[0].default;let Z=!1;o.Z.addEventListener("user_auth",(()=>{Z=!0,m=null}),{once:!0});let E,b={ignoreErrors:!0};const P=i=>g(void 0,void 0,void 0,(function*(){try{let a=yield o.Z.managers.apiManager.invokeApi("auth.exportLoginToken",{api_id:r.Z.id,api_hash:r.Z.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===a._&&(b.dcId||(b.dcId=a.dc_id,o.Z.managers.apiManager.setBaseDcId(a.dc_id)),a=yield o.Z.managers.apiManager.invokeApi("auth.importLoginToken",{token:a.token},b)),"auth.loginTokenSuccess"===a._){const e=a.authorization;return o.Z.managers.apiManager.setUser(e.user),n.e(781).then(n.bind(n,5436)).then((e=>e.default.mount())),!0}if(!E||!(0,u.Z)(E,a.token)){E=a.token;let n="tg://login?token="+function(e){let t,n="";for(let i=e.length,r=0,a=0;a>>t&24),2!==t&&i-a!=1||(n+=String.fromCharCode(p(r>>>18&63),p(r>>>12&63),p(r>>>6&63),p(63&r)),r=0);return n.replace(/A(?=A$|$)/g,"=")}(a.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"");const i=window.getComputedStyle(document.documentElement),r=i.getPropertyValue("--surface-color").trim(),s=i.getPropertyValue("--primary-text-color").trim(),o=i.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then((e=>e.text())).then((e=>{e=e.replace(/(fill:).+?(;)/,`$1${o}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)}))})),l=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:d,dotsOptions:{color:s,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:r},qrOptions:{errorCorrectionLevel:"L"}});let u;l.append(e),e.lastChild.classList.add("qr-canvas"),u=l._drawingPromise?l._drawingPromise:Promise.race([(0,c.Z)(1e3),new Promise((e=>{l._canvas._image.addEventListener("load",(()=>{window.requestAnimationFrame((()=>e()))}),{once:!0})}))]),yield u.then((()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout((()=>{n.style.display=""}),150),setTimeout((()=>{n.style.animation=""}),500),t=void 0}else Array.from(e.children).slice(0,-1).forEach((e=>{e.remove()}))}))}if(i){let e=Date.now()/1e3,t=a.expires-e-(yield o.Z.managers.timeManager.getServerTimeOffset());yield(0,c.Z)(t>3?3e3:1e3*t|0)}}catch(e){return"SESSION_PASSWORD_NEEDED"===e.type?(console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,Promise.all([n.e(458),n.e(442)]).then(n.bind(n,9437)).then((e=>e.default.mount())),Z=!0,m=null):(console.error("pageSignQR: default error:",e),Z=!0),!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(Z=!1;!Z&&!(yield P(!0)););}))}))),m.then((e=>{e()})),o.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignQr"})})),v=h}}]); -//# sourceMappingURL=709.c86dad481a67083f516b.chunk.js.map \ No newline at end of file diff --git a/public/709.c86dad481a67083f516b.chunk.js.map b/public/709.c86dad481a67083f516b.chunk.js.map deleted file mode 100644 index 000ff671c..000000000 --- a/public/709.c86dad481a67083f516b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"709.c86dad481a67083f516b.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ripple from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./putPreloader\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport Page from './page';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then((m) => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then((res) => res.text())\r\n .then((text) => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\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"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","lastElementChild","remove","window","requestAnimationFrame","once","e","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","handler","r","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","addEventListener","touches","length","cancelBubble","stopPropagation","passive","dataset","bytesCmp","bytes1","bytes2","len","i","sequentialDom","promises","raf","scheduled","do","kind","promise","this","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","uint6ToBase64","nUint6","imageDiv","pageEl","preloader","inputWrapper","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","rootScope","prevToken","ignoreErrors","iterate","isLoop","loginToken","api_id","api_hash","except_ids","_","dcId","dc_id","token","authorization","user","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","diff","expires","err","console","warn","handled","error","func"],"sourceRoot":""} \ No newline at end of file diff --git a/public/725.12c1ba16de4c3fac7523.chunk.js b/public/725.12c1ba16de4c3fac7523.chunk.js deleted file mode 100644 index 2b3cbf728..000000000 --- a/public/725.12c1ba16de4c3fac7523.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[725],{7625:(e,t,n)=>{function i(e,t){for(let n=e.length-1;n>=0;--n)t(e[n],n,e)}n.d(t,{Z:()=>i})},2202:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2219);let o=0;function a(e){let t;const n=null==e?void 0:e.type;if(n){const e=`${i.Z}_${o++}.mimeType.split('/')[1]`;t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t=`upload-${i.Z}_${o++}`;return t}},6658:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(7562);function o(e,t,n,o){const a=(0,i.Z)(e,null==t?void 0:t.type);let s;return s=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:a,size:t?t.size:e.size,mimeType:s,fileName:e.file_name,queueId:n,onlyCache:o}}},7562:(e,t,n)=>{function i(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}n.d(t,{Z:()=>i})},7086:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(8801);function o(e){return(0,i.P)(e.location,{fileName:e.fileName})}},1243:(e,t,n)=>{n.d(t,{Z:()=>r});var i=n(6658),o=n(7667),a=n(3114),s=n(7086);function r(e){const{media:t,thumb:n,queueId:r,onlyCache:c}=e;let l;var u;return"document"===t._?l=(0,i.Z)(t,n,r,c):"photo"===t._?l=(0,o.Z)(t,n,r,c):(0,a.Z)(t)&&(l={dcId:4,location:{_:"inputWebFileLocation",access_hash:(u=t).access_hash,url:u.url},size:u.size,mimeType:u.mime_type}),{fileName:(0,s.Z)(l),downloadOptions:l}}},3781:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(7082);function o(e){const t=i.t;return e>=t?e:t+e*i.o}},2790:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(7082);function o(e){return function(e,t){const n=i.t;if(e{n.d(t,{o:()=>i,t:()=>o});const i=65536,o=4294967295},7667:(e,t,n)=>{function i(e,t,n,i){const o="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const a=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,s={_:o?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:s,size:a?t.size:void 0,queueId:n,onlyCache:i}}n.d(t,{Z:()=>i})},3114:(e,t,n)=>{function i(e){return!(!e||"webDocument"!==e._&&"webDocumentNoProxy"!==e._)}n.d(t,{Z:()=>i})},1379:(e,t,n)=>{function i(e,t){const n=e.slice(0,t.offset),i=function(e){const t="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",n=t.length,i=[];for(let o=0;oi})},6535:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(2423);const o=["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"];function a(e){for(var t=e.length,n=e.split("(").length-1,i=e.split(")").length-1;i>n&&")"===e.charAt(t-1);)e=e.substr(0,t-1),i--,t--;return n>i&&(e=e.replace(/\)+$/,"")),e}var s=n(3447),r=n(671);function c(e){let t=(0,r.N0)(e).replace(/-?fe0f/g,"");if(s.Z.hasOwnProperty(t))return t}function l(e){let t,n=e;const s=[];let r,l=0;for(i.$2.lastIndex=0;t=n.match(i.$2);){if(r=l+t.index,t[3])s.push({_:"messageEntityMention",offset:r+t[1].length,length:t[2].length+t[3].length});else if(t[4])if(i.E.test(t[4]))s.push({_:"messageEntityEmail",offset:r,length:t[4].length});else{let e,n=t[5];const i=t[6];if(i){if(n||"xn--"!==i.substr(0,4)&&-1===o.indexOf(i.toLowerCase())||(n="http://"),n){const i=a(t[4]);i.length!==t[4].length&&(t[4]=i),e=(t[5]?"":n)+t[4]}}else e=(t[5]?"":"http://")+t[4];e&&s.push({_:"messageEntityUrl",offset:r,length:t[4].length})}else if(t[7])s.push({_:"messageEntityLinebreak",offset:r,length:1});else if(t[8]){const e=c(t[8]);e&&s.push({_:"messageEntityEmoji",offset:r,length:t[8].length,unicode:e})}else t[11]?s.push({_:"messageEntityHashtag",offset:r+(t[10]?t[10].length:0),length:t[11].length}):t[13]&&s.push({_:"messageEntityBotCommand",offset:r+(t[11]?t[11].length:0)+(t[12]?t[12].length:0),length:1+t[13].length+(t[14]?1+t[14].length:0),unsafe:!0});n=n.substr(t.index+t[0].length),l+=t.index+t[0].length}return s}}}]); -//# sourceMappingURL=725.12c1ba16de4c3fac7523.chunk.js.map \ No newline at end of file diff --git a/public/725.12c1ba16de4c3fac7523.chunk.js.map b/public/725.12c1ba16de4c3fac7523.chunk.js.map deleted file mode 100644 index 45614e213..000000000 --- a/public/725.12c1ba16de4c3fac7523.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"725.12c1ba16de4c3fac7523.chunk.js","mappings":"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","sources":["webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/getFileNameForUpload.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadFileNameFromOptions.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadMediaDetails.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/getWebDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/generateMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/getServerMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/clearMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/index.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/isWebDocument.ts","webpack://tweb/./src/lib/richTextProcessor/encodeSpoiler.ts","webpack://tweb/./src/lib/richTextProcessor/spoiler.ts","webpack://tweb/./src/config/tld.ts","webpack://tweb/./src/lib/richTextProcessor/checkBrackets.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiUnified.ts","webpack://tweb/./src/lib/richTextProcessor/parseEntities.ts"],"sourcesContent":["export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport tabId from \"../config/tabId\";\r\n\r\nlet uploadId = 0;\r\nexport default function getFileNameForUpload(file: File | Blob) {\r\n let fileName: string;\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = `${tabId}_${uploadId++}.mimeType.split('/')[1]`;\r\n\r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n } else {\r\n fileName = `upload-${tabId}_${uploadId++}`;\r\n }\r\n\r\n return fileName;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Document, PhotoSize } from \"../../../../layer\";\r\nimport type { DownloadOptions } from \"../../../mtproto/apiFileManager\";\r\nimport getDocumentInput from \"./getDocumentInput\";\r\n\r\nexport default function getDocumentDownloadOptions(doc: Document.document, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\r\n const inputFileLocation = getDocumentInput(doc, thumb?.type);\r\n\r\n let mimeType: string;\r\n if(thumb) {\r\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\r\n } else {\r\n mimeType = doc.mime_type || 'application/octet-stream';\r\n }\r\n\r\n return {\r\n dcId: doc.dc_id, \r\n location: inputFileLocation, \r\n size: thumb ? thumb.size : doc.size, \r\n mimeType,\r\n fileName: doc.file_name,\r\n queueId,\r\n onlyCache\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Document, InputFileLocation } from \"../../../../layer\";\r\n\r\nexport default function getInput(doc: Document.document, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\r\n return {\r\n _: 'inputDocumentFileLocation',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference,\r\n thumb_size: thumbSize\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getFileNameByLocation } from \"../../../../helpers/fileName\";\r\nimport { DownloadOptions } from \"../../../mtproto/apiFileManager\";\r\n\r\nexport default function getDownloadFileNameFromOptions(options: DownloadOptions) {\r\n return getFileNameByLocation(options.location, {fileName: options.fileName});\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadMediaOptions, DownloadOptions } from \"../../../mtproto/apiFileManager\";\r\nimport getDocumentDownloadOptions from \"../docs/getDocumentDownloadOptions\";\r\nimport getPhotoDownloadOptions from \"../photos/getPhotoDownloadOptions\";\r\nimport getWebDocumentDownloadOptions from \"../webDocs/getWebDocumentDownloadOptions\";\r\nimport isWebDocument from \"../webDocs/isWebDocument\";\r\nimport getDownloadFileNameFromOptions from \"./getDownloadFileNameFromOptions\";\r\n\r\nexport default function getDownloadMediaDetails(options: DownloadMediaOptions) {\r\n const {media, thumb, queueId, onlyCache} = options;\r\n \r\n let downloadOptions: DownloadOptions;\r\n if(media._ === 'document') downloadOptions = getDocumentDownloadOptions(media, thumb as any, queueId, onlyCache);\r\n else if(media._ === 'photo') downloadOptions = getPhotoDownloadOptions(media, thumb, queueId, onlyCache);\r\n else if(isWebDocument(media)) downloadOptions = getWebDocumentDownloadOptions(media);\r\n\r\n const fileName = getDownloadFileNameFromOptions(downloadOptions);\r\n return {fileName, downloadOptions};\r\n}\r\n","import { WebDocument } from \"../../../../layer\";\nimport { DownloadOptions } from \"../../../mtproto/apiFileManager\";\n\nexport default function getWebDocumentDownloadOptions(webDocument: WebDocument): DownloadOptions {\n return {\n dcId: 4,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (webDocument as WebDocument.webDocument).access_hash,\n url: webDocument.url\n },\n size: webDocument.size,\n mimeType: webDocument.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 { MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT } from \".\";\n\nexport default function generateMessageId(messageId: number) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId >= q) {\n return messageId;\n }\n\n return q + (messageId * MESSAGE_ID_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 clearMessageId from \"./clearMessageId\";\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, 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 { MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT } from \".\";\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n return messageId;\n }\n\n const l = MESSAGE_ID_INCREMENT - 1;\n const used = messageId & l;\n if(used !== l) {\n messageId -= used + 1;\n }\n\n return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","export const MESSAGE_ID_INCREMENT = 0x10000;\nexport const MESSAGE_ID_OFFSET = 0xFFFFFFFF;\n","/*\n * 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 { PhotoSize, InputFileLocation } from \"../../../../layer\";\nimport type { DownloadOptions } from \"../../../mtproto/apiFileManager\";\nimport type { MyDocument } from \"../../appDocsManager\";\nimport type { MyPhoto } from \"../../appPhotosManager\";\n\nexport default function getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n}\n","import { WebDocument } from \"../../../../layer\";\n\nexport default function isWebDocument(webDocument: any): webDocument is WebDocument {\n return !!(webDocument && (webDocument._ === 'webDocument' || webDocument._ === 'webDocumentNoProxy'));\n}\n","/*\n * 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 spoiler from \"./spoiler\";\n\nexport default function encodeSpoiler(text: string, entity: MessageEntity.messageEntitySpoiler) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = text.slice(entity.offset + entity.length);\n text = before + spoilerAfter + after;\n return {text, entityText: spoilerAfter};\n};\n","export default function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n \n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n let char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n}\n","/*\n * 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// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n}\n","import Emoji from \"../../config/emoji\";\nimport { encodeEmoji } from \"../../vendor/emoji\";\n\nexport default function getEmojiUnified(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n\n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n\n if(!Emoji.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return;\n }\n\n return unified;\n}\n","/*\n * 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 { EMAIL_REG_EXP, FULL_REG_EXP } from \".\";\nimport TLD from \"../../config/tld\";\nimport { MessageEntity } from \"../../layer\";\nimport checkBrackets from \"./checkBrackets\";\nimport getEmojiUnified from \"./getEmojiUnified\";\n\nexport default function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n FULL_REG_EXP.lastIndex = 0;\n while((match = raw.match(FULL_REG_EXP))) {\n matchIndex = rawOffset + match.index;\n\n //console.log('parseEntities match:', match);\n\n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(EMAIL_REG_EXP.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n\n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n\n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n\n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const unified = getEmojiUnified(match[8]);\n if(unified) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: unified\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n}\n"],"names":["forEachReverse","array","callback","i","length","uploadId","getFileNameForUpload","file","fileName","mimeType","type","ext","indexOf","getDocumentDownloadOptions","doc","thumb","queueId","onlyCache","inputFileLocation","sticker","mime_type","dcId","dc_id","location","size","file_name","getInput","thumbSize","_","id","access_hash","file_reference","thumb_size","getDownloadFileNameFromOptions","options","getDownloadMediaDetails","media","downloadOptions","webDocument","getPhotoDownloadOptions","isWebDocument","url","generateMessageId","messageId","q","getServerMessageId","toServer","l","used","clearMessageId","MESSAGE_ID_INCREMENT","MESSAGE_ID_OFFSET","photo","photoSize","isDocument","Error","isPhoto","undefined","encodeSpoiler","text","entity","before","slice","offset","spoilerAfter","chars","charsLength","out","char","charCodeAt","push","join","spoiler","after","entityText","checkBrackets","urlLength","urlOpenBrackets","split","urlCloseBrackets","charAt","substr","replace","getEmojiUnified","emojiCode","unified","parseEntities","match","raw","entities","matchIndex","rawOffset","index","E","protocol","tld","toLowerCase","balanced","unicode","unsafe"],"sourceRoot":""} \ No newline at end of file diff --git a/public/725.3353d4069deb997f1a89.chunk.js b/public/725.3353d4069deb997f1a89.chunk.js new file mode 100644 index 000000000..c837e181c --- /dev/null +++ b/public/725.3353d4069deb997f1a89.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[725],{7625:(e,t,n)=>{function i(e,t){for(let n=e.length-1;n>=0;--n)t(e[n],n,e)}n.d(t,{Z:()=>i})},2202:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(2219);let o=0;function a(e){let t;const n=null==e?void 0:e.type;if(n){const e=`${i.Z}_${o++}.mimeType.split('/')[1]`;t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t=`upload-${i.Z}_${o++}`;return t}},6658:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(7072);function o(e,t,n,o){const a=(0,i.Z)(e,null==t?void 0:t.type);let s;return s="photoSize"===(null==t?void 0:t._)?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:a,size:t?t.size:e.size,mimeType:s,fileName:e.file_name,queueId:n,onlyCache:o}}},7072:(e,t,n)=>{function i(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}n.d(t,{Z:()=>i})},7086:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(8801);function o(e){return(0,i.P)(e.location,e)}},1243:(e,t,n)=>{n.d(t,{Z:()=>r});var i=n(6658),o=n(7667),a=n(3114),s=n(7086);function r(e){const{media:t,thumb:n,queueId:r,onlyCache:c}=e;let l;var u;return"document"===t._?l=(0,i.Z)(t,n,r,c):"photo"===t._?l=(0,o.Z)(t,n,r,c):(0,a.Z)(t)&&(l={dcId:0,location:{_:"inputWebFileLocation",access_hash:(u=t).access_hash,url:u.url},size:u.size,mimeType:u.mime_type}),l.downloadId=e.downloadId,{fileName:(0,s.Z)(l),downloadOptions:l}}},3781:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(7082);function o(e){const t=i.t;return e>=t?e:t+e*i.o}},2790:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(7082);function o(e){return function(e,t){const n=i.t;if(e{n.d(t,{o:()=>i,t:()=>o});const i=65536,o=4294967295},7667:(e,t,n)=>{function i(e,t,n,i){const o="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const a=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,s={_:o?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:s,size:a?t.size:void 0,queueId:n,onlyCache:i}}n.d(t,{Z:()=>i})},3114:(e,t,n)=>{function i(e){return!(!e||"webDocument"!==e._&&"webDocumentNoProxy"!==e._)}n.d(t,{Z:()=>i})},1379:(e,t,n)=>{function i(e,t){const n=e.slice(0,t.offset),i=function(e){const t="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",n=t.length,i=[];for(let o=0;oi})},6535:(e,t,n)=>{n.d(t,{Z:()=>l});var i=n(2423);const o=["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"];function a(e){for(var t=e.length,n=e.split("(").length-1,i=e.split(")").length-1;i>n&&")"===e.charAt(t-1);)e=e.substr(0,t-1),i--,t--;return n>i&&(e=e.replace(/\)+$/,"")),e}var s=n(3447),r=n(671);function c(e){const t=(0,r.N0)(e).replace(/-?fe0f/g,"");if(s.Z.hasOwnProperty(t))return t}function l(e){let t,n=e;const s=[];let r,l=0;for(i.$2.lastIndex=0;t=n.match(i.$2);){if(r=l+t.index,t[3])s.push({_:"messageEntityMention",offset:r+t[1].length,length:t[2].length+t[3].length});else if(t[4])if(i.E.test(t[4]))s.push({_:"messageEntityEmail",offset:r,length:t[4].length});else{let e,n=t[5];const i=t[6];if(i){if(n||"xn--"!==i.substr(0,4)&&-1===o.indexOf(i.toLowerCase())||(n="http://"),n){const i=a(t[4]);i.length!==t[4].length&&(t[4]=i),e=(t[5]?"":n)+t[4]}}else e=(t[5]?"":"http://")+t[4];e&&s.push({_:"messageEntityUrl",offset:r,length:t[4].length})}else if(t[7])s.push({_:"messageEntityLinebreak",offset:r,length:1});else if(t[8]){const e=c(t[8]);e&&s.push({_:"messageEntityEmoji",offset:r,length:t[8].length,unicode:e})}else t[11]?s.push({_:"messageEntityHashtag",offset:r+(t[10]?t[10].length:0),length:t[11].length}):t[13]&&s.push({_:"messageEntityBotCommand",offset:r+(t[11]?t[11].length:0)+(t[12]?t[12].length:0),length:1+t[13].length+(t[14]?1+t[14].length:0),unsafe:!0});n=n.substr(t.index+t[0].length),l+=t.index+t[0].length}return s}}}]); +//# sourceMappingURL=725.3353d4069deb997f1a89.chunk.js.map \ No newline at end of file diff --git a/public/725.3353d4069deb997f1a89.chunk.js.map b/public/725.3353d4069deb997f1a89.chunk.js.map new file mode 100644 index 000000000..b799e8148 --- /dev/null +++ b/public/725.3353d4069deb997f1a89.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"725.3353d4069deb997f1a89.chunk.js","mappings":"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","sources":["webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/getFileNameForUpload.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileLocation.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadFileNameFromOptions.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadMediaDetails.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/getWebDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/generateMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/getServerMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/clearMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/index.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/isWebDocument.ts","webpack://tweb/./src/lib/richTextProcessor/encodeSpoiler.ts","webpack://tweb/./src/lib/richTextProcessor/spoiler.ts","webpack://tweb/./src/config/tld.ts","webpack://tweb/./src/lib/richTextProcessor/checkBrackets.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiUnified.ts","webpack://tweb/./src/lib/richTextProcessor/parseEntities.ts"],"sourcesContent":["export default function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport tabId from '../config/tabId';\r\n\r\nlet uploadId = 0;\r\nexport default function getFileNameForUpload(file: File | Blob) {\r\n let fileName: string;\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = `${tabId}_${uploadId++}.mimeType.split('/')[1]`;\r\n\r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n } else {\r\n fileName = `upload-${tabId}_${uploadId++}`;\r\n }\r\n\r\n return fileName;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Document, PhotoSize, VideoSize} from '../../../../layer';\r\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\r\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\r\n\r\nexport default function getDocumentDownloadOptions(doc: Document.document, thumb?: PhotoSize.photoSize | VideoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\r\n const inputFileLocation = getDocumentInputFileLocation(doc, thumb?.type);\r\n\r\n let mimeType: string;\r\n if(thumb?._ === 'photoSize') {\r\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\r\n } else {\r\n mimeType = doc.mime_type || 'application/octet-stream';\r\n }\r\n\r\n return {\r\n dcId: doc.dc_id,\r\n location: inputFileLocation,\r\n size: thumb ? thumb.size : doc.size,\r\n mimeType,\r\n fileName: doc.file_name,\r\n queueId,\r\n onlyCache\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Document, InputFileLocation} from '../../../../layer';\r\n\r\nexport default function getDocumentInputFileLocation(doc: Document.document, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\r\n return {\r\n _: 'inputDocumentFileLocation',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference,\r\n thumb_size: thumbSize\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\r\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\r\n\r\nexport default function getDownloadFileNameFromOptions(options: DownloadOptions) {\r\n return getFileNameByLocation(options.location, options);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {DownloadMediaOptions, DownloadOptions} from '../../../mtproto/apiFileManager';\r\nimport getDocumentDownloadOptions from '../docs/getDocumentDownloadOptions';\r\nimport getPhotoDownloadOptions from '../photos/getPhotoDownloadOptions';\r\nimport getWebDocumentDownloadOptions from '../webDocs/getWebDocumentDownloadOptions';\r\nimport isWebDocument from '../webDocs/isWebDocument';\r\nimport getDownloadFileNameFromOptions from './getDownloadFileNameFromOptions';\r\n\r\nexport default function getDownloadMediaDetails(options: DownloadMediaOptions) {\r\n const {media, thumb, queueId, onlyCache} = options;\r\n\r\n let downloadOptions: DownloadOptions;\r\n if(media._ === 'document') downloadOptions = getDocumentDownloadOptions(media, thumb as any, queueId, onlyCache);\r\n else if(media._ === 'photo') downloadOptions = getPhotoDownloadOptions(media, thumb as any, queueId, onlyCache);\r\n else if(isWebDocument(media)) downloadOptions = getWebDocumentDownloadOptions(media);\r\n\r\n downloadOptions.downloadId = options.downloadId;\r\n\r\n const fileName = getDownloadFileNameFromOptions(downloadOptions);\r\n return {fileName, downloadOptions};\r\n}\r\n","import {WebDocument} from '../../../../layer';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getWebDocumentDownloadOptions(webDocument: WebDocument): DownloadOptions {\n return {\n dcId: 0,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (webDocument as WebDocument.webDocument).access_hash,\n url: webDocument.url\n },\n size: webDocument.size,\n mimeType: webDocument.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 {MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function generateMessageId(messageId: number) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId >= q) {\n return messageId;\n }\n\n return q + (messageId * MESSAGE_ID_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 clearMessageId from './clearMessageId';\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, 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 {MESSAGE_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n return messageId;\n }\n\n const l = MESSAGE_ID_INCREMENT - 1;\n const used = messageId & l;\n if(used !== l) {\n messageId -= used + 1;\n }\n\n return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","export const MESSAGE_ID_INCREMENT = 0x10000;\nexport const MESSAGE_ID_OFFSET = 0xFFFFFFFF;\n","/*\n * 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 {PhotoSize, InputFileLocation} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n // console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n\n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id,\n location,\n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined,\n queueId,\n onlyCache\n };\n}\n","import {WebDocument} from '../../../../layer';\n\nexport default function isWebDocument(webDocument: any): webDocument is WebDocument {\n return !!(webDocument && (webDocument._ === 'webDocument' || webDocument._ === 'webDocumentNoProxy'));\n}\n","/*\n * 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 spoiler from './spoiler';\n\nexport default function encodeSpoiler(text: string, entity: MessageEntity.messageEntitySpoiler) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = text.slice(entity.offset + entity.length);\n text = before + spoilerAfter + after;\n return {text, entityText: spoilerAfter};\n};\n","export default function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n\n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n const char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.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 * 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// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n}\n","import Emoji from '../../config/emoji';\nimport {encodeEmoji} from '../../vendor/emoji';\n\nexport default function getEmojiUnified(emojiCode: string) {\n const unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n\n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n\n if(!Emoji.hasOwnProperty(unified)\n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n // console.error('lol', unified);\n return;\n }\n\n return unified;\n}\n","/*\n * 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 {EMAIL_REG_EXP, FULL_REG_EXP} from '.';\nimport TLD from '../../config/tld';\nimport {MessageEntity} from '../../layer';\nimport checkBrackets from './checkBrackets';\nimport getEmojiUnified from './getEmojiUnified';\n\nexport default function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n FULL_REG_EXP.lastIndex = 0;\n while((match = raw.match(FULL_REG_EXP))) {\n matchIndex = rawOffset + match.index;\n\n // console.log('parseEntities match:', match);\n\n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(EMAIL_REG_EXP.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n\n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n\n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n\n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n // console.log('hit', match[8]);\n const unified = getEmojiUnified(match[8]);\n if(unified) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: unified\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n}\n"],"names":["forEachReverse","array","callback","i","length","uploadId","getFileNameForUpload","file","fileName","mimeType","type","ext","indexOf","getDocumentDownloadOptions","doc","thumb","queueId","onlyCache","inputFileLocation","_","sticker","mime_type","dcId","dc_id","location","size","file_name","getDocumentInputFileLocation","thumbSize","id","access_hash","file_reference","thumb_size","getDownloadFileNameFromOptions","options","getDownloadMediaDetails","media","downloadOptions","webDocument","getPhotoDownloadOptions","isWebDocument","url","downloadId","generateMessageId","messageId","q","getServerMessageId","toServer","l","used","clearMessageId","MESSAGE_ID_INCREMENT","MESSAGE_ID_OFFSET","photo","photoSize","isDocument","Error","isPhoto","undefined","encodeSpoiler","text","entity","before","slice","offset","spoilerAfter","chars","charsLength","out","char","charCodeAt","push","join","spoiler","after","entityText","checkBrackets","urlLength","urlOpenBrackets","split","urlCloseBrackets","charAt","substr","replace","getEmojiUnified","emojiCode","unified","parseEntities","match","raw","entities","matchIndex","rawOffset","index","E","protocol","tld","toLowerCase","balanced","unicode","unsafe"],"sourceRoot":""} \ No newline at end of file diff --git a/public/740.b672541847aa35089884.bundle.js b/public/740.b672541847aa35089884.bundle.js deleted file mode 100644 index c18fdd3f7..000000000 --- a/public/740.b672541847aa35089884.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[740],{4159:(d,e,u)=>{u.d(e,{Z:()=>c});const t="web.telegram.org",f={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.5.0",versionFull:"1.5.0 (215)",build:215,langPackVersion:"0.4.4",langPack:"macos",langPackCode:"en",domains:[t],baseDcId:2,isMainDomain:location.hostname===t,suffix:"K"};f.isMainDomain&&(f.id=2496,f.hash="8da85b0d5bfe62527e5b244c209159c3");const c=f},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"}]}},2219:(d,e,u)=>{u.d(e,{Z:()=>t});const t=Date.now()%Math.random()*1e8|0},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){let u;Array.isArray(d)||(d=[d]);const f=(0,t.Z)(e);try{u=new Blob(d,{type:f})}catch(e){let t=new BlobBuilder;d.forEach((d=>{t.append(d)})),u=t.getBlob(f)}return 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})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){let 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}},5659:(d,e,u)=>{function t(d){const e=document.createElement("script"),u=new Promise((d=>{e.onload=e.onerror=()=>{d(e)}}));return e.src=d,document.body.appendChild(e),u}u.d(e,{Z:()=>t})},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)));let 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(let 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:()=>c});var t=u(8479),f=u(5880);function c(d,e,u,r){for(const o in d)typeof e[o]!=typeof d[o]?(e[o]=(0,t.Z)(d[o]),u&&u(r||o)):(0,f.Z)(d[o])&&c(d[o],e[o],u,r||o)}},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:()=>c,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 c(){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,c=null;return(...r)=>{t=!0,f=r,c||(u&&(t=!1,d(...f)),c=setInterval((()=>{if(!t)return clearInterval(c),void(c=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:()=>o});var t=u(8576),f=u(3989),c=u(7487),r=u(319);function o(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),c.Z.toggleStorage(d,e)]).then(r.Z,r.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})},8576:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(1267),f=u(8975),c=u(2328);class r{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),r.STORAGES.length&&(this.useStorage=r.STORAGES[0].useStorage),this.openDatabase(),r.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"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,r=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((c=void 0)||(c=Promise))((function(d,e){function u(d){try{s(r.next(d))}catch(d){e(d)}}function o(d){try{s(r.throw(d))}catch(d){e(d)}}function s(e){var t;e.done?d(e.value):(t=e.value,t instanceof c?t:new c((function(d){d(t)}))).then(u,o)}s((r=r.apply(t,f||[])).next())}));var t,f,c,r})):Promise.reject("STORAGE_OFFLINE")}getFileWriter(d,e,u){const t=c.Z.getFakeFileWriter(u,e,(e=>this.saveFile(d,e).catch((()=>e))));return Promise.resolve(t)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}r.STORAGES=[]},2328:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);const f=new class{constructor(){this.blobSupported=!0;try{(0,t.Z)([],"")}catch(d){this.blobSupported=!1}}isAvailable(){return this.blobSupported}getFakeFileWriter(d,e,u){let f=new Uint8Array(e);const c={write:(d,e)=>{return u=this,t=void 0,r=function*(){if(!this.blobSupported)throw!1;const u=e+d.byteLength;if(u>f.byteLength){const d=new Uint8Array(u);d.set(f,0),f=d}f.set(d,e)},new((c=void 0)||(c=Promise))((function(d,e){function f(d){try{s(r.next(d))}catch(d){e(d)}}function o(d){try{s(r.throw(d))}catch(d){e(d)}}function s(e){var u;e.done?d(e.value):(u=e.value,u instanceof c?u:new c((function(d){d(u)}))).then(f,o)}s((r=r.apply(u,t||[])).next())}));var u,t,c,r},truncate:()=>{f=new Uint8Array},trim:d=>{f=f.slice(0,d)},finalize:(e=!0)=>{const c=(0,t.Z)(f,d);return e&&u&&u(c),c},getParts:()=>f,replaceParts:d=>{f=d}};return c}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),c=u(4762),r=u(1352),o=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 s=[t.None,t.Error,t.Warn,t.Log,t.Debug],n=!(c.IS_SAFARI||c.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,c=""){let b;f.ZP||u||(e=t.Error),n?c||(r.SU?c=i:r.N5&&(c=a)):c="";let g=c;c=c?`%s ${c}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(c,(0,o.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](c,(0,o.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=s.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:()=>c});var t=u(410),f=u(153);class c extends f.Z{constructor(){super(),c.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3591:(d,e,u)=>{u.d(e,{Z:()=>c});var t=u(2423),f=u(6637);function c(d,e){let u,c,r,o;if((0,f.Z)(d)||(d="https://"+d),u=d.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=u[1];if(/^\W/.test(e)&&!t.kO.test(e))return o="joinchat",{url:d,onclick:o};const f=e.split("/");switch(f[0]){case"joinchat":case"addstickers":case"voicechat":o=f[0];break;default:if(f[1]&&f[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===f.length){o="im";break}}}else(c=d.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?o="im":(r=d.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(o="tg_"+r[1]);return window[o]||(o=void 0),{url:d,onclick:o}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),c=u(1352),r=u(3206);class o{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(let 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 s{constructor(){s.STORAGES.push(this),c.kC||(this.storage=new o)}proxy(d,...e){return u=this,t=void 0,o=function*(){return c.kC?r.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 c(d){try{s(o.next(d))}catch(d){e(d)}}function r(d){try{s(o.throw(d))}catch(d){e(d)}}function s(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,r)}s((o=o.apply(u,t||[])).next())}));var u,t,f,o}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)}}s.STORAGES=[];const n=new s;t.GO.appStorage=n;const i=n},7922:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(410),f=u(3989),c=u(3127);class r extends f.Z{constructor(){super(c.Z,"session")}}const o=new r;t.GO.stateStorage=o;const s=o},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),c=u(1352),r=u(6724),o=u(1962),s=function(d,e,u,t){return new(u||(u=Promise))((function(f,c){function r(d){try{s(t.next(d))}catch(d){c(d)}}function o(d){try{s(t.throw(d))}catch(d){c(d)}}function s(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(r,o)}s((t=t.apply(d,e||[])).next())}))};function n(){}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 o.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,r.Z)((()=>s(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,r.Z)((()=>s(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,r.Z)((()=>s(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{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(u)||(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 s(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(n)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,c.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(n)}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=740.b672541847aa35089884.bundle.js.map \ No newline at end of file diff --git a/public/740.b672541847aa35089884.bundle.js.map b/public/740.b672541847aa35089884.bundle.js.map deleted file mode 100644 index e550325a3..000000000 --- a/public/740.b672541847aa35089884.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"740.b672541847aa35089884.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/config/tabId.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/dom/loadScript.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/cacheStorage.ts","webpack://tweb/./src/lib/fileManager.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.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_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.4.4',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Database } from '.';\r\nimport type { IDBIndex } from '../../lib/idb';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs',\r\n // indexes: [\r\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\r\n // const name = `index_${idx}`;\r\n // const index: IDBIndex = {\r\n // indexName: name,\r\n // keyPath: name,\r\n // objectParameters: {}\r\n // };\r\n\r\n // return index\r\n // })\r\n // ]\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","const tabId = Date.now() % Math.random() * 100000000 | 0;\nexport default tabId;\n","/*\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 let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: (reason?: any) => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = noop;\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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","export default function noop() {}\r\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 //lastly, handle objects\n // @ts-ignore\n let clonedObj = new obj.constructor();\n for(var prop in obj){\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","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(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from \"./copy\";\nimport isObject from \"./isObject\";\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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 return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\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) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyToVoidFunction } from \"../../types\";\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n","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/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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n // sometimes file size can be bigger than the prov\r\n const endOffset = offset + part.byteLength;\r\n if(endOffset > bytes.byteLength) {\r\n const newBytes = new Uint8Array(endOffset);\r\n newBytes.set(bytes, 0);\r\n bytes = newBytes;\r\n }\r\n\r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG 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 let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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 cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\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} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super();\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","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 { PHONE_NUMBER_REG_EXP } from \".\";\nimport matchUrlProtocol from \"./matchUrlProtocol\";\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n // second regexp is for phone numbers (t.me/+38050...)\n if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n return {url, onclick};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach((key) => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\r\n if(IS_WORKER) {\r\n const port = MTProtoMessagePort.getInstance();\r\n return port.invoke('localStorageProxy', {type, args});\r\n }\r\n \r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n return this.storage[type].apply(this.storage, args as any);\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return this.proxy('toggleStorage', enabled, clearWrite);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n },\r\n k_build: number\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport type { State } from '../config/state';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nclass StateStorage extends AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE> {\r\n constructor() {\r\n super(DATABASE_STATE, 'session');\r\n }\r\n}\r\n\r\nconst stateStorage = new StateStorage();\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../config/databases\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_WORKER } from \"../helpers/context\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nconst THROTTLE_TIME = 16;\r\n\r\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\r\nexport default class AppStorage<\r\n Storage extends Record, \r\n T extends Database\r\n> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n const values = keys.map((key) => this.cache[key]);\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys, values);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, THROTTLE_TIME, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, THROTTLE_TIME, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then((values) => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, THROTTLE_TIME, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n \r\n if(!IS_WORKER || !clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {\r\n console.error('freezeSaving callback error:', err);\r\n }\r\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\r\n","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = \"((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\n"],"names":["MAIN_DOMAIN","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","name","stores","Date","now","Math","random","blobConstruct","blobParts","mimeType","blob","Array","isArray","safeMimeType","Blob","type","e","bb","BlobBuilder","forEach","blobPart","append","getBlob","blobSafeMimeType","indexOf","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","length","cancel","Object","assign","loadScript","url","script","document","createElement","promise","onload","onerror","src","body","appendChild","noop","copy","obj","getTime","map","el","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint8Array","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","description","perf","performance","console","warn","then","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","slice","toggleStorages","enabled","clearWrite","all","tsNow","seconds","t","isAnyChat","peerId","isUser","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","method","saveFile","Response","headers","size","rejected","timeout","res","err","clearTimeout","getFileWriter","fileSize","fakeWriter","static","storage","blobSupported","isAvailable","getFakeFileWriter","saveFileCallback","bytes","fakeFileWriter","write","part","offset","endOffset","byteLength","newBytes","set","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","reduce","acc","v","bindPrefix","MTProtoMessagePort","super","INSTANCE","matchUrlProtocol","text","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","onclick","fullPath","path","split","window","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","invoke","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","error","deleteThrottled","getThrottled","includes","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/765.439d96cf9275d8e367ac.chunk.js b/public/765.439d96cf9275d8e367ac.chunk.js new file mode 100644 index 000000000..7476ef712 --- /dev/null +++ b/public/765.439d96cf9275d8e367ac.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[765],{9818:(e,t,n)=>{n.d(t,{Z:()=>d});var i=n(410),s=n(4762),o=n(5003),a=n(8799),r=n(3910),h=n(3444),c=n(1655);const l=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,n=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}`),n===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!n||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(n!==this.id&&(this.pushState(),!this.navigations.length))return;const i=this.navigations.pop();i?(this.manual=!this.isPossibleSwipe,this.handleItem(i)):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,h.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,o.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}),s.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.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,a.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,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,...n){this.navigations.splice(e,t,...n),n.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,c.Z)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0&&(this.navigations[n].type!==e||(this.navigations.splice(n,1),!t));--n);}};i.GO.appNavigationController=l;const d=l},6765:(e,t,n)=>{n.d(t,{Z:()=>h});var i=n(1168),s=n(2325),o=n(2738),a=n(7084),r=n(7309);class h extends i.Z{constructor(){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,s.$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),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,a.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 n,i,s,o={},a=0,r=0,h=0,c=0,l=0;function d(){e.classList.add("crop-blur"),e.draggable=!1,s=new Image,s.src=e.src,s.draggable=!1,s.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),i=document.createElement("div"),i.classList.add("crop-overlay");const o=document.createElement("div");o.classList.add("crop-overlay-color"),n.appendChild(i),e.parentNode.appendChild(n),n.appendChild(s),n.appendChild(e),n.appendChild(o),i.appendChild(s),s.style.maxWidth=e.width+"px",l=e.naturalWidth/e.offsetWidth;const a=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(a,r),m(a,r),i.addEventListener("mousedown",b,!1),i.addEventListener("touchstart",b,!1),i.addEventListener("wheel",g,!1),document.addEventListener("keypress",f,!1)}function u(e,t){h=e*l,c=t*l,i.style.width=e+"px",i.style.height=t+"px"}function p(e,t){r=t*l,a=e*l,s.style.top=-t+"px",s.style.left=-e+"px"}function m(e,t){i.style.top=t+"px",i.style.left=e+"px"}function v(e){e=e*Math.PI*2;let t,n,o,a,r=Math.floor(i.clientWidth+e),h=Math.floor(i.clientHeight+e),c=s.clientWidth,l=s.clientHeight;r<50||r>c||(t=i.offsetLeft-e/2,n=i.offsetTop-e/2,o=t+r,a=n+h,t<0&&(t=0),n<0&&(n=0),o>c||a>l||(u(r,r),p(t,n),m(t,n)))}function f(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":v(4);break;case"-":v(-4)}}function g(e){e.preventDefault(),v(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){o.container_width=i.offsetWidth,o.container_height=i.offsetHeight,o.container_left=i.offsetLeft,o.container_top=i.offsetTop,o.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,o.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",E),document.addEventListener("touchmove",E),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E)}function E(e){let t,n,a,r,h={x:0,y:0};e.preventDefault(),e.stopPropagation(),h.x=e.pageX||e.touches&&e.touches[0].pageX,h.y=e.pageY||e.touches&&e.touches[0].pageY,t=h.x-(o.mouse_x-o.container_left),n=h.y-(o.mouse_y-o.container_top),a=i.offsetWidth,r=i.offsetHeight,t<0?t=0:t>s.offsetWidth-a&&(t=s.offsetWidth-a),n<0?n=0:n>s.offsetHeight-r&&(n=s.offsetHeight-r),p(t,n),m(t,n)}return e.complete?d():e.onload=d,{crop:function(){t.width=h,t.height=c,t.getContext("2d").drawImage(e,a,r,h,c,0,0,h,c)},removeHandlers:function(){i.removeEventListener("mousedown",b),i.removeEventListener("touchstart",b),i.removeEventListener("wheel",g),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E),document.removeEventListener("keypress",f),n.remove(),i.remove(),s.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,o.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)}}},1168:(e,t,n)=>{n.d(t,{Z:()=>w,x:()=>S});var i=n(1405),s=n(5814),o=n(9818),a=n(2325),r=n(8497),h=n(8799),c=n(3699),l=n(2738),d=n(6299),u=n(3910),p=n(3241),m=n(6733),v=n(1655),f=n(3815),g=n(8805);const b=document.body;let y=b;const E=()=>{y=(0,m.W7)()||b,w.reAppend()};(0,m.Ms)(b,E);class w 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=()=>{o.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&&(this.title.classList.add("popup-title"),"string"==typeof t.title&&(0,a.$d)(this.title,t.title),this.header.append(this.title)),this.listenerSetter=new c.Z,this.managers=w.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,l.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,l.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,a.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,i.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 g.ZP(this.body);e.onAdditionalScroll=()=>{e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},e.container.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered"),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let n=this.btnConfirm;const s=this.buttons=t.buttons;if(null==s?void 0:s.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=s.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),(0,i.Z)(t),e.text?t.innerHTML=e.text:t.append((0,a.ag)(e.langKey,e.langArgs)),(0,l.fc)(t,(()=>{e.callback&&e.callback(),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!n&&2===s.length){const e=s.find((e=>!e.isCancel));e&&(n=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=n,this.element.append(this.container),w.POPUPS.push(this)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},o.Z.pushItem(this.navigationItem),(0,h.Z)(),y.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(f.Z.isOverlayActive=!0,s.Z.checkAnimations(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{w.POPUPS[w.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,d.Z)(e):"Enter"===e.key)&&((0,l.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.withoutOverlay||(f.Z.isOverlayActive=!1),o.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,v.Z)(w.POPUPS,this),E(),setTimeout((()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||s.Z.checkAnimations(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:n}=e,i=t.parentElement;i&&i!==y&&y!==n&&y.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}w.POPUPS=[];const S=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},7084:(e,t,n)=>{function i(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsDataURL(e)}))}(e)}n.d(t,{Z:()=>i})},6733:(e,t,n)=>{function i(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function s(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function o(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{i(e,t,!1)}))}function a(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!a()}n.d(t,{C8:()=>s,Dj:()=>i,Ms:()=>o,W7:()=>a,rB:()=>r})},6299:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(3512),s=n(4762);function o(e){if("Enter"===e.key&&!s.IS_MOBILE&&!e.isComposing){if("enter"===i.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=s.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(s.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,n)=>{n.d(t,{Z:()=>s});var i=n(4762);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}}}]); +//# sourceMappingURL=765.439d96cf9275d8e367ac.chunk.js.map \ No newline at end of file diff --git a/public/765.439d96cf9275d8e367ac.chunk.js.map b/public/765.439d96cf9275d8e367ac.chunk.js.map new file mode 100644 index 000000000..37036d56c --- /dev/null +++ b/public/765.439d96cf9275d8e367ac.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"765.439d96cf9275d8e367ac.chunk.js","mappings":"qLA0QA,MAAMA,EAA0B,IAjPzB,MAWLC,cAaE,GAUM,KAAAC,WAAcC,IACpB,MAAMC,EAAOC,OAAOC,SAASF,KACvBG,EAAaJ,EAAEK,MAErB,GADAC,KAAKC,OAASD,KAAKE,IAAI,WAAYR,EAAGM,KAAKG,gBAAiBR,GACzDA,IAASK,KAAKI,YAGf,GAFAJ,KAAKC,OAASD,KAAKE,IAAIG,KAAK,qBAAqBV,cAAiBK,KAAKI,2BAA2BJ,KAAKM,kBAEpGR,IAAOE,KAAKF,IAAME,KAAKM,gBAAkBN,KAAKM,iBAAmBX,EAClEK,KAAKO,aAAaP,KAAKM,oBAClB,KAAGR,GAAyBE,KAAKM,iBAAkBX,EAMxD,OAHAK,KAAKI,YAAcT,OACnBK,KAAKQ,cAAgBR,KAAKQ,gBAH1BR,KAAKO,eAST,GAAGT,IAAOE,KAAKF,KACbE,KAAKS,aAEDT,KAAKU,YAAYC,QACnB,OAIJ,MAAMC,EAAOZ,KAAKU,YAAYG,MAC1BD,GAKJZ,KAAKc,QAAUd,KAAKG,gBACpBH,KAAKe,WAAWH,IALdZ,KAAKS,aASD,KAAAO,UAAatB,IACnB,MAAMkB,EAAOZ,KAAKU,YAAYV,KAAKU,YAAYC,OAAS,GACpDC,IACS,WAAVlB,EAAEuB,KAAqBL,EAAKM,WAAWN,EAAKM,cAC7C,OAAYxB,GACZM,KAAKmB,KAAKP,EAAKQ,SAIX,KAAAC,aAAgB3B,IACnBA,EAAE4B,QAAQX,OAAS,IACtBX,KAAKC,OAASD,KAAKE,IAAI,eAEpB,OAAoBR,KACrBM,KAAKG,iBAAkB,EAEvBP,OAAO2B,iBAAiB,YAAY,KAClCC,YAAW,KACTxB,KAAKG,iBAAkB,IACtB,OACF,CAACsB,SAAS,EAAMC,MAAM,OAhF3B1B,KAAKU,YAAc,GACnBV,KAAKF,GAAK6B,KAAKC,MACf5B,KAAKc,QAAS,EACdd,KAAKE,KAAM,QAAO,MAClBF,KAAKC,OAAQ,EACbD,KAAKI,YAAcR,OAAOC,SAASF,KACnCK,KAAKM,eAAiB,GACtBN,KAAKG,iBAAkB,EAEvBP,OAAO2B,iBAAiB,WAAYvB,KAAKP,YACzCG,OAAO2B,iBAAiB,UAAWvB,KAAKgB,UAAW,CAACa,SAAS,EAAMJ,SAAS,IAEzE,EAAAK,iBAAkB,CACnB,MAAMC,EAAU,CAACN,SAAS,GAC1B7B,OAAO2B,iBAAiB,aAAcvB,KAAKqB,aAAcU,GAG3DC,QAAQC,kBAAoB,SAE5BjC,KAAKS,YAmGAF,aAAaZ,EAAe,IAC9BA,GAAoB,MAAZA,EAAK,GAAYA,EAAO,IAAMA,EACxB,MAATA,IAAcA,EAAO,IAE7BK,KAAKM,eAAiBN,KAAKI,YAAcT,EACzCK,KAAKkC,eACLlC,KAAKS,YAGCM,WAAWH,GACjB,MAAMuB,EAAOvB,EAAKwB,QAAOpC,KAAKc,aAAiBuB,GAC/CrC,KAAKC,OAASD,KAAKE,IAAI,wBAAyBU,EAAMZ,KAAKU,cAC/C,IAATyB,EACDnC,KAAKsC,SAAS1B,GACLA,EAAK2B,cACd,SAGFvC,KAAKc,QAAS,EAGT0B,eAAepB,GACpB,IAAI,IAAIqB,EAAIzC,KAAKU,YAAYC,OAAS,EAAG8B,GAAK,IAAKA,EAAG,CACpD,MAAM7B,EAAOZ,KAAKU,YAAY+B,GAC9B,GAAG7B,EAAKQ,OAASA,EACf,MAAO,CAACR,KAAAA,EAAM8B,MAAOD,IAKpBtB,KAAKC,GACV,GAAGA,EAAM,CACP,MAAMuB,EAAM3C,KAAKwC,eAAepB,GAChC,GAAGuB,EAED,YADA3C,KAAK4C,WAAWD,EAAI/B,KAAM+B,EAAID,OAKlCV,QAAQb,OAGHyB,WAAWhC,EAAsB8B,EAAQ1C,KAAKU,YAAYmC,QAAQjC,IACvEZ,KAAKc,QAAS,EAGdd,KAAKU,YAAYoC,OAAOJ,EAAO,GAC/B1C,KAAKe,WAAWH,GAIVmC,YAAYnC,GAClBZ,KAAKC,OAASD,KAAKE,IAAI,cAAeU,EAAMZ,KAAKU,aAE7CE,EAAKoC,WACPhD,KAAKS,YAIF6B,SAAS1B,GACdZ,KAAKU,YAAYuC,KAAKrC,GACtBZ,KAAK+C,YAAYnC,GAGZsC,YAAYtC,GACjBZ,KAAKU,YAAYyC,QAAQvC,GACzBZ,KAAK+C,YAAYnC,GAGZwC,YAAYV,EAAe/B,KAAmB0C,GACnDrD,KAAKU,YAAYoC,OAAOJ,EAAO/B,KAAW0C,GAC1CA,EAAMC,SAAS1C,IACbZ,KAAK+C,YAAYnC,MAIbH,YACNT,KAAKC,OAASD,KAAKE,IAAI,QACvBF,KAAKc,QAAS,EACdkB,QAAQvB,UAAUT,KAAKF,GAAI,IAGtBoC,eACLlC,KAAKC,OAASD,KAAKE,IAAIG,KAAK,WAE5B,MAAMkD,EAAM1D,SAAS2D,OAAS3D,SAAS4D,SAAW5D,SAAS6D,OAAS1D,KAAKM,eACzE0B,QAAQE,aAAalC,KAAKF,GAAI,GAAIyD,GAG7BI,WAAW/C,GACZA,IAIJ,OAAiBZ,KAAKU,YAAaE,GAG9BgD,aAAaxC,EAA8ByC,GAAS,GACzD,IAAI,IAAIpB,EAAIzC,KAAKU,YAAYC,OAAS,EAAG8B,GAAK,IAC/BzC,KAAKU,YAAY+B,GACtBrB,OAASA,IACfpB,KAAKU,YAAYoC,OAAOL,EAAG,IAExBoB,MAL4CpB,MAcvD,6BAAyClD,EACzC,W,sFC7Pe,MAAMuE,UAAoB,IAgBvCtE,cACEuE,MAAM,eAAgB,CAACC,UAAU,EAAMC,aAAa,IAZ9C,KAAAC,MAAQ,IAAIC,MAIZ,KAAAC,QAAU,CAChBC,KAAM,OACNC,eAAgB,QAQhBtE,KAAKuE,GAAKC,SAASC,cAAc,OACjC,QAAMzE,KAAKuE,GAAI,sBAEfvE,KAAK0E,SAASC,UAAUC,OAAO,YAE/B5E,KAAK6E,OAAOC,OAAO9E,KAAKuE,IAExBvE,KAAK+E,cAAgBP,SAASC,cAAc,OAC5CzE,KAAK+E,cAAcJ,UAAUK,IAAI,QACjChF,KAAK+E,cAAcD,OAAO9E,KAAKkE,OAE/BlE,KAAKiF,MAAQT,SAASC,cAAc,SACpCzE,KAAKiF,MAAM7D,KAAO,OAClBpB,KAAKiF,MAAMC,MAAMC,QAAU,OAC3BnF,KAAKoF,eAAeJ,IAAIhF,KAAKiF,MAA7BjF,CAAoC,UAAWN,IAC7C,MAAM2F,EAAO3F,EAAE4F,OAAOC,MAAM,GACxBF,IAIJ,EAAAG,EAAA,GAAkBH,GAAMI,MAAMC,IAC5B1F,KAAKkE,MAAQ,IAAIC,MACjBnE,KAAK+E,cAAcD,OAAO9E,KAAKkE,OAC/BlE,KAAKkE,MAAMyB,IAAMD,EAEjB1F,KAAKkE,MAAM0B,OAAS,KAIlB5F,KAAK6F,OAEL7F,KAAKoE,QC3Df,SAAyB0B,EAAiCC,GACxD,IAAIC,EACFC,EACAC,EACAC,EAOK,GAMLC,EAAW,EACXC,EAAU,EACVC,EAAY,EACZC,EAAa,EACbC,EAAc,EA8BhB,SAASC,IACPX,EAAcnB,UAAUK,IAAI,aAC5Bc,EAAcY,WAAY,EAE1BR,EAAY,IAAI/B,MAChB+B,EAAUP,IAAMG,EAAcH,IAC9BO,EAAUQ,WAAY,EACtBR,EAAUvB,UAAUK,IAAI,sBAEpBe,IACFA,EAASvB,SAASC,cAAc,WAGlCuB,EAAgBxB,SAASC,cAAc,OACvCuB,EAAcrB,UAAUK,IAAI,kBAE5BiB,EAAYzB,SAASC,cAAc,OACnCwB,EAAUtB,UAAUK,IAAI,gBAExB,MAAM2B,EAAenC,SAASC,cAAc,OAC5CkC,EAAahC,UAAUK,IAAI,sBAE3BgB,EAAcY,YAAYX,GACVH,EAAce,WACtBD,YAAYZ,GACpBA,EAAcY,YAAYV,GAC1BF,EAAcY,YAAYd,GAC1BE,EAAcY,YAAYD,GAC1BV,EAAUW,YAAYV,GAEtBA,EAAUhB,MAAM4B,SAAWhB,EAAciB,MAAQ,KAEjDP,EAAcV,EAAckB,aAAelB,EAAcmB,YAEzD,MAAMC,EAAOpB,EAAcmB,YAAc,EAAIE,IACvCC,EAAMtB,EAAcuB,aAAe,EAAIC,IAE7CC,EAzEY,IACC,KAyEbC,EAAgBN,EAAME,GACtBK,EAAgBP,EAAME,GA/CtBnB,EAAU1E,iBAAiB,YAAamG,GAAa,GACrDzB,EAAU1E,iBAAiB,aAAcmG,GAAa,GACtDzB,EAAU1E,iBAAiB,QAASoG,GAAU,GAE9CnD,SAASjD,iBAAiB,WAAYqG,GAAY,GAgDpD,SAASL,EAAeR,EAAec,GACrCvB,EAAYS,EAAQP,EACpBD,EAAasB,EAASrB,EAEtBP,EAAUf,MAAM6B,MAAQA,EAAQ,KAChCd,EAAUf,MAAM2C,OAASA,EAAS,KAGpC,SAASL,EAAgBN,EAAcE,GACrCf,EAAUe,EAAMZ,EAChBJ,EAAWc,EAAOV,EAElBN,EAAUhB,MAAMkC,KAAOA,EAAM,KAC7BlB,EAAUhB,MAAMgC,MAAQA,EAAO,KAGjC,SAASO,EAAgBP,EAAcE,GACrCnB,EAAUf,MAAMkC,IAAMA,EAAM,KAC5BnB,EAAUf,MAAMgC,KAAOA,EAAO,KAehC,SAASY,EAAQC,GACfA,EAAOA,EAAOC,KAAKC,GAAK,EACxB,IAIEf,EACAE,EACAc,EACAC,EAPEC,EAAWJ,KAAKK,MAAMpC,EAAUqC,YAAcP,GAChDQ,EAAYP,KAAKK,MAAMpC,EAAUuC,aAAeT,GAChDU,EAAIvC,EAAUoC,YACdI,EAAIxC,EAAUsC,aAMbJ,EA9HQ,IAgIDA,EAAWK,IAIrBvB,EAAOjB,EAAU0C,WAAcZ,EAAO,EACtCX,EAAMnB,EAAU2C,UAAab,EAAO,EACpCG,EAAQhB,EAAOkB,EACfD,EAASf,EAAMmB,EAEZrB,EAAO,IAAGA,EAAO,GACjBE,EAAM,IAAGA,EAAM,GAEfc,EAAQO,GACRN,EAASO,IAEZnB,EAAea,EAAUA,GACzBZ,EAAgBN,EAAME,GACtBK,EAAgBP,EAAME,KAIxB,SAASQ,EAAWlI,GAGlB,OAFAA,EAAEmJ,iBAEKC,OAAOC,aAAarJ,EAAEsJ,WAC3B,IAAK,IACHlB,EA3JW,GA4JX,MACF,IAAK,IACHA,GA9JW,IAmKjB,SAASH,EAASjI,GAChBA,EAAEmJ,iBACFf,EAAQpI,EAAEuJ,OAAS,EAAI,GAAK,GAG9B,SAASvB,EAAYhI,GACnBA,EAAEmJ,iBACFnJ,EAAEwJ,kBAjEJ,SAAwBxJ,GACtByG,EAAYgD,gBAAkBlD,EAAUgB,YACxCd,EAAYiD,iBAAmBnD,EAAUoB,aAEzClB,EAAYkD,eAAiBpD,EAAU0C,WACvCxC,EAAYmD,cAAgBrD,EAAU2C,UAEtCzC,EAAYoD,SAAW7J,EAAE8J,SAAW9J,EAAE+J,OAAS/J,EAAE4B,SAAW5B,EAAE4B,QAAQ,GAAGkI,SAAW5J,OAAO8J,QAC3FvD,EAAYwD,SAAWjK,EAAEkK,SAAWlK,EAAEmK,OAASnK,EAAE4B,SAAW5B,EAAE4B,QAAQ,GAAGsI,SAAWhK,OAAOkK,QA2D3FC,CAAerK,GAEf8E,SAASjD,iBAAiB,YAAayI,GACvCxF,SAASjD,iBAAiB,YAAayI,GACvCxF,SAASjD,iBAAiB,UAAW0I,GACrCzF,SAASjD,iBAAiB,WAAY0I,GAGxC,SAASA,EAAUvK,GACjBA,EAAEmJ,iBAEFrE,SAAS0F,oBAAoB,UAAWD,GACxCzF,SAAS0F,oBAAoB,WAAYD,GACzCzF,SAAS0F,oBAAoB,YAAaF,GAC1CxF,SAAS0F,oBAAoB,YAAaF,GAG5C,SAASA,EAAOtK,GACd,IACEwH,EACAE,EACAqB,EACAC,EAJEyB,EAAe,CAACC,EAAG,EAAGC,EAAG,GAM7B3K,EAAEmJ,iBACFnJ,EAAEwJ,kBAEFiB,EAAaC,EAAI1K,EAAE+J,OAAS/J,EAAE4B,SAAW5B,EAAE4B,QAAQ,GAAGmI,MACtDU,EAAaE,EAAI3K,EAAEmK,OAASnK,EAAE4B,SAAW5B,EAAE4B,QAAQ,GAAGuI,MAEtD3C,EAAOiD,EAAaC,GAAKjE,EAAYoD,QAAUpD,EAAYkD,gBAC3DjC,EAAM+C,EAAaE,GAAKlE,EAAYwD,QAAUxD,EAAYmD,eAC1Db,EAAIxC,EAAUgB,YACdyB,EAAIzC,EAAUoB,aAEXH,EAAO,EAAGA,EAAO,EACZA,EAAOhB,EAAUe,YAAcwB,IAAGvB,EAAOhB,EAAUe,YAAcwB,GAEtErB,EAAM,EAAGA,EAAM,EACVA,EAAMlB,EAAUmB,aAAeqB,IAAGtB,EAAMlB,EAAUmB,aAAeqB,GAEzElB,EAAgBN,EAAME,GACtBK,EAAgBP,EAAME,GAiBxB,OA5NGtB,EAAcwE,SAAU7D,IACtBX,EAAcF,OAASa,EA2NrB,CAACpC,KAbR,WACE0B,EAAOgB,MAAQT,EACfP,EAAO8B,OAAStB,EAEJR,EAAOwE,WAAW,MAC1BC,UAAU1E,EACZM,EAAUC,EACVC,EAAWC,EACX,EAAG,EACHD,EAAWC,IAIDjC,eAzNd,WACE2B,EAAUiE,oBAAoB,YAAaxC,GAC3CzB,EAAUiE,oBAAoB,aAAcxC,GAC5CzB,EAAUiE,oBAAoB,QAASvC,GAEvCnD,SAAS0F,oBAAoB,UAAWD,GACxCzF,SAAS0F,oBAAoB,WAAYD,GACzCzF,SAAS0F,oBAAoB,YAAaF,GAC1CxF,SAAS0F,oBAAoB,YAAaF,GAC1CxF,SAAS0F,oBAAoB,WAAYtC,GAEzC5B,EAAcpB,SACdqB,EAAUrB,SACVsB,EAAUtB,WDoBW,CAAgB5E,KAAKkE,MAAOlE,KAAK+F,QAChD/F,KAAKiF,MAAMwF,MAAQ,UAGtB,GAEHzK,KAAK0K,WAAWC,UAAY,oFAC5B,QAAiB3K,KAAK0K,YAAY,KAChC1K,KAAKoE,QAAQC,OACbrE,KAAK4K,OAEL5K,KAAK+F,OAAO8E,QAAQC,IAClB9K,KAAK8K,KAAOA,EACZ9K,KAAK+K,eACL/K,KAAKgL,YACJ,aAAc,KAChB,CAAC5F,eAAgBpF,KAAKoF,iBAEzBpF,KAAKiG,UAAUnB,OAAO9E,KAAK+E,cAAe/E,KAAK0K,WAAY1K,KAAKiF,OAEhEjF,KAAKuB,iBAAiB,qBAAqB,KACzCvB,KAAKoE,QAAQE,iBACVtE,KAAKkE,OACNlE,KAAKkE,MAAMU,YAKToG,UACNhL,KAAKiL,QAAO,IACHC,EAAA,SAA0BlL,KAAK8K,QAInCK,KAAKC,EAA+BH,GACzCjL,KAAK+F,OAASqF,EACdpL,KAAKiL,OAASA,EAEdjL,KAAKiF,MAAMoG,QAGNN,eACL,MAAMO,EAAMtL,KAAK+F,OAAOwE,WAAW,MACnCe,EAAIC,UAAY,qBAChBD,EAAIE,SAAS,EAAG,EAAGxL,KAAK+F,OAAOgB,MAAO/G,KAAK+F,OAAO8B,W,kME5DtD,MAAM4D,EAAoBjH,SAASkH,KACnC,IAAIC,EAAgBF,EAEpB,MAAMG,EAAqB,KACzBD,GAAgB,WAA0BF,EAC1CI,EAAaC,aAGf,QAAsBL,EAAmBG,GAO1B,MAAMC,UAA4D,IA8B/ErM,YAAYmL,EAAmB5I,EAAwB,IA6DrD,GA5DAgC,OAAM,GA3BE,KAAAgI,QAAUvH,SAASC,cAAc,OACjC,KAAAwB,UAAYzB,SAASC,cAAc,OACnC,KAAAI,OAASL,SAASC,cAAc,OAChC,KAAAuH,MAAQxH,SAASC,cAAc,OAM/B,KAAAvD,SAA0B,KAAM,EAwLnC,KAAA0J,KAAO,KACZ,eAAmC5K,KAAKiM,iBAtKxCjM,KAAK+L,QAAQpH,UAAUK,IAAI,SAC3BhF,KAAK+L,QAAQpB,UAAY,SAAWA,EAAY,IAAMA,EAAY,IAClE3K,KAAKiG,UAAUtB,UAAUK,IAAI,kBAAmB,aAEhDhF,KAAK6E,OAAOF,UAAUK,IAAI,gBAEvBjD,EAAQiK,QACThM,KAAKgM,MAAMrH,UAAUK,IAAI,eACI,iBAAnBjD,EAAa,QACrB,QAAM/B,KAAKgM,MAAOjK,EAAQiK,OAG5BhM,KAAK6E,OAAOC,OAAO9E,KAAKgM,QAG1BhM,KAAKoF,eAAiB,IAAI,IAC1BpF,KAAKkM,SAAWL,EAAaM,SAE7BnM,KAAKoM,8BAAgCrK,EAAQqK,8BAE1CrK,EAAQiC,WACThE,KAAK0E,SAAWF,SAASC,cAAc,QACvCzE,KAAK0E,SAASC,UAAUK,IAAI,WAAY,cAAe,eAEvDhF,KAAK6E,OAAOwH,QAAQrM,KAAK0E,WAEzB,QAAiB1E,KAAK0E,SAAU1E,KAAK4K,KAAM,CAACxF,eAAgBpF,KAAKoF,eAAgB1D,MAAM,KAGzF1B,KAAKsM,eAAiBvK,EAAQuK,eAC3BtM,KAAKsM,gBACNtM,KAAK+L,QAAQpH,UAAUK,IAAI,cAG1BjD,EAAQwK,kBACT,QAAiBvM,KAAK+L,SAAUrM,KAC1B,OAAgBA,EAAE4F,OAAQ,oBAC5BtF,KAAK4K,SAEN,CAACxF,eAAgBpF,KAAKoF,iBAGxBrD,EAAQkC,cACTjE,KAAK0K,WAAalG,SAASC,cAAc,UACzCzE,KAAK0K,WAAW/F,UAAUK,IAAI,cAAe,sBAClB,IAAxBjD,EAAQkC,aACTjE,KAAK0K,WAAW5F,QAAO,QAAK/C,EAAQkC,cAEtCjE,KAAK6E,OAAOC,OAAO9E,KAAK0K,aACxB,OAAO1K,KAAK0K,aAGd1K,KAAKiG,UAAUnB,OAAO9E,KAAK6E,QACxB9C,EAAQ2J,OACT1L,KAAK0L,KAAOlH,SAASC,cAAc,OACnCzE,KAAK0L,KAAK/G,UAAUK,IAAI,cACxBhF,KAAKiG,UAAUnB,OAAO9E,KAAK0L,OAG1B3J,EAAQyK,WAAY,CACrB,MAAMA,EAAaxM,KAAKwM,WAAa,IAAI,KAAWxM,KAAK0L,MACzDc,EAAWC,mBAAqB,KAC9BD,EAAWvG,UAAUtB,UAAU+H,OAAO,gBAAiBF,EAAWG,WAClEH,EAAWvG,UAAUtB,UAAU+H,OAAO,kBAAmBF,EAAWI,iBAGtEJ,EAAWvG,UAAUtB,UAAUK,IAAI,eAAgB,kBAAmB,yBAElEhF,KAAK0L,MACP1L,KAAKiG,UAAU4G,aAAaL,EAAWvG,UAAWjG,KAAK6E,OAAOiI,aAIlE,IAAIC,EAAoB/M,KAAK0K,WAC7B,MAAMsC,EAAUhN,KAAKgN,QAAUjL,EAAQiL,QACvC,GAAGA,MAAAA,OAAO,EAAPA,EAASrM,OAAQ,CAClB,MAAMsM,EAAajN,KAAKkN,UAAY1I,SAASC,cAAc,OAC3DwI,EAAWtI,UAAUK,IAAI,iBAEzB,MAAMmI,EAAkBH,EAAQI,KAAKC,IACnC,MAAMC,EAAS9I,SAASC,cAAc,UAgBtC,OAfA6I,EAAO3C,UAAY,OAAS0C,EAAEE,SAAW,UAAY,aAErD,OAAOD,GAEJD,EAAEG,KACHF,EAAOG,UAAaJ,EAAEG,KAEtBF,EAAOxI,QAAO,QAAKuI,EAAEK,QAASL,EAAEM,YAGlC,QAAiBL,GAAQ,KACvBD,EAAEO,UAAYP,EAAEO,WAChB5N,KAAK6N,YACJ,CAACzI,eAAgBpF,KAAKoF,eAAgB1D,MAAM,IAExC2L,EAAEtB,QAAUuB,KAGrB,IAAIP,GAAwC,IAAnBC,EAAQrM,OAAc,CAC7C,MAAM2M,EAASN,EAAQc,MAAMR,IAAYA,EAAOS,WAC7CT,IACDP,EAAoBO,EAAOvB,SAI/BkB,EAAWnI,UAAUqI,GACrBnN,KAAKiG,UAAUnB,OAAOmI,GAGxBjN,KAAK+M,kBAAoBA,EAEzB/M,KAAK+L,QAAQjH,OAAO9E,KAAKiG,WAEzB4F,EAAamC,OAAO/K,KAAKjD,MAGjBiO,kBACLjO,KAAKwM,YACNxM,KAAKwM,WAAWC,qBAIb5G,OACL7F,KAAKiM,eAAiB,CACpB7K,KAAM,QACNgB,MAAO,IAAMpC,KAAK6N,UAClB3M,SAAUlB,KAAKkB,UAGjB,aAAiClB,KAAKiM,iBAEtC,SACAN,EAAc7G,OAAO9E,KAAK+L,SACrB/L,KAAK+L,QAAQ9E,YAClBjH,KAAK+L,QAAQpH,UAAUK,IAAI,UAE3BhF,KAAKiO,kBAEDjO,KAAKsM,iBACP,qBAAiC,EACjC,qBAAqC,IAKvC9K,YAAW,KACLxB,KAAK+L,QAAQpH,UAAUuJ,SAAS,WAIpClO,KAAKoF,eAAeJ,IAAIR,SAASkH,KAAjC1L,CAAuC,WAAYN,IAC9CmM,EAAamC,OAAOnC,EAAamC,OAAOrN,OAAS,KAAOX,OAIxDA,KAAKoM,+BAAgC,OAAsB1M,GAAe,UAAVA,EAAEuB,QACnE,QAAmBjB,KAAK+M,oBACxB,OAAYrN,SAGf,GAQKmO,UACR7N,KAAKmO,cAA8B,SACnCnO,KAAK+L,QAAQpH,UAAUK,IAAI,UAC3BhF,KAAK+L,QAAQpH,UAAUC,OAAO,UAC9B5E,KAAKoF,eAAegJ,YAEhBpO,KAAKsM,iBACP,qBAAiC,GAGnC,eAAmCtM,KAAKiM,gBACxCjM,KAAKiM,oBAAiB5J,GAEtB,OAAiBwJ,EAAamC,OAAQhO,MAGtC4L,IAEApK,YAAW,KACTxB,KAAK+L,QAAQnH,SACb5E,KAAKmO,cAA8B,qBACnCnO,KAAKqO,UAEDrO,KAAKsM,gBACP,qBAAqC,KAEtC,KAGEgC,kBACLtO,KAAKgO,OAAO1K,SAASiL,IACnB,MAAM,QAACxC,EAAO,UAAE9F,GAAasI,EACvBC,EAAgBzC,EAAQyC,cAC3BA,GAAiBA,IAAkB7C,GAAiBA,IAAkB1F,GACvE0F,EAAc7G,OAAOiH,MAKpBuC,iBAAyCG,GAC9C,OAAOzO,KAAKgO,OAAOU,QAAQ3C,GAAYA,aAAmB0C,IAGrDH,mBAAiEK,KAA+BC,GAErG,OADc,IAAID,KAAQC,IApPb,EAAAZ,OAA8B,GAyPxC,MAAMa,EAAmB7B,IACfA,EAAQc,MAAMT,GAAMA,EAAEU,YAEnCf,EAAQ/J,KAAK,CACXyK,QAAS,SACTK,UAAU,IAIPf,I,eC3TM,SAASxH,EAAkBsF,GACxC,OCGa,SAAoBA,EAAYgE,GAE7C,OAAO,IAAIC,SAAc/D,IACvB,MAAMgE,EAAS,IAAIC,WACnBD,EAAOzN,iBAAiB,WAAY7B,IAElCsL,EAAQtL,EAAE4F,OAAO4J,WAEnBF,EAAa,cAAElE,MDXVqE,CAAWrE,G,iCEDb,SAASsE,EAAkBrD,GAC7BA,EAAQsD,kBACTtD,EAAQsD,oBAEAtD,EAAQuD,qBAEhBvD,EAAQuD,uBAEAvD,EAAQwD,wBAEhBxD,EAAQwD,0BAEAxD,EAAQyD,qBAEhBzD,EAAQyD,sBAIL,SAASC,IAEXjL,SAASiL,iBAEVjL,SAASiL,mBAEDjL,SAASkL,oBAEjBlL,SAASkL,sBAEDlL,SAASmL,uBAEjBnL,SAASmL,yBAEDnL,SAASoL,kBAEjBpL,SAASoL,mBAIN,SAASC,EAAsB9D,EAAsB6B,EAA6BxI,GACvF,MAAM0K,EAAc1K,EAAiBA,EAAeJ,IAAI+G,GAAWA,EAAQxK,iBAAiBwO,KAAKhE,GACjG,iFAAiFiE,MAAM,KAAK1M,SAAS2M,IACnGH,EAAYG,EAAWrC,GAAU,MAI9B,SAASsC,IAEd,OAAO1L,SAAS2L,mBAAqB3L,SAAS4L,sBAAwB5L,SAAS6L,yBAA2B7L,SAAS8L,oBAG9G,SAASC,IACd,QAASL,I,+GClDI,SAASM,EAAsB9Q,GAC5C,GAAa,UAAVA,EAAEuB,MAAoB,EAAAwP,YAAc/Q,EAAEgR,YAAa,CAOpD,GAAuC,UAApC,0BAA6C,CAC9C,GAAGhR,EAAEiR,UAAYjR,EAAEkR,SAAWlR,EAAEmR,QAC9B,OAGF,OAAO,EACF,CACL,MAAMC,EAAe,EAAAC,SAAWrR,EAAEmR,QAAUnR,EAAEkR,QAC9C,GAAGlR,EAAEiR,WAAa,EAAAI,SAAWrR,EAAEkR,QAAUlR,EAAEmR,SACzC,OAGF,GAAGC,EACD,OAAO,GAKb,OAAO,I,8CC3BM,SAASE,EAAoBtR,GAC1C,OAAO,EAAAoC,kBAAoBpC,aAAauR,YAAcvR,EAAE4B,QAAQ,GAAGkI,QAAU","sources":["webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\r\nimport {logger} from '../lib/logger';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\r\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\r\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\r\n 'toast',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array;\r\n private id: number;\r\n private manual: boolean;\r\n private log: ReturnType;\r\n private debug: boolean;\r\n private currentHash: string; // have to start with # if not empty\r\n private overriddenHash: string; // have to start with # if not empty\r\n private isPossibleSwipe: boolean;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n this.navigations = [];\r\n this.id = Date.now();\r\n this.manual = false;\r\n this.log = logger('NC');\r\n this.debug = true;\r\n this.currentHash = window.location.hash;\r\n this.overriddenHash = '';\r\n this.isPossibleSwipe = false;\r\n\r\n window.addEventListener('popstate', this.onPopState);\r\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', this.onTouchStart, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private onPopState = (e: PopStateEvent) => {\r\n const hash = window.location.hash;\r\n const id: number = e.state;\r\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\r\n if(hash !== this.currentHash) {\r\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\r\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\r\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\r\n this.overrideHash(this.overriddenHash);\r\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\r\n this.overrideHash();\r\n } else {\r\n this.currentHash = hash;\r\n this.onHashChange && this.onHashChange();\r\n // this.replaceState();\r\n return;\r\n }\r\n }\r\n\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n\r\n if(!this.navigations.length) {\r\n return;\r\n }\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !this.isPossibleSwipe;\r\n this.handleItem(item);\r\n // this.pushState(); // * prevent adding forward arrow\r\n };\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n };\r\n\r\n private onTouchStart = (e: TouchEvent) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n this.isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n this.isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n };\r\n\r\n public overrideHash(hash: string = '') {\r\n if(hash && hash[0] !== '#') hash = '#' + hash;\r\n else if(hash === '#') hash = '';\r\n\r\n this.overriddenHash = this.currentHash = hash;\r\n this.replaceState();\r\n this.pushState();\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n // if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n // }\r\n }\r\n\r\n private onItemAdded(item: NavigationItem) {\r\n this.debug && this.log('onItemAdded', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public unshiftItem(item: NavigationItem) {\r\n this.navigations.unshift(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\r\n this.navigations.splice(index, length, ...items);\r\n items.forEach((item) => {\r\n this.onItemAdded(item);\r\n });\r\n }\r\n\r\n private pushState() {\r\n this.debug && this.log('push');\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n this.debug && this.log.warn('replace');\r\n\r\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\r\n history.replaceState(this.id, '', url);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n\r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\r\nimport resizeableImage from '../../lib/cropper';\r\nimport PopupElement from '.';\r\nimport {_i18n} from '../../lib/langPack';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\r\nimport rootScope from '../../lib/rootScope';\r\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then((contents) => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n\r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n\r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob((blob) => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement,\r\n container: HTMLDivElement,\r\n cropImage: HTMLImageElement,\r\n event_state: Partial<{\r\n mouse_x: number,\r\n mouse_y: number,\r\n container_width: number,\r\n container_height: number,\r\n container_left: number,\r\n container_top: number\r\n }> = {},\r\n keyZoomValue = 4.0,\r\n MINWIDTH = 50,\r\n MINHEIGHT = 50,\r\n CROPWIDTH = 200,\r\n CROPHEIGHT = 200,\r\n cropLeft = 0,\r\n cropTop = 0,\r\n cropWidth = 0,\r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n\r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n\r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n\r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n\r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n\r\n document.addEventListener('keypress', keyHandler, false);\r\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n\r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n\r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n\r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n\r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n\r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n\r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n\r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n\r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n\r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n // crop();\r\n }\r\n\r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n\r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n\r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n\r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n\r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n\r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n\r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom),\r\n newHeight = Math.floor(container.clientHeight + zoom),\r\n w = cropImage.clientWidth,\r\n h = cropImage.clientHeight,\r\n left: number,\r\n top: number,\r\n right: number,\r\n bottom: number;\r\n\r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n\r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n\r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n // crop();\r\n }\r\n\r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n\r\n switch(String.fromCharCode(e.charCode)) {\r\n case '+':\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-':\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n\r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n\r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n saveEventState(e);\r\n\r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n\r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n\r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n\r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0},\r\n left: number,\r\n top: number,\r\n w: number,\r\n h: number;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n\r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n\r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n // crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n\r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ripple from '../ripple';\r\nimport animationIntersector from '../animationIntersector';\r\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\r\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\r\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport overlayCounter from '../../helpers/overlayCounter';\r\nimport Scrollable from '../scrollable';\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: boolean,\r\n overlayClosable: boolean,\r\n withConfirm: LangPackKey | boolean,\r\n body: boolean,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean,\r\n scrollable: boolean,\r\n buttons: Array,\r\n title: boolean | LangPackKey\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): T;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement extends EventListenerBase {\r\n private static POPUPS: PopupElement[] = [];\r\n public static MANAGERS: AppManagers;\r\n\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n protected managers: AppManagers;\r\n\r\n protected scrollable: Scrollable;\r\n\r\n protected buttons: Array;\r\n\r\n constructor(className: string, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n\r\n if(options.title) {\r\n this.title.classList.add('popup-title');\r\n if(typeof(options.title) === 'string') {\r\n _i18n(this.title, options.title);\r\n }\r\n\r\n this.header.append(this.title);\r\n }\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n this.managers = PopupElement.MANAGERS;\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n // ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n if(options.scrollable) {\r\n const scrollable = this.scrollable = new Scrollable(this.body);\r\n scrollable.onAdditionalScroll = () => {\r\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\r\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\r\n };\r\n\r\n scrollable.container.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\r\n\r\n if(!this.body) {\r\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\r\n }\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n const buttons = this.buttons = options.buttons;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n const buttonsElements = buttons.map((b) => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n\r\n ripple(button);\r\n\r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n\r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n return b.element = button;\r\n });\r\n\r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find((button) => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n protected onContentUpdate() {\r\n if(this.scrollable) {\r\n this.scrollable.onAdditionalScroll();\r\n }\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: () => this.destroy(),\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n this.onContentUpdate();\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n // if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n if(!this.element.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\r\n return;\r\n }\r\n\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n // }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n protected destroy() {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n }\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach((popup) => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopups(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\r\n }\r\n\r\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\r\n const popup = new ctor(...args);\r\n return popup;\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find((b) => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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\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","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../../lib/rootScope';\r\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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"],"names":["appNavigationController","constructor","onPopState","e","hash","window","location","id","state","this","debug","log","isPossibleSwipe","currentHash","warn","overriddenHash","overrideHash","onHashChange","pushState","navigations","length","item","pop","manual","handleItem","onKeyDown","key","onEscape","back","type","onTouchStart","touches","addEventListener","setTimeout","passive","once","Date","now","capture","IS_MOBILE_SAFARI","options","history","scrollRestoration","replaceState","good","onPop","undefined","pushItem","noBlurOnPop","findItemByType","i","index","ret","backByItem","indexOf","splice","onItemAdded","noHistory","push","unshiftItem","unshift","spliceItems","items","forEach","url","origin","pathname","search","removeItem","removeByType","single","PopupAvatar","super","closable","withConfirm","image","Image","cropper","crop","removeHandlers","h6","document","createElement","btnClose","classList","remove","header","append","cropContainer","add","input","style","display","listenerSetter","file","target","files","readBlobAsDataURL","then","contents","src","onload","show","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","draggable","overlayColor","appendChild","parentNode","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","getContext","drawImage","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","open","postCanvas","click","ctx","fillStyle","fillRect","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","element","title","navigationItem","managers","MANAGERS","confirmShortcutIsSendShortcut","prepend","withoutOverlay","overlayClosable","scrollable","onAdditionalScroll","toggle","scrollTop","isScrolledDown","insertBefore","nextSibling","btnConfirmOnEnter","buttons","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","callback","destroy","find","isCancel","POPUPS","onContentUpdate","contains","dispatchEvent","removeAll","cleanup","static","popup","parentElement","popupConstructor","filter","ctor","args","addCancelButton","method","Promise","reader","FileReader","result","readBlobAs","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","bind","split","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","isSendShortcutPressed","IS_MOBILE","isComposing","shiftKey","ctrlKey","metaKey","secondaryKey","IS_APPLE","isSwipingBackSafari","TouchEvent"],"sourceRoot":""} \ No newline at end of file diff --git a/public/765.e78c17ede1cf4eff6bac.chunk.js b/public/765.e78c17ede1cf4eff6bac.chunk.js deleted file mode 100644 index 99f3db153..000000000 --- a/public/765.e78c17ede1cf4eff6bac.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[765],{9818:(e,t,n)=>{n.d(t,{Z:()=>d});var i=n(410),s=n(4762),o=n(5003),a=n(8799),r=n(3910),h=n(3444),c=n(1655);const l=new class{constructor(){if(this.onPopState=e=>{let t=window.location.hash;const n=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}`),n===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!n||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(n!==this.id&&(this.pushState(),!this.navigations.length))return;const i=this.navigations.pop();i?(this.manual=!this.isPossibleSwipe,this.handleItem(i)):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,h.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,o.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}),s.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.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,a.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,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,...n){this.navigations.splice(e,t,...n),n.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,c.Z)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0&&(this.navigations[n].type!==e||(this.navigations.splice(n,1),!t));--n);}};i.GO.appNavigationController=l;const d=l},6765:(e,t,n)=>{n.d(t,{Z:()=>h});var i=n(1168),s=n(2325),o=n(2738),a=n(7084),r=n(2312);class h extends i.Z{constructor(){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,s.$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),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,a.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 n,i,s,o={},a=0,r=0,h=0,c=0,l=0;function d(){e.classList.add("crop-blur"),e.draggable=!1,s=new Image,s.src=e.src,s.draggable=!1,s.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),i=document.createElement("div"),i.classList.add("crop-overlay");const o=document.createElement("div");o.classList.add("crop-overlay-color"),n.appendChild(i),e.parentNode.appendChild(n),n.appendChild(s),n.appendChild(e),n.appendChild(o),i.appendChild(s),s.style.maxWidth=e.width+"px",l=e.naturalWidth/e.offsetWidth;const a=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(a,r),m(a,r),i.addEventListener("mousedown",b,!1),i.addEventListener("touchstart",b,!1),i.addEventListener("wheel",g,!1),document.addEventListener("keypress",f,!1)}function u(e,t){h=e*l,c=t*l,i.style.width=e+"px",i.style.height=t+"px"}function p(e,t){r=t*l,a=e*l,s.style.top=-t+"px",s.style.left=-e+"px"}function m(e,t){i.style.top=t+"px",i.style.left=e+"px"}function v(e){e=e*Math.PI*2;let t,n,o,a,r=Math.floor(i.clientWidth+e),h=Math.floor(i.clientHeight+e),c=s.clientWidth,l=s.clientHeight;r<50||r>c||(t=i.offsetLeft-e/2,n=i.offsetTop-e/2,o=t+r,a=n+h,t<0&&(t=0),n<0&&(n=0),o>c||a>l||(u(r,r),p(t,n),m(t,n)))}function f(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":v(4);break;case"-":v(-4)}}function g(e){e.preventDefault(),v(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){o.container_width=i.offsetWidth,o.container_height=i.offsetHeight,o.container_left=i.offsetLeft,o.container_top=i.offsetTop,o.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,o.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",E),document.addEventListener("touchmove",E),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E)}function E(e){let t,n,a,r,h={x:0,y:0};e.preventDefault(),e.stopPropagation(),h.x=e.pageX||e.touches&&e.touches[0].pageX,h.y=e.pageY||e.touches&&e.touches[0].pageY,t=h.x-(o.mouse_x-o.container_left),n=h.y-(o.mouse_y-o.container_top),a=i.offsetWidth,r=i.offsetHeight,t<0?t=0:t>s.offsetWidth-a&&(t=s.offsetWidth-a),n<0?n=0:n>s.offsetHeight-r&&(n=s.offsetHeight-r),p(t,n),m(t,n)}return e.complete?d():e.onload=d,{crop:function(){t.width=h,t.height=c,t.getContext("2d").drawImage(e,a,r,h,c,0,0,h,c)},removeHandlers:function(){i.removeEventListener("mousedown",b),i.removeEventListener("touchstart",b),i.removeEventListener("wheel",g),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E),document.removeEventListener("keypress",f),n.remove(),i.remove(),s.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,o.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(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},1168:(e,t,n)=>{n.d(t,{Z:()=>w,x:()=>S});var i=n(1405),s=n(5814),o=n(9818),a=n(2325),r=n(8497),h=n(8799),c=n(3699),l=n(2738),d=n(6299),u=n(3910),p=n(3241),m=n(6733),v=n(1655),f=n(3815),g=n(8805);const b=document.body;let y=b;const E=()=>{y=(0,m.W7)()||b,w.reAppend()};(0,m.Ms)(b,E);class w 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=()=>{o.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&&(this.title.classList.add("popup-title"),"string"==typeof t.title&&(0,a.$d)(this.title,t.title),this.header.append(this.title)),this.listenerSetter=new c.Z,this.managers=w.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,l.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,l.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,a.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,i.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 g.ZP(this.body);e.onAdditionalScroll=()=>{e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},e.container.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered"),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let n=this.btnConfirm;const s=this.buttons=t.buttons;if(null==s?void 0:s.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=s.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),(0,i.Z)(t),e.text?t.innerHTML=e.text:t.append((0,a.ag)(e.langKey,e.langArgs)),(0,l.fc)(t,(()=>{e.callback&&e.callback(),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!n&&2===s.length){const e=s.find((e=>!e.isCancel));e&&(n=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=n,this.element.append(this.container),w.POPUPS.push(this)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},o.Z.pushItem(this.navigationItem),(0,h.Z)(),y.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(f.Z.isOverlayActive=!0,s.Z.checkAnimations(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{w.POPUPS[w.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,d.Z)(e):"Enter"===e.key)&&((0,l.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.withoutOverlay||(f.Z.isOverlayActive=!1),o.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,v.Z)(w.POPUPS,this),E(),setTimeout((()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||s.Z.checkAnimations(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:n}=e,i=t.parentElement;i&&i!==y&&y!==n&&y.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}w.POPUPS=[];const S=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},7084:(e,t,n)=>{function i(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsDataURL(e)}))}(e)}n.d(t,{Z:()=>i})},6733:(e,t,n)=>{function i(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function s(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function o(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{i(e,t,!1)}))}function a(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!a()}n.d(t,{C8:()=>s,Dj:()=>i,Ms:()=>o,W7:()=>a,rB:()=>r})},6299:(e,t,n)=>{n.d(t,{Z:()=>o});var i=n(3512),s=n(4762);function o(e){if("Enter"===e.key&&!s.IS_MOBILE&&!e.isComposing){if("enter"===i.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=s.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(s.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,n)=>{n.d(t,{Z:()=>s});var i=n(4762);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}}}]); -//# sourceMappingURL=765.e78c17ede1cf4eff6bac.chunk.js.map \ No newline at end of file diff --git a/public/765.e78c17ede1cf4eff6bac.chunk.js.map b/public/765.e78c17ede1cf4eff6bac.chunk.js.map deleted file mode 100644 index b877bbfab..000000000 --- a/public/765.e78c17ede1cf4eff6bac.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"765.e78c17ede1cf4eff6bac.chunk.js","mappings":"qLAyQA,MAAMA,EAA0B,IAjPzB,MAWLC,cAaE,GAUM,KAAAC,WAAcC,IACpB,IAAIC,EAAOC,OAAOC,SAASF,KAC3B,MAAMG,EAAaJ,EAAEK,MAErB,GADAC,KAAKC,OAASD,KAAKE,IAAI,WAAYR,EAAGM,KAAKG,gBAAiBR,GACzDA,IAASK,KAAKI,YAGf,GAFAJ,KAAKC,OAASD,KAAKE,IAAIG,KAAK,qBAAqBV,cAAiBK,KAAKI,2BAA2BJ,KAAKM,kBAEpGR,IAAOE,KAAKF,IAAME,KAAKM,gBAAkBN,KAAKM,iBAAmBX,EAClEK,KAAKO,aAAaP,KAAKM,oBAClB,KAAGR,GAAyBE,KAAKM,iBAAkBX,EAMxD,OAHAK,KAAKI,YAAcT,OACnBK,KAAKQ,cAAgBR,KAAKQ,gBAH1BR,KAAKO,eAST,GAAGT,IAAOE,KAAKF,KACbE,KAAKS,aAEDT,KAAKU,YAAYC,QACnB,OAIJ,MAAMC,EAAOZ,KAAKU,YAAYG,MAC1BD,GAKJZ,KAAKc,QAAUd,KAAKG,gBACpBH,KAAKe,WAAWH,IALdZ,KAAKS,aASD,KAAAO,UAAatB,IACnB,MAAMkB,EAAOZ,KAAKU,YAAYV,KAAKU,YAAYC,OAAS,GACpDC,IACS,WAAVlB,EAAEuB,KAAqBL,EAAKM,WAAWN,EAAKM,cAC7C,OAAYxB,GACZM,KAAKmB,KAAKP,EAAKQ,SAIX,KAAAC,aAAgB3B,IACnBA,EAAE4B,QAAQX,OAAS,IACtBX,KAAKC,OAASD,KAAKE,IAAI,eAEpB,OAAoBR,KACrBM,KAAKG,iBAAkB,EAEvBP,OAAO2B,iBAAiB,YAAY,KAClCC,YAAW,KACTxB,KAAKG,iBAAkB,IACtB,OACF,CAACsB,SAAS,EAAMC,MAAM,OAhF3B1B,KAAKU,YAAc,GACnBV,KAAKF,GAAK6B,KAAKC,MACf5B,KAAKc,QAAS,EACdd,KAAKE,KAAM,QAAO,MAClBF,KAAKC,OAAQ,EACbD,KAAKI,YAAcR,OAAOC,SAASF,KACnCK,KAAKM,eAAiB,GACtBN,KAAKG,iBAAkB,EAEvBP,OAAO2B,iBAAiB,WAAYvB,KAAKP,YACzCG,OAAO2B,iBAAiB,UAAWvB,KAAKgB,UAAW,CAACa,SAAS,EAAMJ,SAAS,IAEzE,EAAAK,iBAAkB,CACnB,MAAMC,EAAU,CAACN,SAAS,GAC1B7B,OAAO2B,iBAAiB,aAAcvB,KAAKqB,aAAcU,GAG3DC,QAAQC,kBAAoB,SAE5BjC,KAAKS,YAmGAF,aAAaZ,EAAe,IAC9BA,GAAoB,MAAZA,EAAK,GAAYA,EAAO,IAAMA,EACxB,MAATA,IAAcA,EAAO,IAE7BK,KAAKM,eAAiBN,KAAKI,YAAcT,EACzCK,KAAKkC,eACLlC,KAAKS,YAGCM,WAAWH,GACjB,MAAMuB,EAAOvB,EAAKwB,QAAOpC,KAAKc,aAAiBuB,GAC/CrC,KAAKC,OAASD,KAAKE,IAAI,wBAAyBU,EAAMZ,KAAKU,cAC/C,IAATyB,EACDnC,KAAKsC,SAAS1B,GACLA,EAAK2B,cACd,SAGFvC,KAAKc,QAAS,EAGT0B,eAAepB,GACpB,IAAI,IAAIqB,EAAIzC,KAAKU,YAAYC,OAAS,EAAG8B,GAAK,IAAKA,EAAG,CACpD,MAAM7B,EAAOZ,KAAKU,YAAY+B,GAC9B,GAAG7B,EAAKQ,OAASA,EACf,MAAO,CAACR,KAAAA,EAAM8B,MAAOD,IAKpBtB,KAAKC,GACV,GAAGA,EAAM,CACP,MAAMuB,EAAM3C,KAAKwC,eAAepB,GAChC,GAAGuB,EAED,YADA3C,KAAK4C,WAAWD,EAAI/B,KAAM+B,EAAID,OAKlCV,QAAQb,OAGHyB,WAAWhC,EAAsB8B,EAAQ1C,KAAKU,YAAYmC,QAAQjC,IACvEZ,KAAKc,QAAS,EAGZd,KAAKU,YAAYoC,OAAOJ,EAAO,GAC/B1C,KAAKe,WAAWH,GAIZmC,YAAYnC,GAClBZ,KAAKC,OAASD,KAAKE,IAAI,cAAeU,EAAMZ,KAAKU,aAE7CE,EAAKoC,WACPhD,KAAKS,YAIF6B,SAAS1B,GACdZ,KAAKU,YAAYuC,KAAKrC,GACtBZ,KAAK+C,YAAYnC,GAGZsC,YAAYtC,GACjBZ,KAAKU,YAAYyC,QAAQvC,GACzBZ,KAAK+C,YAAYnC,GAGZwC,YAAYV,EAAe/B,KAAmB0C,GACnDrD,KAAKU,YAAYoC,OAAOJ,EAAO/B,KAAW0C,GAC1CA,EAAMC,SAAS1C,IACbZ,KAAK+C,YAAYnC,MAIbH,YACNT,KAAKC,OAASD,KAAKE,IAAI,QACvBF,KAAKc,QAAS,EACdkB,QAAQvB,UAAUT,KAAKF,GAAI,IAGtBoC,eACLlC,KAAKC,OAASD,KAAKE,IAAIG,KAAK,WAE5B,MAAMkD,EAAM1D,SAAS2D,OAAS3D,SAAS4D,SAAW5D,SAAS6D,OAAS1D,KAAKM,eACzE0B,QAAQE,aAAalC,KAAKF,GAAI,GAAIyD,GAG7BI,WAAW/C,GACZA,IAIJ,OAAiBZ,KAAKU,YAAaE,GAG9BgD,aAAaxC,EAA8ByC,GAAS,GACzD,IAAI,IAAIpB,EAAIzC,KAAKU,YAAYC,OAAS,EAAG8B,GAAK,IAC/BzC,KAAKU,YAAY+B,GACtBrB,OAASA,IACfpB,KAAKU,YAAYoC,OAAOL,EAAG,IAExBoB,MAL4CpB,MAcvD,6BAAyClD,EACzC,W,sFC5Pe,MAAMuE,UAAoB,IAgBvCtE,cACEuE,MAAM,eAAgB,CAACC,UAAU,EAAMC,aAAa,IAZ9C,KAAAC,MAAQ,IAAIC,MAIZ,KAAAC,QAAU,CAChBC,KAAM,OACNC,eAAgB,QAQhBtE,KAAKuE,GAAKC,SAASC,cAAc,OACjC,QAAMzE,KAAKuE,GAAI,sBAEfvE,KAAK0E,SAASC,UAAUC,OAAO,YAE/B5E,KAAK6E,OAAOC,OAAO9E,KAAKuE,IAExBvE,KAAK+E,cAAgBP,SAASC,cAAc,OAC5CzE,KAAK+E,cAAcJ,UAAUK,IAAI,QACjChF,KAAK+E,cAAcD,OAAO9E,KAAKkE,OAE/BlE,KAAKiF,MAAQT,SAASC,cAAc,SACpCzE,KAAKiF,MAAM7D,KAAO,OAClBpB,KAAKiF,MAAMC,MAAMC,QAAU,OAC3BnF,KAAKoF,eAAeJ,IAAIhF,KAAKiF,MAA7BjF,CAAoC,UAAWN,IAC7C,MAAM2F,EAAO3F,EAAE4F,OAAOC,MAAM,GACxBF,IAIJ,EAAAG,EAAA,GAAkBH,GAAMI,MAAMC,IAC5B1F,KAAKkE,MAAQ,IAAIC,MACjBnE,KAAK+E,cAAcD,OAAO9E,KAAKkE,OAC/BlE,KAAKkE,MAAMyB,IAAMD,EAEjB1F,KAAKkE,MAAM0B,OAAS,KAIlB5F,KAAK6F,OAEL7F,KAAKoE,QC3Df,SAAyB0B,EAAiCC,GACxD,IAAIC,EACFC,EACAC,EACAC,EAOK,GAMLC,EAAW,EACXC,EAAU,EACVC,EAAY,EACZC,EAAa,EACbC,EAAc,EA8BhB,SAASC,IACPX,EAAcnB,UAAUK,IAAI,aAC5Bc,EAAcY,WAAY,EAE1BR,EAAY,IAAI/B,MAChB+B,EAAUP,IAAMG,EAAcH,IAC9BO,EAAUQ,WAAY,EACtBR,EAAUvB,UAAUK,IAAI,sBAEpBe,IACFA,EAASvB,SAASC,cAAc,WAGlCuB,EAAgBxB,SAASC,cAAc,OACvCuB,EAAcrB,UAAUK,IAAI,kBAE5BiB,EAAYzB,SAASC,cAAc,OACnCwB,EAAUtB,UAAUK,IAAI,gBAExB,MAAM2B,EAAenC,SAASC,cAAc,OAC5CkC,EAAahC,UAAUK,IAAI,sBAE3BgB,EAAcY,YAAYX,GACVH,EAAce,WACtBD,YAAYZ,GACpBA,EAAcY,YAAYV,GAC1BF,EAAcY,YAAYd,GAC1BE,EAAcY,YAAYD,GAC1BV,EAAUW,YAAYV,GAEtBA,EAAUhB,MAAM4B,SAAWhB,EAAciB,MAAQ,KAEjDP,EAAcV,EAAckB,aAAelB,EAAcmB,YAEzD,MAAMC,EAAOpB,EAAcmB,YAAc,EAAIE,IACvCC,EAAMtB,EAAcuB,aAAe,EAAIC,IAE7CC,EAzEY,IACC,KAyEbC,EAAgBN,EAAME,GACtBK,EAAgBP,EAAME,GA/CtBnB,EAAU1E,iBAAiB,YAAamG,GAAa,GACrDzB,EAAU1E,iBAAiB,aAAcmG,GAAa,GACtDzB,EAAU1E,iBAAiB,QAASoG,GAAU,GAE9CnD,SAASjD,iBAAiB,WAAYqG,GAAY,GAgDpD,SAASL,EAAeR,EAAec,GACrCvB,EAAYS,EAAQP,EACpBD,EAAasB,EAASrB,EAEtBP,EAAUf,MAAM6B,MAAQA,EAAQ,KAChCd,EAAUf,MAAM2C,OAASA,EAAS,KAGpC,SAASL,EAAgBN,EAAcE,GACrCf,EAAUe,EAAMZ,EAChBJ,EAAWc,EAAOV,EAElBN,EAAUhB,MAAMkC,KAAOA,EAAM,KAC7BlB,EAAUhB,MAAMgC,MAAQA,EAAO,KAGjC,SAASO,EAAgBP,EAAcE,GACrCnB,EAAUf,MAAMkC,IAAMA,EAAM,KAC5BnB,EAAUf,MAAMgC,KAAOA,EAAO,KAehC,SAASY,EAAQC,GACfA,EAAOA,EAAOC,KAAKC,GAAK,EACxB,IAIEf,EACAE,EACAc,EACAC,EAPEC,EAAWJ,KAAKK,MAAMpC,EAAUqC,YAAcP,GAChDQ,EAAYP,KAAKK,MAAMpC,EAAUuC,aAAeT,GAChDU,EAAIvC,EAAUoC,YACdI,EAAIxC,EAAUsC,aAMbJ,EA9HQ,IAgIDA,EAAWK,IAIrBvB,EAAOjB,EAAU0C,WAAcZ,EAAO,EACtCX,EAAMnB,EAAU2C,UAAab,EAAO,EACpCG,EAAQhB,EAAOkB,EACfD,EAASf,EAAMmB,EAEZrB,EAAO,IAAGA,EAAO,GACjBE,EAAM,IAAGA,EAAM,GAEfc,EAAQO,GACRN,EAASO,IAEZnB,EAAea,EAAUA,GACzBZ,EAAgBN,EAAME,GACtBK,EAAgBP,EAAME,KAIxB,SAASQ,EAAWlI,GAGlB,OAFAA,EAAEmJ,iBAEMC,OAAOC,aAAarJ,EAAEsJ,WAC5B,IAAK,IACLlB,EA3Ja,GA4Jb,MACA,IAAK,IACLA,GA9Ja,IAmKjB,SAASH,EAASjI,GAChBA,EAAEmJ,iBACFf,EAAQpI,EAAEuJ,OAAS,EAAI,GAAK,GAG9B,SAASvB,EAAYhI,GACnBA,EAAEmJ,iBACFnJ,EAAEwJ,kBAjEJ,SAAwBxJ,GACtByG,EAAYgD,gBAAkBlD,EAAUgB,YACxCd,EAAYiD,iBAAmBnD,EAAUoB,aAEzClB,EAAYkD,eAAiBpD,EAAU0C,WACvCxC,EAAYmD,cAAgBrD,EAAU2C,UAEtCzC,EAAYoD,SAAW7J,EAAE8J,SAAW9J,EAAE+J,OAAS/J,EAAE4B,SAAW5B,EAAE4B,QAAQ,GAAGkI,SAAW5J,OAAO8J,QAC3FvD,EAAYwD,SAAWjK,EAAEkK,SAAWlK,EAAEmK,OAASnK,EAAE4B,SAAW5B,EAAE4B,QAAQ,GAAGsI,SAAWhK,OAAOkK,QA2D3FC,CAAerK,GAEf8E,SAASjD,iBAAiB,YAAayI,GACvCxF,SAASjD,iBAAiB,YAAayI,GACvCxF,SAASjD,iBAAiB,UAAW0I,GACrCzF,SAASjD,iBAAiB,WAAY0I,GAGxC,SAASA,EAAUvK,GACjBA,EAAEmJ,iBAEFrE,SAAS0F,oBAAoB,UAAWD,GACxCzF,SAAS0F,oBAAoB,WAAYD,GACzCzF,SAAS0F,oBAAoB,YAAaF,GAC1CxF,SAAS0F,oBAAoB,YAAaF,GAG5C,SAASA,EAAOtK,GACd,IACEwH,EACAE,EACAqB,EACAC,EAJEyB,EAAe,CAACC,EAAG,EAAGC,EAAG,GAM7B3K,EAAEmJ,iBACFnJ,EAAEwJ,kBAEFiB,EAAaC,EAAI1K,EAAE+J,OAAS/J,EAAE4B,SAAW5B,EAAE4B,QAAQ,GAAGmI,MACtDU,EAAaE,EAAI3K,EAAEmK,OAASnK,EAAE4B,SAAW5B,EAAE4B,QAAQ,GAAGuI,MAEtD3C,EAAOiD,EAAaC,GAAKjE,EAAYoD,QAAUpD,EAAYkD,gBAC3DjC,EAAM+C,EAAaE,GAAKlE,EAAYwD,QAAUxD,EAAYmD,eAC1Db,EAAIxC,EAAUgB,YACdyB,EAAIzC,EAAUoB,aAEXH,EAAO,EAAGA,EAAO,EACZA,EAAOhB,EAAUe,YAAcwB,IAAGvB,EAAOhB,EAAUe,YAAcwB,GAEtErB,EAAM,EAAGA,EAAM,EACVA,EAAMlB,EAAUmB,aAAeqB,IAAGtB,EAAMlB,EAAUmB,aAAeqB,GAEzElB,EAAgBN,EAAME,GACtBK,EAAgBP,EAAME,GAiBxB,OA5NGtB,EAAcwE,SAAU7D,IACtBX,EAAcF,OAASa,EA2NrB,CAACpC,KAbR,WACE0B,EAAOgB,MAAQT,EACfP,EAAO8B,OAAStB,EAEJR,EAAOwE,WAAW,MAC1BC,UAAU1E,EACZM,EAAUC,EACVC,EAAWC,EACX,EAAG,EACHD,EAAWC,IAIDjC,eAzNd,WACE2B,EAAUiE,oBAAoB,YAAaxC,GAC3CzB,EAAUiE,oBAAoB,aAAcxC,GAC5CzB,EAAUiE,oBAAoB,QAASvC,GAEvCnD,SAAS0F,oBAAoB,UAAWD,GACxCzF,SAAS0F,oBAAoB,WAAYD,GACzCzF,SAAS0F,oBAAoB,YAAaF,GAC1CxF,SAAS0F,oBAAoB,YAAaF,GAC1CxF,SAAS0F,oBAAoB,WAAYtC,GAEzC5B,EAAcpB,SACdqB,EAAUrB,SACVsB,EAAUtB,WDoBW,CAAgB5E,KAAKkE,MAAOlE,KAAK+F,QAChD/F,KAAKiF,MAAMwF,MAAQ,UAGtB,GAEHzK,KAAK0K,WAAWC,UAAY,oFAC5B,QAAiB3K,KAAK0K,YAAY,KAChC1K,KAAKoE,QAAQC,OACbrE,KAAK4K,OAEL5K,KAAK+F,OAAO8E,QAAQC,IAClB9K,KAAK8K,KAAOA,EACZ9K,KAAK+K,eACL/K,KAAKgL,YACJ,aAAc,KAChB,CAAC5F,eAAgBpF,KAAKoF,iBAEzBpF,KAAKiG,UAAUnB,OAAO9E,KAAK+E,cAAe/E,KAAK0K,WAAY1K,KAAKiF,OAEhEjF,KAAKuB,iBAAiB,qBAAqB,KACzCvB,KAAKoE,QAAQE,iBACVtE,KAAKkE,OACNlE,KAAKkE,MAAMU,YAKToG,UACNhL,KAAKiL,QAAO,IACHC,EAAA,SAA0BlL,KAAK8K,QAInCK,KAAKC,EAA+BH,GACzCjL,KAAK+F,OAASqF,EACdpL,KAAKiL,OAASA,EAEdjL,KAAKiF,MAAMoG,QAGNN,eACL,IAAIO,EAAMtL,KAAK+F,OAAOwE,WAAW,MACjCe,EAAIC,UAAY,qBAChBD,EAAIE,SAAS,EAAG,EAAGxL,KAAK+F,OAAOgB,MAAO/G,KAAK+F,OAAO8B,W,kME5DtD,MAAM4D,EAAoBjH,SAASkH,KACnC,IAAIC,EAAgBF,EAEpB,MAAMG,EAAqB,KACzBD,GAAgB,WAA0BF,EAC1CI,EAAaC,aAGf,QAAsBL,EAAmBG,GAO1B,MAAMC,UAA4D,IA8B/ErM,YAAYmL,EAAmB5I,EAAwB,IA6DrD,GA5DAgC,OAAM,GA3BE,KAAAgI,QAAUvH,SAASC,cAAc,OACjC,KAAAwB,UAAYzB,SAASC,cAAc,OACnC,KAAAI,OAASL,SAASC,cAAc,OAChC,KAAAuH,MAAQxH,SAASC,cAAc,OAM/B,KAAAvD,SAA0B,KAAM,EAwLnC,KAAA0J,KAAO,KACZ,eAAmC5K,KAAKiM,iBAtKxCjM,KAAK+L,QAAQpH,UAAUK,IAAI,SAC3BhF,KAAK+L,QAAQpB,UAAY,SAAWA,EAAY,IAAMA,EAAY,IAClE3K,KAAKiG,UAAUtB,UAAUK,IAAI,kBAAmB,aAEhDhF,KAAK6E,OAAOF,UAAUK,IAAI,gBAEvBjD,EAAQiK,QACThM,KAAKgM,MAAMrH,UAAUK,IAAI,eACI,iBAAnBjD,EAAa,QACrB,QAAM/B,KAAKgM,MAAOjK,EAAQiK,OAG5BhM,KAAK6E,OAAOC,OAAO9E,KAAKgM,QAG1BhM,KAAKoF,eAAiB,IAAI,IAC1BpF,KAAKkM,SAAWL,EAAaM,SAE7BnM,KAAKoM,8BAAgCrK,EAAQqK,8BAE1CrK,EAAQiC,WACThE,KAAK0E,SAAWF,SAASC,cAAc,QACvCzE,KAAK0E,SAASC,UAAUK,IAAI,WAAY,cAAe,eAEvDhF,KAAK6E,OAAOwH,QAAQrM,KAAK0E,WAEzB,QAAiB1E,KAAK0E,SAAU1E,KAAK4K,KAAM,CAACxF,eAAgBpF,KAAKoF,eAAgB1D,MAAM,KAGzF1B,KAAKsM,eAAiBvK,EAAQuK,eAC3BtM,KAAKsM,gBACNtM,KAAK+L,QAAQpH,UAAUK,IAAI,cAG1BjD,EAAQwK,kBACT,QAAiBvM,KAAK+L,SAAUrM,KAC1B,OAAgBA,EAAE4F,OAAQ,oBAC5BtF,KAAK4K,SAEN,CAACxF,eAAgBpF,KAAKoF,iBAGxBrD,EAAQkC,cACTjE,KAAK0K,WAAalG,SAASC,cAAc,UACzCzE,KAAK0K,WAAW/F,UAAUK,IAAI,cAAe,sBAClB,IAAxBjD,EAAQkC,aACTjE,KAAK0K,WAAW5F,QAAO,QAAK/C,EAAQkC,cAEtCjE,KAAK6E,OAAOC,OAAO9E,KAAK0K,aACxB,OAAO1K,KAAK0K,aAGd1K,KAAKiG,UAAUnB,OAAO9E,KAAK6E,QACxB9C,EAAQ2J,OACT1L,KAAK0L,KAAOlH,SAASC,cAAc,OACnCzE,KAAK0L,KAAK/G,UAAUK,IAAI,cACxBhF,KAAKiG,UAAUnB,OAAO9E,KAAK0L,OAG1B3J,EAAQyK,WAAY,CACrB,MAAMA,EAAaxM,KAAKwM,WAAa,IAAI,KAAWxM,KAAK0L,MACzDc,EAAWC,mBAAqB,KAC9BD,EAAWvG,UAAUtB,UAAU+H,OAAO,gBAAiBF,EAAWG,WAClEH,EAAWvG,UAAUtB,UAAU+H,OAAO,kBAAmBF,EAAWI,iBAGtEJ,EAAWvG,UAAUtB,UAAUK,IAAI,eAAgB,kBAAmB,yBAElEhF,KAAK0L,MACP1L,KAAKiG,UAAU4G,aAAaL,EAAWvG,UAAWjG,KAAK6E,OAAOiI,aAIlE,IAAIC,EAAoB/M,KAAK0K,WAC7B,MAAMsC,EAAUhN,KAAKgN,QAAUjL,EAAQiL,QACvC,GAAGA,MAAAA,OAAO,EAAPA,EAASrM,OAAQ,CAClB,MAAMsM,EAAajN,KAAKkN,UAAY1I,SAASC,cAAc,OAC3DwI,EAAWtI,UAAUK,IAAI,iBAEzB,MAAMmI,EAAkBH,EAAQI,KAAKC,IACnC,MAAMC,EAAS9I,SAASC,cAAc,UAgBtC,OAfA6I,EAAO3C,UAAY,OAAS0C,EAAEE,SAAW,UAAY,aAErD,OAAOD,GAEJD,EAAEG,KACHF,EAAOG,UAAaJ,EAAEG,KAEtBF,EAAOxI,QAAO,QAAKuI,EAAEK,QAASL,EAAEM,YAGlC,QAAiBL,GAAQ,KACvBD,EAAEO,UAAYP,EAAEO,WAChB5N,KAAK6N,YACJ,CAACzI,eAAgBpF,KAAKoF,eAAgB1D,MAAM,IAExC2L,EAAEtB,QAAUuB,KAGrB,IAAIP,GAAwC,IAAnBC,EAAQrM,OAAc,CAC7C,MAAM2M,EAASN,EAAQc,MAAMR,IAAYA,EAAOS,WAC7CT,IACDP,EAAoBO,EAAOvB,SAI/BkB,EAAWnI,UAAUqI,GACrBnN,KAAKiG,UAAUnB,OAAOmI,GAGxBjN,KAAK+M,kBAAoBA,EAEzB/M,KAAK+L,QAAQjH,OAAO9E,KAAKiG,WAEzB4F,EAAamC,OAAO/K,KAAKjD,MAGjBiO,kBACLjO,KAAKwM,YACNxM,KAAKwM,WAAWC,qBAIb5G,OACL7F,KAAKiM,eAAiB,CACpB7K,KAAM,QACNgB,MAAO,IAAMpC,KAAK6N,UAClB3M,SAAUlB,KAAKkB,UAGjB,aAAiClB,KAAKiM,iBAEtC,SACAN,EAAc7G,OAAO9E,KAAK+L,SACrB/L,KAAK+L,QAAQ9E,YAClBjH,KAAK+L,QAAQpH,UAAUK,IAAI,UAE3BhF,KAAKiO,kBAEDjO,KAAKsM,iBACP,qBAAiC,EACjC,qBAAqC,IAKrC9K,YAAW,KACLxB,KAAK+L,QAAQpH,UAAUuJ,SAAS,WAIpClO,KAAKoF,eAAeJ,IAAIR,SAASkH,KAAjC1L,CAAuC,WAAYN,IAC9CmM,EAAamC,OAAOnC,EAAamC,OAAOrN,OAAS,KAAOX,OAIxDA,KAAKoM,+BAAgC,OAAsB1M,GAAe,UAAVA,EAAEuB,QACnE,QAAmBjB,KAAK+M,oBACxB,OAAYrN,SAGf,GAQGmO,UACR7N,KAAKmO,cAA8B,SACnCnO,KAAK+L,QAAQpH,UAAUK,IAAI,UAC3BhF,KAAK+L,QAAQpH,UAAUC,OAAO,UAC9B5E,KAAKoF,eAAegJ,YAEhBpO,KAAKsM,iBACP,qBAAiC,GAGnC,eAAmCtM,KAAKiM,gBACxCjM,KAAKiM,oBAAiB5J,GAEtB,OAAiBwJ,EAAamC,OAAQhO,MAGtC4L,IAEApK,YAAW,KACTxB,KAAK+L,QAAQnH,SACb5E,KAAKmO,cAA8B,qBACnCnO,KAAKqO,UAEDrO,KAAKsM,gBACP,qBAAqC,KAEtC,KAGEgC,kBACLtO,KAAKgO,OAAO1K,SAASiL,IACnB,MAAM,QAACxC,EAAO,UAAE9F,GAAasI,EACvBC,EAAgBzC,EAAQyC,cAC3BA,GAAiBA,IAAkB7C,GAAiBA,IAAkB1F,GACvE0F,EAAc7G,OAAOiH,MAKpBuC,iBAAyCG,GAC9C,OAAOzO,KAAKgO,OAAOU,QAAQ3C,GAAYA,aAAmB0C,IAGrDH,mBAAiEK,KAA+BC,GAErG,OADc,IAAID,KAAQC,IApPb,EAAAZ,OAA8B,GAyPxC,MAAMa,EAAmB7B,IACfA,EAAQc,MAAMT,GAAMA,EAAEU,YAEnCf,EAAQ/J,KAAK,CACXyK,QAAS,SACTK,UAAU,IAIPf,I,eC3TM,SAASxH,EAAkBsF,GACxC,OCGa,SAAoBA,EAAYgE,GAE7C,OAAO,IAAIC,SAAc/D,IACvB,MAAMgE,EAAS,IAAIC,WACnBD,EAAOzN,iBAAiB,WAAY7B,IAElCsL,EAAQtL,EAAE4F,OAAO4J,WAEnBF,EAAa,cAAElE,MDXVqE,CAAWrE,G,iCEDb,SAASsE,EAAkBrD,GAC7BA,EAAQsD,kBACTtD,EAAQsD,oBAEAtD,EAAQuD,qBAEhBvD,EAAQuD,uBAEAvD,EAAQwD,wBAEhBxD,EAAQwD,0BAEAxD,EAAQyD,qBAEhBzD,EAAQyD,sBAIL,SAASC,IAEXjL,SAASiL,iBAEVjL,SAASiL,mBAEDjL,SAASkL,oBAEjBlL,SAASkL,sBAEDlL,SAASmL,uBAEjBnL,SAASmL,yBAEDnL,SAASoL,kBAEjBpL,SAASoL,mBAIN,SAASC,EAAsB9D,EAAsB6B,EAA6BxI,GACvF,MAAM0K,EAAc1K,EAAiBA,EAAeJ,IAAI+G,GAAWA,EAAQxK,iBAAiBwO,KAAKhE,GACjG,iFAAiFiE,MAAM,KAAK1M,SAAS2M,IACnGH,EAAYG,EAAWrC,GAAU,MAI9B,SAASsC,IAEd,OAAO1L,SAAS2L,mBAAqB3L,SAAS4L,sBAAwB5L,SAAS6L,yBAA2B7L,SAAS8L,oBAG9G,SAASC,IACd,QAASL,I,+GClDI,SAASM,EAAsB9Q,GAC5C,GAAa,UAAVA,EAAEuB,MAAoB,EAAAwP,YAAc/Q,EAAEgR,YAAa,CAOpD,GAAuC,UAApC,0BAA6C,CAC9C,GAAGhR,EAAEiR,UAAYjR,EAAEkR,SAAWlR,EAAEmR,QAC9B,OAGF,OAAO,EACF,CACL,MAAMC,EAAe,EAAAC,SAAWrR,EAAEmR,QAAUnR,EAAEkR,QAC9C,GAAGlR,EAAEiR,WAAa,EAAAI,SAAWrR,EAAEkR,QAAUlR,EAAEmR,SACzC,OAGF,GAAGC,EACD,OAAO,GAKb,OAAO,I,8CC3BM,SAASE,EAAoBtR,GAC1C,OAAO,EAAAoC,kBAAoBpC,aAAauR,YAAcvR,EAAE4B,QAAQ,GAAGkI,QAAU","sources":["webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array;\r\n private id: number;\r\n private manual: boolean;\r\n private log: ReturnType;\r\n private debug: boolean;\r\n private currentHash: string; // have to start with # if not empty\r\n private overriddenHash: string; // have to start with # if not empty\r\n private isPossibleSwipe: boolean;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n this.navigations = [];\r\n this.id = Date.now();\r\n this.manual = false;\r\n this.log = logger('NC');\r\n this.debug = true;\r\n this.currentHash = window.location.hash;\r\n this.overriddenHash = '';\r\n this.isPossibleSwipe = false;\r\n\r\n window.addEventListener('popstate', this.onPopState);\r\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', this.onTouchStart, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private onPopState = (e: PopStateEvent) => {\r\n let hash = window.location.hash;\r\n const id: number = e.state;\r\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\r\n if(hash !== this.currentHash) {\r\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\r\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\r\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\r\n this.overrideHash(this.overriddenHash);\r\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\r\n this.overrideHash();\r\n } else {\r\n this.currentHash = hash;\r\n this.onHashChange && this.onHashChange();\r\n // this.replaceState();\r\n return;\r\n }\r\n }\r\n\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n\r\n if(!this.navigations.length) {\r\n return;\r\n }\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !this.isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n };\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n };\r\n\r\n private onTouchStart = (e: TouchEvent) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n this.isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n this.isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n };\r\n\r\n public overrideHash(hash: string = '') {\r\n if(hash && hash[0] !== '#') hash = '#' + hash;\r\n else if(hash === '#') hash = '';\r\n\r\n this.overriddenHash = this.currentHash = hash;\r\n this.replaceState();\r\n this.pushState();\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n private onItemAdded(item: NavigationItem) {\r\n this.debug && this.log('onItemAdded', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public unshiftItem(item: NavigationItem) {\r\n this.navigations.unshift(item);\r\n this.onItemAdded(item);\r\n }\r\n\r\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\r\n this.navigations.splice(index, length, ...items);\r\n items.forEach((item) => {\r\n this.onItemAdded(item);\r\n });\r\n }\r\n\r\n private pushState() {\r\n this.debug && this.log('push');\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n this.debug && this.log.warn('replace');\r\n\r\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\r\n history.replaceState(this.id, '', url);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppDownloadManager } from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport readBlobAsDataURL from \"../../helpers/blob/readBlobAsDataURL\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then((contents) => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob((blob) => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ripple from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport cancelEvent from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\r\nimport { addFullScreenListener, getFullScreenElement } from \"../../helpers/dom/fullScreen\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport { AppManagers } from \"../../lib/appManagers/managers\";\r\nimport overlayCounter from \"../../helpers/overlayCounter\";\r\nimport Scrollable from \"../scrollable\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: boolean, \r\n overlayClosable: boolean, \r\n withConfirm: LangPackKey | boolean, \r\n body: boolean,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean,\r\n scrollable: boolean,\r\n buttons: Array,\r\n title: boolean | LangPackKey\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): T;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\ntype PopupListeners = {\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n};\r\n\r\nexport default class PopupElement extends EventListenerBase {\r\n private static POPUPS: PopupElement[] = [];\r\n public static MANAGERS: AppManagers;\r\n\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n protected managers: AppManagers;\r\n\r\n protected scrollable: Scrollable;\r\n \r\n protected buttons: Array;\r\n\r\n constructor(className: string, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n\r\n if(options.title) {\r\n this.title.classList.add('popup-title');\r\n if(typeof(options.title) === 'string') {\r\n _i18n(this.title, options.title);\r\n }\r\n \r\n this.header.append(this.title);\r\n }\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n this.managers = PopupElement.MANAGERS;\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n if(options.scrollable) {\r\n const scrollable = this.scrollable = new Scrollable(this.body);\r\n scrollable.onAdditionalScroll = () => {\r\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\r\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\r\n };\r\n\r\n scrollable.container.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\r\n\r\n if(!this.body) {\r\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\r\n }\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n const buttons = this.buttons = options.buttons;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n \r\n const buttonsElements = buttons.map((b) => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find((button) => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n protected onContentUpdate() {\r\n if(this.scrollable) {\r\n this.scrollable.onAdditionalScroll();\r\n }\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: () => this.destroy(),\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n this.onContentUpdate();\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n // if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n if(!this.element.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\r\n return;\r\n }\r\n \r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n // }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n protected destroy() {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n overlayCounter.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n }\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach((popup) => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopups(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\r\n }\r\n\r\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\r\n const popup = new ctor(...args);\r\n return popup;\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find((b) => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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\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","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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"],"names":["appNavigationController","constructor","onPopState","e","hash","window","location","id","state","this","debug","log","isPossibleSwipe","currentHash","warn","overriddenHash","overrideHash","onHashChange","pushState","navigations","length","item","pop","manual","handleItem","onKeyDown","key","onEscape","back","type","onTouchStart","touches","addEventListener","setTimeout","passive","once","Date","now","capture","IS_MOBILE_SAFARI","options","history","scrollRestoration","replaceState","good","onPop","undefined","pushItem","noBlurOnPop","findItemByType","i","index","ret","backByItem","indexOf","splice","onItemAdded","noHistory","push","unshiftItem","unshift","spliceItems","items","forEach","url","origin","pathname","search","removeItem","removeByType","single","PopupAvatar","super","closable","withConfirm","image","Image","cropper","crop","removeHandlers","h6","document","createElement","btnClose","classList","remove","header","append","cropContainer","add","input","style","display","listenerSetter","file","target","files","readBlobAsDataURL","then","contents","src","onload","show","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","draggable","overlayColor","appendChild","parentNode","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","getContext","drawImage","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","open","postCanvas","click","ctx","fillStyle","fillRect","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","element","title","navigationItem","managers","MANAGERS","confirmShortcutIsSendShortcut","prepend","withoutOverlay","overlayClosable","scrollable","onAdditionalScroll","toggle","scrollTop","isScrolledDown","insertBefore","nextSibling","btnConfirmOnEnter","buttons","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","callback","destroy","find","isCancel","POPUPS","onContentUpdate","contains","dispatchEvent","removeAll","cleanup","static","popup","parentElement","popupConstructor","filter","ctor","args","addCancelButton","method","Promise","reader","FileReader","result","readBlobAs","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","bind","split","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","isSendShortcutPressed","IS_MOBILE","isComposing","shiftKey","ctrlKey","metaKey","secondaryKey","IS_APPLE","isSwipingBackSafari","TouchEvent"],"sourceRoot":""} \ No newline at end of file diff --git a/public/774.04c4656f821730d3e97b.chunk.js.map b/public/774.04c4656f821730d3e97b.chunk.js.map deleted file mode 100644 index 52cc99ad0..000000000 --- a/public/774.04c4656f821730d3e97b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"774.04c4656f821730d3e97b.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","state","getState","window","setInterval","_state","hint","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","Promise","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/774.dfdd32ba1b66733e84bc.chunk.js b/public/774.dfdd32ba1b66733e84bc.chunk.js new file mode 100644 index 000000000..65f08c09e --- /dev/null +++ b/public/774.dfdd32ba1b66733e84bc.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[774,836],{4425:(t,e,i)=>{i.d(e,{Z:()=>a});var s=i(2384);class a{constructor(t,e){this.passwordInputField=t,this.size=e,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((t=>(this.animation=t,this.animation.addEventListener("enterFrame",(t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.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(t))))}remove(){this.animation&&this.animation.remove()}}},6830:(t,e,i)=>{i.d(e,{Z:()=>n});var s=i(3910),a=i(503);class n extends a.Z{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{(0,s.Z)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const a=this.toggleVisible=document.createElement("span");a.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(a),a.addEventListener("click",this.onVisibilityClick),a.addEventListener("touchend",this.onVisibilityClick)}}},2614:(t,e,i)=>{function s(t){const e=document.createElement("span");return"string"==typeof t?e.innerHTML=t:e.append(t),e}i.d(e,{Z:()=>s})},1656:(t,e,i)=>{function s(t,e){return e?t.forEach((t=>t.setAttribute("disabled","true"))):t.forEach((t=>t.removeAttribute("disabled"))),()=>s(t,!e)}i.d(e,{Z:()=>s})},2582:(t,e,i)=>{i.d(e,{Z:()=>a});var s=i(2325);class a{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append((0,s.ag)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append((0,s.ag)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(t,e,i)=>{i.r(e),i.d(e,{default:()=>v});var s=i(279),a=i(4755),n=i(4874),r=i(4494),o=i(6830),l=i(4425),d=i(2325),c=i(2582),p=i(3910),h=i(2738),u=i(2614),m=i(5565),b=i(1656),g=i(8115),w=i(3512);let y;const v=new n.Z("page-password",!0,(()=>{const t=new c.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=(0,r.Z)("btn-primary btn-color-primary"),n=new d.ZP.IntlElement({key:"Login.Next"});e.append(n.element);const v=new o.Z({label:"LoginPassword",name:"password"});let L;y=v.input,t.inputWrapper.append(v.container,e);const Z=()=>(L||(L=window.setInterval(Z,1e4)),w.Z.managers.passwordManager.getState().then((t=>{k=t,k.hint?(0,m.Z)(v.label,(0,u.Z)((0,g.Z)(k.hint))):v.setLabel()})));let k;const E=t=>{if(t&&(0,p.Z)(t),!y.value.length)return void y.classList.add("error");const a=(0,b.Z)([y,e],!0),r=y.value;n.update({key:"PleaseWait"});const o=(0,s.y)(e);v.setValueSilently(""+Math.random()),v.setValueSilently(r),w.Z.managers.passwordManager.check(r,k).then((t=>{"auth.authorization"===t._?(clearInterval(L),i.e(781).then(i.bind(i,5436)).then((t=>{t.default.mount()})),f&&f.remove()):(e.removeAttribute("disabled"),n.update({key:t._}),o.remove())})).catch((t=>{a(),v.input.classList.add("error"),t.type,n.update({key:"PASSWORD_HASH_INVALID"}),y.select(),o.remove(),Z()}))};(0,h.fc)(e,E),y.addEventListener("keypress",(function(t){if(this.classList.remove("error"),n.update({key:"Login.Next"}),"Enter"===t.key)return E()}));const V=a.Z.isMobile?100:166,f=new l.Z(v,V);return t.imageDiv.append(f.container),Promise.all([f.load(),Z()])}),null,(()=>{y.focus(),w.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); +//# sourceMappingURL=774.dfdd32ba1b66733e84bc.chunk.js.map \ No newline at end of file diff --git a/public/774.dfdd32ba1b66733e84bc.chunk.js.map b/public/774.dfdd32ba1b66733e84bc.chunk.js.map new file mode 100644 index 000000000..791c8d9a0 --- /dev/null +++ b/public/774.dfdd32ba1b66733e84bc.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"774.dfdd32ba1b66733e84bc.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\nimport PasswordInputField from '../passwordInputField';\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n // return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n // console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport InputField, {InputFieldOptions} from './inputField';\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach((el) => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AccountPassword} from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nconst onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n const getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n const value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n // console.log('passwordManager response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n\r\n switch(err.type) {\r\n default:\r\n // btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n\r\n getState();\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n // if(!isAppleMobile) {\r\n passwordInput.focus();\r\n // }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","toggleDisability","elements","disable","forEach","el","removeAttribute","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","getState","window","setInterval","_state","state","hint","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","catch","err","select","Promise","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/781.a117406973cdcf8db64d.chunk.js.map b/public/781.a117406973cdcf8db64d.chunk.js.map deleted file mode 100644 index 20aeba289..000000000 --- a/public/781.a117406973cdcf8db64d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"781.a117406973cdcf8db64d.chunk.js","mappings":"yKAoDA,MAAMA,EAAO,I,QAAI,GAAK,cAAc,GAxCjB,KACjB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,kFACCR,MAAK,KACNS,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport I18n from \"../lib/langPack\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then((langPack) => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n \r\n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/781.a117406973cdcf8db64d.chunk.js b/public/781.bf470a21924f5738e502.chunk.js similarity index 64% rename from public/781.a117406973cdcf8db64d.chunk.js rename to public/781.bf470a21924f5738e502.chunk.js index cf878e960..58d419003 100644 --- a/public/781.a117406973cdcf8db64d.chunk.js +++ b/public/781.bf470a21924f5738e502.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[781,436],{5436:(e,a,t)=>{t.r(a),t.d(a,{default:()=>l});var n=t(8799),s=t(4541),g=t(2325),h=t(3512);const u=new(t(4874).Z)("page-chats",!1,(()=>(h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),g.ZP.requestedServerLanguage||g.ZP.getCacheLangPack().then((e=>{e.local&&g.ZP.getLangPack(e.lang_code)})),u.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.all([t.e(458),t.e(665),t.e(765),t.e(27),t.e(126)]).then(t.bind(t,2126))]).then((()=>{setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),l=u}}]); -//# sourceMappingURL=781.a117406973cdcf8db64d.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[781,436],{5436:(e,a,t)=>{t.r(a),t.d(a,{default:()=>l});var n=t(8799),s=t(4541),g=t(2325),h=t(3512);const u=new(t(4874).Z)("page-chats",!1,(()=>(h.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignedIn"}),g.ZP.requestedServerLanguage||g.ZP.getCacheLangPack().then((e=>{e.local&&g.ZP.getLangPack(e.lang_code)})),u.pageEl.style.display="",(0,n.Z)(),Promise.all([(0,s.Z)(),Promise.all([t.e(458),t.e(665),t.e(765),t.e(292),t.e(911)]).then(t.bind(t,3911))]).then((()=>{setTimeout((()=>{document.getElementById("auth-pages").remove()}),1e3)}))))),l=u}}]); +//# sourceMappingURL=781.bf470a21924f5738e502.chunk.js.map \ No newline at end of file diff --git a/public/781.bf470a21924f5738e502.chunk.js.map b/public/781.bf470a21924f5738e502.chunk.js.map new file mode 100644 index 000000000..500a7ae16 --- /dev/null +++ b/public/781.bf470a21924f5738e502.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"781.bf470a21924f5738e502.chunk.js","mappings":"yKAYA,MAwCMA,EAAO,I,QAAI,GAAK,cAAc,GAxCf,KACnB,yCAA+C,YAAa,CAACC,EAAG,sBAI5D,8BACF,wBAAwBC,MAAMC,IACzBA,EAASC,OACV,iBAAiBD,EAASE,cAKhCL,EAAKM,OAAOC,MAAMC,QAAU,IAe5B,SAEOC,QAAQC,IAAI,EACjB,SACA,mFACCR,MAAK,KACNS,YAAW,KACTC,SAASC,eAAe,cAAcC,WACrC,WAKP","sources":["webpack://tweb/./src/pages/pageIm.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport loadFonts from '../helpers/dom/loadFonts';\r\nimport I18n from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport Page from './page';\r\n\r\nconst onFirstMount = () => {\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n if(!I18n.requestedServerLanguage) {\r\n I18n.getCacheLangPack().then((langPack) => {\r\n if(langPack.local) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n });\r\n }\r\n\r\n page.pageEl.style.display = '';\r\n\r\n // AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\r\n\r\n /* // @ts-ignore\r\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\r\n alert('AudioContext:' + typeof(AudioContext));\r\n // @ts-ignore\r\n alert('global.navigator:' + typeof(navigator));\r\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\r\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\r\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\r\n\r\n // (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach((el) => ripple(el));\r\n\r\n blurActiveElement();\r\n\r\n return Promise.all([\r\n loadFonts()/* .then(() => new Promise((resolve) => window.requestAnimationFrame(resolve))) */,\r\n import('../lib/appManagers/appDialogsManager')\r\n ]).then(() => {\r\n setTimeout(() => {\r\n document.getElementById('auth-pages').remove();\r\n }, 1e3);\r\n });\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"names":["page","_","then","langPack","local","lang_code","pageEl","style","display","Promise","all","setTimeout","document","getElementById","remove"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.15a67f69d99bd6da42da.chunk.js.map b/public/8.15a67f69d99bd6da42da.chunk.js.map deleted file mode 100644 index 628020efa..000000000 --- a/public/8.15a67f69d99bd6da42da.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"8.15a67f69d99bd6da42da.chunk.js","mappings":"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","sources":["webpack://tweb/./src/countries.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 type { HelpCountriesList } from \"./layer\";\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{\"iso2\":\"AD\",\"default_name\":\"Andorra\",\"country_codes\":[{\"country_code\":\"376\",\"patterns\":[\"XX XX XX\"]}]},{\"iso2\":\"AE\",\"default_name\":\"United Arab Emirates\",\"country_codes\":[{\"country_code\":\"971\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AF\",\"default_name\":\"Afghanistan\",\"country_codes\":[{\"country_code\":\"93\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AG\",\"default_name\":\"Antigua & Barbuda\",\"country_codes\":[{\"country_code\":\"1268\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AI\",\"default_name\":\"Anguilla\",\"country_codes\":[{\"country_code\":\"1264\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AL\",\"default_name\":\"Albania\",\"country_codes\":[{\"country_code\":\"355\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AM\",\"default_name\":\"Armenia\",\"country_codes\":[{\"country_code\":\"374\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"AO\",\"default_name\":\"Angola\",\"country_codes\":[{\"country_code\":\"244\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AR\",\"default_name\":\"Argentina\",\"country_codes\":[{\"country_code\":\"54\"}]},{\"iso2\":\"AS\",\"default_name\":\"American Samoa\",\"country_codes\":[{\"country_code\":\"1684\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AT\",\"default_name\":\"Austria\",\"country_codes\":[{\"country_code\":\"43\",\"patterns\":[\"X XXXXXXXX\"]}]},{\"iso2\":\"AU\",\"default_name\":\"Australia\",\"country_codes\":[{\"country_code\":\"61\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"AW\",\"default_name\":\"Aruba\",\"country_codes\":[{\"country_code\":\"297\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AZ\",\"default_name\":\"Azerbaijan\",\"country_codes\":[{\"country_code\":\"994\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BA\",\"default_name\":\"Bosnia & Herzegovina\",\"country_codes\":[{\"country_code\":\"387\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BB\",\"default_name\":\"Barbados\",\"country_codes\":[{\"country_code\":\"1246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BD\",\"default_name\":\"Bangladesh\",\"country_codes\":[{\"country_code\":\"880\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BE\",\"default_name\":\"Belgium\",\"country_codes\":[{\"country_code\":\"32\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"BF\",\"default_name\":\"Burkina Faso\",\"country_codes\":[{\"country_code\":\"226\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"BG\",\"default_name\":\"Bulgaria\",\"country_codes\":[{\"country_code\":\"359\"}]},{\"iso2\":\"BH\",\"default_name\":\"Bahrain\",\"country_codes\":[{\"country_code\":\"973\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"BI\",\"default_name\":\"Burundi\",\"country_codes\":[{\"country_code\":\"257\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"BJ\",\"default_name\":\"Benin\",\"country_codes\":[{\"country_code\":\"229\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BM\",\"default_name\":\"Bermuda\",\"country_codes\":[{\"country_code\":\"1441\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BN\",\"default_name\":\"Brunei Darussalam\",\"country_codes\":[{\"country_code\":\"673\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BO\",\"default_name\":\"Bolivia\",\"country_codes\":[{\"country_code\":\"591\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"BQ\",\"default_name\":\"Bonaire, Sint Eustatius & Saba\",\"country_codes\":[{\"country_code\":\"599\"}]},{\"iso2\":\"BR\",\"default_name\":\"Brazil\",\"country_codes\":[{\"country_code\":\"55\",\"patterns\":[\"XX XXXXX XXXX\"]}]},{\"iso2\":\"BS\",\"default_name\":\"Bahamas\",\"country_codes\":[{\"country_code\":\"1242\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BT\",\"default_name\":\"Bhutan\",\"country_codes\":[{\"country_code\":\"975\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BW\",\"default_name\":\"Botswana\",\"country_codes\":[{\"country_code\":\"267\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BY\",\"default_name\":\"Belarus\",\"country_codes\":[{\"country_code\":\"375\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BZ\",\"default_name\":\"Belize\",\"country_codes\":[{\"country_code\":\"501\"}]},{\"iso2\":\"CA\",\"default_name\":\"Canada\",\"country_codes\":[{\"country_code\":\"1\",\"prefixes\":[\"403\",\"587\",\"780\",\"825\",\"236\",\"250\",\"604\",\"672\",\"778\",\"204\",\"431\",\"506\",\"709\",\"902\",\"782\",\"226\",\"249\",\"289\",\"343\",\"365\",\"416\",\"437\",\"519\",\"548\",\"613\",\"647\",\"705\",\"807\",\"905\",\"418\",\"438\",\"450\",\"514\",\"579\",\"581\",\"819\",\"873\",\"306\",\"639\",\"867\"],\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CD\",\"default_name\":\"Congo (Dem. Rep.)\",\"country_codes\":[{\"country_code\":\"243\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CF\",\"default_name\":\"Central African Rep.\",\"country_codes\":[{\"country_code\":\"236\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"CG\",\"default_name\":\"Congo (Rep.)\",\"country_codes\":[{\"country_code\":\"242\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CH\",\"default_name\":\"Switzerland\",\"country_codes\":[{\"country_code\":\"41\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CI\",\"default_name\":\"Côte d'Ivoire\",\"country_codes\":[{\"country_code\":\"225\",\"patterns\":[\"XX XX XX XXXX\"]}]},{\"iso2\":\"CK\",\"default_name\":\"Cook Islands\",\"country_codes\":[{\"country_code\":\"682\"}]},{\"iso2\":\"CL\",\"default_name\":\"Chile\",\"country_codes\":[{\"country_code\":\"56\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"CM\",\"default_name\":\"Cameroon\",\"country_codes\":[{\"country_code\":\"237\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CN\",\"default_name\":\"China\",\"country_codes\":[{\"country_code\":\"86\",\"patterns\":[\"XXX XXXX XXXX\"]}]},{\"iso2\":\"CO\",\"default_name\":\"Colombia\",\"country_codes\":[{\"country_code\":\"57\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CR\",\"default_name\":\"Costa Rica\",\"country_codes\":[{\"country_code\":\"506\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CU\",\"default_name\":\"Cuba\",\"country_codes\":[{\"country_code\":\"53\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"CV\",\"default_name\":\"Cape Verde\",\"country_codes\":[{\"country_code\":\"238\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"CW\",\"default_name\":\"Curaçao\",\"country_codes\":[{\"country_code\":\"599\",\"prefixes\":[\"9\"]}]},{\"iso2\":\"CY\",\"default_name\":\"Cyprus\",\"country_codes\":[{\"country_code\":\"357\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CZ\",\"default_name\":\"Czech Republic\",\"country_codes\":[{\"country_code\":\"420\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"DE\",\"default_name\":\"Germany\",\"country_codes\":[{\"country_code\":\"49\",\"patterns\":[\"XXXX XXXXXXX\",\"16X XXXXXXX\",\"17X XXXXXXX\",\"3601 4198XX\"]}]},{\"iso2\":\"DJ\",\"default_name\":\"Djibouti\",\"country_codes\":[{\"country_code\":\"253\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"DK\",\"default_name\":\"Denmark\",\"country_codes\":[{\"country_code\":\"45\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"DM\",\"default_name\":\"Dominica\",\"country_codes\":[{\"country_code\":\"1767\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DO\",\"default_name\":\"Dominican Rep.\",\"country_codes\":[{\"country_code\":\"1809\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1829\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1849\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DZ\",\"default_name\":\"Algeria\",\"country_codes\":[{\"country_code\":\"213\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"EC\",\"default_name\":\"Ecuador\",\"country_codes\":[{\"country_code\":\"593\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"EE\",\"default_name\":\"Estonia\",\"country_codes\":[{\"country_code\":\"372\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"EG\",\"default_name\":\"Egypt\",\"country_codes\":[{\"country_code\":\"20\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"ER\",\"default_name\":\"Eritrea\",\"country_codes\":[{\"country_code\":\"291\",\"patterns\":[\"X XXX XXX\"]}]},{\"iso2\":\"ES\",\"default_name\":\"Spain\",\"country_codes\":[{\"country_code\":\"34\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ET\",\"default_name\":\"Ethiopia\",\"country_codes\":[{\"country_code\":\"251\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"FI\",\"default_name\":\"Finland\",\"country_codes\":[{\"country_code\":\"358\"}]},{\"iso2\":\"FJ\",\"default_name\":\"Fiji\",\"country_codes\":[{\"country_code\":\"679\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"FK\",\"default_name\":\"Falkland Islands\",\"country_codes\":[{\"country_code\":\"500\"}]},{\"iso2\":\"FM\",\"default_name\":\"Micronesia\",\"country_codes\":[{\"country_code\":\"691\"}]},{\"iso2\":\"FO\",\"default_name\":\"Faroe Islands\",\"country_codes\":[{\"country_code\":\"298\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"FR\",\"default_name\":\"France\",\"country_codes\":[{\"country_code\":\"33\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"GA\",\"default_name\":\"Gabon\",\"country_codes\":[{\"country_code\":\"241\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"GB\",\"default_name\":\"United Kingdom\",\"country_codes\":[{\"country_code\":\"44\",\"patterns\":[\"XXXX XXXXXX\"]}]},{\"iso2\":\"GD\",\"default_name\":\"Grenada\",\"country_codes\":[{\"country_code\":\"1473\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GE\",\"default_name\":\"Georgia\",\"country_codes\":[{\"country_code\":\"995\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GF\",\"default_name\":\"French Guiana\",\"country_codes\":[{\"country_code\":\"594\"}]},{\"iso2\":\"GH\",\"default_name\":\"Ghana\",\"country_codes\":[{\"country_code\":\"233\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"GI\",\"default_name\":\"Gibraltar\",\"country_codes\":[{\"country_code\":\"350\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"GL\",\"default_name\":\"Greenland\",\"country_codes\":[{\"country_code\":\"299\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"GM\",\"default_name\":\"Gambia\",\"country_codes\":[{\"country_code\":\"220\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GN\",\"default_name\":\"Guinea\",\"country_codes\":[{\"country_code\":\"224\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GP\",\"default_name\":\"Guadeloupe\",\"country_codes\":[{\"country_code\":\"590\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"GQ\",\"default_name\":\"Equatorial Guinea\",\"country_codes\":[{\"country_code\":\"240\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GR\",\"default_name\":\"Greece\",\"country_codes\":[{\"country_code\":\"30\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"GT\",\"default_name\":\"Guatemala\",\"country_codes\":[{\"country_code\":\"502\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"GU\",\"default_name\":\"Guam\",\"country_codes\":[{\"country_code\":\"1671\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GW\",\"default_name\":\"Guinea-Bissau\",\"country_codes\":[{\"country_code\":\"245\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GY\",\"default_name\":\"Guyana\",\"country_codes\":[{\"country_code\":\"592\"}]},{\"iso2\":\"HK\",\"default_name\":\"Hong Kong\",\"country_codes\":[{\"country_code\":\"852\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"HN\",\"default_name\":\"Honduras\",\"country_codes\":[{\"country_code\":\"504\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HR\",\"default_name\":\"Croatia\",\"country_codes\":[{\"country_code\":\"385\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"HT\",\"default_name\":\"Haiti\",\"country_codes\":[{\"country_code\":\"509\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HU\",\"default_name\":\"Hungary\",\"country_codes\":[{\"country_code\":\"36\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ID\",\"default_name\":\"Indonesia\",\"country_codes\":[{\"country_code\":\"62\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"IE\",\"default_name\":\"Ireland\",\"country_codes\":[{\"country_code\":\"353\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IL\",\"default_name\":\"Israel\",\"country_codes\":[{\"country_code\":\"972\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IN\",\"default_name\":\"India\",\"country_codes\":[{\"country_code\":\"91\",\"patterns\":[\"XXXXX XXXXX\"]}]},{\"iso2\":\"IO\",\"default_name\":\"Diego Garcia\",\"country_codes\":[{\"country_code\":\"246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IQ\",\"default_name\":\"Iraq\",\"country_codes\":[{\"country_code\":\"964\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IR\",\"default_name\":\"Iran\",\"country_codes\":[{\"country_code\":\"98\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IS\",\"default_name\":\"Iceland\",\"country_codes\":[{\"country_code\":\"354\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IT\",\"default_name\":\"Italy\",\"country_codes\":[{\"country_code\":\"39\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"JM\",\"default_name\":\"Jamaica\",\"country_codes\":[{\"country_code\":\"1876\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"JO\",\"default_name\":\"Jordan\",\"country_codes\":[{\"country_code\":\"962\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"JP\",\"default_name\":\"Japan\",\"country_codes\":[{\"country_code\":\"81\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"KE\",\"default_name\":\"Kenya\",\"country_codes\":[{\"country_code\":\"254\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"KG\",\"default_name\":\"Kyrgyzstan\",\"country_codes\":[{\"country_code\":\"996\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"KH\",\"default_name\":\"Cambodia\",\"country_codes\":[{\"country_code\":\"855\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"KI\",\"default_name\":\"Kiribati\",\"country_codes\":[{\"country_code\":\"686\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KM\",\"default_name\":\"Comoros\",\"country_codes\":[{\"country_code\":\"269\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KN\",\"default_name\":\"Saint Kitts & Nevis\",\"country_codes\":[{\"country_code\":\"1869\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KP\",\"default_name\":\"North Korea\",\"country_codes\":[{\"country_code\":\"850\"}]},{\"iso2\":\"KR\",\"default_name\":\"South Korea\",\"country_codes\":[{\"country_code\":\"82\",\"patterns\":[\"XX XXXX XXX\"]}]},{\"iso2\":\"KW\",\"default_name\":\"Kuwait\",\"country_codes\":[{\"country_code\":\"965\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KY\",\"default_name\":\"Cayman Islands\",\"country_codes\":[{\"country_code\":\"1345\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KZ\",\"default_name\":\"Kazakhstan\",\"country_codes\":[{\"country_code\":\"7\",\"prefixes\":[\"6\",\"7\"],\"patterns\":[\"XXX XXX XX XX\"]}]},{\"iso2\":\"LA\",\"default_name\":\"Laos\",\"country_codes\":[{\"country_code\":\"856\",\"patterns\":[\"XX XX XXX XXX\"]}]},{\"iso2\":\"LB\",\"default_name\":\"Lebanon\",\"country_codes\":[{\"country_code\":\"961\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LC\",\"default_name\":\"Saint Lucia\",\"country_codes\":[{\"country_code\":\"1758\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LI\",\"default_name\":\"Liechtenstein\",\"country_codes\":[{\"country_code\":\"423\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LK\",\"default_name\":\"Sri Lanka\",\"country_codes\":[{\"country_code\":\"94\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LR\",\"default_name\":\"Liberia\",\"country_codes\":[{\"country_code\":\"231\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LS\",\"default_name\":\"Lesotho\",\"country_codes\":[{\"country_code\":\"266\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LT\",\"default_name\":\"Lithuania\",\"country_codes\":[{\"country_code\":\"370\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LU\",\"default_name\":\"Luxembourg\",\"country_codes\":[{\"country_code\":\"352\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"LV\",\"default_name\":\"Latvia\",\"country_codes\":[{\"country_code\":\"371\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LY\",\"default_name\":\"Libya\",\"country_codes\":[{\"country_code\":\"218\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MA\",\"default_name\":\"Morocco\",\"country_codes\":[{\"country_code\":\"212\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MC\",\"default_name\":\"Monaco\",\"country_codes\":[{\"country_code\":\"377\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MD\",\"default_name\":\"Moldova\",\"country_codes\":[{\"country_code\":\"373\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ME\",\"default_name\":\"Montenegro\",\"country_codes\":[{\"country_code\":\"382\"}]},{\"iso2\":\"MG\",\"default_name\":\"Madagascar\",\"country_codes\":[{\"country_code\":\"261\",\"patterns\":[\"XX XX XXX XX\"]}]},{\"iso2\":\"MH\",\"default_name\":\"Marshall Islands\",\"country_codes\":[{\"country_code\":\"692\"}]},{\"iso2\":\"MK\",\"default_name\":\"North Macedonia\",\"country_codes\":[{\"country_code\":\"389\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ML\",\"default_name\":\"Mali\",\"country_codes\":[{\"country_code\":\"223\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MM\",\"default_name\":\"Myanmar\",\"country_codes\":[{\"country_code\":\"95\"}]},{\"iso2\":\"MN\",\"default_name\":\"Mongolia\",\"country_codes\":[{\"country_code\":\"976\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"MO\",\"default_name\":\"Macau\",\"country_codes\":[{\"country_code\":\"853\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MP\",\"default_name\":\"Northern Mariana Islands\",\"country_codes\":[{\"country_code\":\"1670\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MQ\",\"default_name\":\"Martinique\",\"country_codes\":[{\"country_code\":\"596\"}]},{\"iso2\":\"MR\",\"default_name\":\"Mauritania\",\"country_codes\":[{\"country_code\":\"222\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MS\",\"default_name\":\"Montserrat\",\"country_codes\":[{\"country_code\":\"1664\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MT\",\"default_name\":\"Malta\",\"country_codes\":[{\"country_code\":\"356\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"MU\",\"default_name\":\"Mauritius\",\"country_codes\":[{\"country_code\":\"230\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MV\",\"default_name\":\"Maldives\",\"country_codes\":[{\"country_code\":\"960\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MW\",\"default_name\":\"Malawi\",\"country_codes\":[{\"country_code\":\"265\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MX\",\"default_name\":\"Mexico\",\"country_codes\":[{\"country_code\":\"52\"}]},{\"iso2\":\"MY\",\"default_name\":\"Malaysia\",\"country_codes\":[{\"country_code\":\"60\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"MZ\",\"default_name\":\"Mozambique\",\"country_codes\":[{\"country_code\":\"258\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NA\",\"default_name\":\"Namibia\",\"country_codes\":[{\"country_code\":\"264\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NC\",\"default_name\":\"New Caledonia\",\"country_codes\":[{\"country_code\":\"687\"}]},{\"iso2\":\"NE\",\"default_name\":\"Niger\",\"country_codes\":[{\"country_code\":\"227\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"NF\",\"default_name\":\"Norfolk Island\",\"country_codes\":[{\"country_code\":\"672\"}]},{\"iso2\":\"NG\",\"default_name\":\"Nigeria\",\"country_codes\":[{\"country_code\":\"234\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NI\",\"default_name\":\"Nicaragua\",\"country_codes\":[{\"country_code\":\"505\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NL\",\"default_name\":\"Netherlands\",\"country_codes\":[{\"country_code\":\"31\",\"patterns\":[\"X XX XX XX XX\",\"97 XXXX XXXXX\"]}]},{\"iso2\":\"NO\",\"default_name\":\"Norway\",\"country_codes\":[{\"country_code\":\"47\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NP\",\"default_name\":\"Nepal\",\"country_codes\":[{\"country_code\":\"977\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NR\",\"default_name\":\"Nauru\",\"country_codes\":[{\"country_code\":\"674\"}]},{\"iso2\":\"NU\",\"default_name\":\"Niue\",\"country_codes\":[{\"country_code\":\"683\"}]},{\"iso2\":\"NZ\",\"default_name\":\"New Zealand\",\"country_codes\":[{\"country_code\":\"64\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"OM\",\"default_name\":\"Oman\",\"country_codes\":[{\"country_code\":\"968\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PA\",\"default_name\":\"Panama\",\"country_codes\":[{\"country_code\":\"507\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PE\",\"default_name\":\"Peru\",\"country_codes\":[{\"country_code\":\"51\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PF\",\"default_name\":\"French Polynesia\",\"country_codes\":[{\"country_code\":\"689\"}]},{\"iso2\":\"PG\",\"default_name\":\"Papua New Guinea\",\"country_codes\":[{\"country_code\":\"675\"}]},{\"iso2\":\"PH\",\"default_name\":\"Philippines\",\"country_codes\":[{\"country_code\":\"63\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PK\",\"default_name\":\"Pakistan\",\"country_codes\":[{\"country_code\":\"92\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PL\",\"default_name\":\"Poland\",\"country_codes\":[{\"country_code\":\"48\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PM\",\"default_name\":\"Saint Pierre & Miquelon\",\"country_codes\":[{\"country_code\":\"508\"}]},{\"iso2\":\"PR\",\"default_name\":\"Puerto Rico\",\"country_codes\":[{\"country_code\":\"1787\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1939\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"PS\",\"default_name\":\"Palestine\",\"country_codes\":[{\"country_code\":\"970\",\"patterns\":[\"XXX XX XXXX\"]}]},{\"iso2\":\"PT\",\"default_name\":\"Portugal\",\"country_codes\":[{\"country_code\":\"351\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PW\",\"default_name\":\"Palau\",\"country_codes\":[{\"country_code\":\"680\"}]},{\"iso2\":\"PY\",\"default_name\":\"Paraguay\",\"country_codes\":[{\"country_code\":\"595\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"QA\",\"default_name\":\"Qatar\",\"country_codes\":[{\"country_code\":\"974\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RE\",\"default_name\":\"Réunion\",\"country_codes\":[{\"country_code\":\"262\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RO\",\"default_name\":\"Romania\",\"country_codes\":[{\"country_code\":\"40\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RS\",\"default_name\":\"Serbia\",\"country_codes\":[{\"country_code\":\"381\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"RU\",\"default_name\":\"Russian Federation\",\"country_codes\":[{\"country_code\":\"7\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"RW\",\"default_name\":\"Rwanda\",\"country_codes\":[{\"country_code\":\"250\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SA\",\"default_name\":\"Saudi Arabia\",\"country_codes\":[{\"country_code\":\"966\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SB\",\"default_name\":\"Solomon Islands\",\"country_codes\":[{\"country_code\":\"677\"}]},{\"iso2\":\"SC\",\"default_name\":\"Seychelles\",\"country_codes\":[{\"country_code\":\"248\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"SD\",\"default_name\":\"Sudan\",\"country_codes\":[{\"country_code\":\"249\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SE\",\"default_name\":\"Sweden\",\"country_codes\":[{\"country_code\":\"46\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SG\",\"default_name\":\"Singapore\",\"country_codes\":[{\"country_code\":\"65\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SH\",\"default_name\":\"Saint Helena\",\"country_codes\":[{\"country_code\":\"247\"},{\"country_code\":\"290\",\"patterns\":[\"XX XXX\"]}]},{\"iso2\":\"SI\",\"default_name\":\"Slovenia\",\"country_codes\":[{\"country_code\":\"386\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SK\",\"default_name\":\"Slovakia\",\"country_codes\":[{\"country_code\":\"421\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SL\",\"default_name\":\"Sierra Leone\",\"country_codes\":[{\"country_code\":\"232\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SM\",\"default_name\":\"San Marino\",\"country_codes\":[{\"country_code\":\"378\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"SN\",\"default_name\":\"Senegal\",\"country_codes\":[{\"country_code\":\"221\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SO\",\"default_name\":\"Somalia\",\"country_codes\":[{\"country_code\":\"252\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SR\",\"default_name\":\"Suriname\",\"country_codes\":[{\"country_code\":\"597\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SS\",\"default_name\":\"South Sudan\",\"country_codes\":[{\"country_code\":\"211\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ST\",\"default_name\":\"São Tomé & Príncipe\",\"country_codes\":[{\"country_code\":\"239\",\"patterns\":[\"XX XXXXX\"]}]},{\"iso2\":\"SV\",\"default_name\":\"El Salvador\",\"country_codes\":[{\"country_code\":\"503\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SX\",\"default_name\":\"Sint Maarten\",\"country_codes\":[{\"country_code\":\"1721\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SY\",\"default_name\":\"Syria\",\"country_codes\":[{\"country_code\":\"963\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SZ\",\"default_name\":\"Eswatini\",\"country_codes\":[{\"country_code\":\"268\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"TC\",\"default_name\":\"Turks & Caicos Islands\",\"country_codes\":[{\"country_code\":\"1649\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TD\",\"default_name\":\"Chad\",\"country_codes\":[{\"country_code\":\"235\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"TG\",\"default_name\":\"Togo\",\"country_codes\":[{\"country_code\":\"228\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TH\",\"default_name\":\"Thailand\",\"country_codes\":[{\"country_code\":\"66\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"TJ\",\"default_name\":\"Tajikistan\",\"country_codes\":[{\"country_code\":\"992\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"TK\",\"default_name\":\"Tokelau\",\"country_codes\":[{\"country_code\":\"690\"}]},{\"iso2\":\"TL\",\"default_name\":\"Timor-Leste\",\"country_codes\":[{\"country_code\":\"670\"}]},{\"iso2\":\"TM\",\"default_name\":\"Turkmenistan\",\"country_codes\":[{\"country_code\":\"993\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"TN\",\"default_name\":\"Tunisia\",\"country_codes\":[{\"country_code\":\"216\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TO\",\"default_name\":\"Tonga\",\"country_codes\":[{\"country_code\":\"676\"}]},{\"iso2\":\"TR\",\"default_name\":\"Turkey\",\"country_codes\":[{\"country_code\":\"90\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"TT\",\"default_name\":\"Trinidad & Tobago\",\"country_codes\":[{\"country_code\":\"1868\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TV\",\"default_name\":\"Tuvalu\",\"country_codes\":[{\"country_code\":\"688\"}]},{\"iso2\":\"TW\",\"default_name\":\"Taiwan\",\"country_codes\":[{\"country_code\":\"886\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"TZ\",\"default_name\":\"Tanzania\",\"country_codes\":[{\"country_code\":\"255\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"UA\",\"default_name\":\"Ukraine\",\"country_codes\":[{\"country_code\":\"380\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"UG\",\"default_name\":\"Uganda\",\"country_codes\":[{\"country_code\":\"256\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"US\",\"default_name\":\"USA\",\"country_codes\":[{\"country_code\":\"1\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"UY\",\"default_name\":\"Uruguay\",\"country_codes\":[{\"country_code\":\"598\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"UZ\",\"default_name\":\"Uzbekistan\",\"country_codes\":[{\"country_code\":\"998\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"VC\",\"default_name\":\"Saint Vincent & the Grenadines\",\"country_codes\":[{\"country_code\":\"1784\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VE\",\"default_name\":\"Venezuela\",\"country_codes\":[{\"country_code\":\"58\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"VG\",\"default_name\":\"British Virgin Islands\",\"country_codes\":[{\"country_code\":\"1284\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VI\",\"default_name\":\"US Virgin Islands\",\"country_codes\":[{\"country_code\":\"1340\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VN\",\"default_name\":\"Vietnam\",\"country_codes\":[{\"country_code\":\"84\"}]},{\"iso2\":\"VU\",\"default_name\":\"Vanuatu\",\"country_codes\":[{\"country_code\":\"678\"}]},{\"iso2\":\"WF\",\"default_name\":\"Wallis & Futuna\",\"country_codes\":[{\"country_code\":\"681\"}]},{\"iso2\":\"WS\",\"default_name\":\"Samoa\",\"country_codes\":[{\"country_code\":\"685\"}]},{\"iso2\":\"XK\",\"default_name\":\"Kosovo\",\"country_codes\":[{\"country_code\":\"383\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"YE\",\"default_name\":\"Yemen\",\"country_codes\":[{\"country_code\":\"967\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ZA\",\"default_name\":\"South Africa\",\"country_codes\":[{\"country_code\":\"27\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZM\",\"default_name\":\"Zambia\",\"country_codes\":[{\"country_code\":\"260\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZW\",\"default_name\":\"Zimbabwe\",\"country_codes\":[{\"country_code\":\"263\",\"patterns\":[\"XX XXX XXXX\"]}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find((c) => c.name === 'United States'),\n '44': Countries.find((c) => c.name === 'United Kingdom'),\n '61': Countries.find((c) => c.name === 'Australia'),\n '64': Countries.find((c) => c.name === 'New Zealand'),\n '246': Countries.find((c) => c.name === 'Diego Garcia'),\n '255': Countries.find((c) => c.name === 'Tanzania'),\n '262': Countries.find((c) => c.name === 'Reunion'),\n '500': Countries.find((c) => c.name === 'Falkland Islands'),\n '590': Countries.find((c) => c.name === 'Guadeloupe'),\n '672': Countries.find((c) => c.name === 'Norfolk Island'),\n '1 268': Countries.find((c) => c.name === 'Antigua & Barbuda'),\n}; */\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"names":["_","countries","hash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.15a67f69d99bd6da42da.chunk.js b/public/8.2f5d5f4973ca9d0d4616.chunk.js similarity index 99% rename from public/8.15a67f69d99bd6da42da.chunk.js rename to public/8.2f5d5f4973ca9d0d4616.chunk.js index 55cb19bec..8d24da103 100644 --- a/public/8.15a67f69d99bd6da42da.chunk.js +++ b/public/8.2f5d5f4973ca9d0d4616.chunk.js @@ -1,2 +1,2 @@ "use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[8],{9179:(X,e,o)=>{o.r(e),o.d(e,{default:()=>t});const t={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["X XXXXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:"Côte d'Ivoire",country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592"}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{country_code:"961",patterns:["XX XXX XXX"]}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXX XXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{country_code:"60",patterns:["XX XXXX XXXX"]}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX","97 XXXX XXXXX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXXX XXXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{country_code:"378",patterns:["XXX XXX XXXX"]}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{country_code:"685"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:0}}}]); -//# sourceMappingURL=8.15a67f69d99bd6da42da.chunk.js.map \ No newline at end of file +//# sourceMappingURL=8.2f5d5f4973ca9d0d4616.chunk.js.map \ No newline at end of file diff --git a/public/8.2f5d5f4973ca9d0d4616.chunk.js.map b/public/8.2f5d5f4973ca9d0d4616.chunk.js.map new file mode 100644 index 000000000..dcfdd4d0b --- /dev/null +++ b/public/8.2f5d5f4973ca9d0d4616.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"8.2f5d5f4973ca9d0d4616.chunk.js","mappings":"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","sources":["webpack://tweb/./src/countries.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 type {HelpCountriesList} from './layer';\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{'iso2':'AD', 'default_name':'Andorra', 'country_codes':[{'country_code':'376', 'patterns':['XX XX XX']}]}, {'iso2':'AE', 'default_name':'United Arab Emirates', 'country_codes':[{'country_code':'971', 'patterns':['XX XXX XXXX']}]}, {'iso2':'AF', 'default_name':'Afghanistan', 'country_codes':[{'country_code':'93', 'patterns':['XXX XXX XXX']}]}, {'iso2':'AG', 'default_name':'Antigua & Barbuda', 'country_codes':[{'country_code':'1268', 'patterns':['XXX XXXX']}]}, {'iso2':'AI', 'default_name':'Anguilla', 'country_codes':[{'country_code':'1264', 'patterns':['XXX XXXX']}]}, {'iso2':'AL', 'default_name':'Albania', 'country_codes':[{'country_code':'355', 'patterns':['XX XXX XXXX']}]}, {'iso2':'AM', 'default_name':'Armenia', 'country_codes':[{'country_code':'374', 'patterns':['XX XXX XXX']}]}, {'iso2':'AO', 'default_name':'Angola', 'country_codes':[{'country_code':'244', 'patterns':['XXX XXX XXX']}]}, {'iso2':'AR', 'default_name':'Argentina', 'country_codes':[{'country_code':'54'}]}, {'iso2':'AS', 'default_name':'American Samoa', 'country_codes':[{'country_code':'1684', 'patterns':['XXX XXXX']}]}, {'iso2':'AT', 'default_name':'Austria', 'country_codes':[{'country_code':'43', 'patterns':['X XXXXXXXX']}]}, {'iso2':'AU', 'default_name':'Australia', 'country_codes':[{'country_code':'61', 'patterns':['X XXXX XXXX']}]}, {'iso2':'AW', 'default_name':'Aruba', 'country_codes':[{'country_code':'297', 'patterns':['XXX XXXX']}]}, {'iso2':'AZ', 'default_name':'Azerbaijan', 'country_codes':[{'country_code':'994', 'patterns':['XX XXX XXXX']}]}, {'iso2':'BA', 'default_name':'Bosnia & Herzegovina', 'country_codes':[{'country_code':'387', 'patterns':['XX XXX XXX']}]}, {'iso2':'BB', 'default_name':'Barbados', 'country_codes':[{'country_code':'1246', 'patterns':['XXX XXXX']}]}, {'iso2':'BD', 'default_name':'Bangladesh', 'country_codes':[{'country_code':'880', 'patterns':['XX XXX XXX']}]}, {'iso2':'BE', 'default_name':'Belgium', 'country_codes':[{'country_code':'32', 'patterns':['XXX XX XX XX']}]}, {'iso2':'BF', 'default_name':'Burkina Faso', 'country_codes':[{'country_code':'226', 'patterns':['XX XX XX XX']}]}, {'iso2':'BG', 'default_name':'Bulgaria', 'country_codes':[{'country_code':'359'}]}, {'iso2':'BH', 'default_name':'Bahrain', 'country_codes':[{'country_code':'973', 'patterns':['XXXX XXXX']}]}, {'iso2':'BI', 'default_name':'Burundi', 'country_codes':[{'country_code':'257', 'patterns':['XX XX XXXX']}]}, {'iso2':'BJ', 'default_name':'Benin', 'country_codes':[{'country_code':'229', 'patterns':['XX XXX XXX']}]}, {'iso2':'BM', 'default_name':'Bermuda', 'country_codes':[{'country_code':'1441', 'patterns':['XXX XXXX']}]}, {'iso2':'BN', 'default_name':'Brunei Darussalam', 'country_codes':[{'country_code':'673', 'patterns':['XXX XXXX']}]}, {'iso2':'BO', 'default_name':'Bolivia', 'country_codes':[{'country_code':'591', 'patterns':['X XXX XXXX']}]}, {'iso2':'BQ', 'default_name':'Bonaire, Sint Eustatius & Saba', 'country_codes':[{'country_code':'599'}]}, {'iso2':'BR', 'default_name':'Brazil', 'country_codes':[{'country_code':'55', 'patterns':['XX XXXXX XXXX']}]}, {'iso2':'BS', 'default_name':'Bahamas', 'country_codes':[{'country_code':'1242', 'patterns':['XXX XXXX']}]}, {'iso2':'BT', 'default_name':'Bhutan', 'country_codes':[{'country_code':'975', 'patterns':['XX XXX XXX']}]}, {'iso2':'BW', 'default_name':'Botswana', 'country_codes':[{'country_code':'267', 'patterns':['XX XXX XXX']}]}, {'iso2':'BY', 'default_name':'Belarus', 'country_codes':[{'country_code':'375', 'patterns':['XX XXX XXXX']}]}, {'iso2':'BZ', 'default_name':'Belize', 'country_codes':[{'country_code':'501'}]}, {'iso2':'CA', 'default_name':'Canada', 'country_codes':[{'country_code':'1', 'prefixes':['403', '587', '780', '825', '236', '250', '604', '672', '778', '204', '431', '506', '709', '902', '782', '226', '249', '289', '343', '365', '416', '437', '519', '548', '613', '647', '705', '807', '905', '418', '438', '450', '514', '579', '581', '819', '873', '306', '639', '867'], 'patterns':['XXX XXX XXXX']}]}, {'iso2':'CD', 'default_name':'Congo (Dem. Rep.)', 'country_codes':[{'country_code':'243', 'patterns':['XX XXX XXXX']}]}, {'iso2':'CF', 'default_name':'Central African Rep.', 'country_codes':[{'country_code':'236', 'patterns':['XX XX XX XX']}]}, {'iso2':'CG', 'default_name':'Congo (Rep.)', 'country_codes':[{'country_code':'242', 'patterns':['XX XXX XXXX']}]}, {'iso2':'CH', 'default_name':'Switzerland', 'country_codes':[{'country_code':'41', 'patterns':['XX XXX XXXX']}]}, {'iso2':'CI', 'default_name':'Côte d\\'Ivoire', 'country_codes':[{'country_code':'225', 'patterns':['XX XX XX XXXX']}]}, {'iso2':'CK', 'default_name':'Cook Islands', 'country_codes':[{'country_code':'682'}]}, {'iso2':'CL', 'default_name':'Chile', 'country_codes':[{'country_code':'56', 'patterns':['X XXXX XXXX']}]}, {'iso2':'CM', 'default_name':'Cameroon', 'country_codes':[{'country_code':'237', 'patterns':['XXXX XXXX']}]}, {'iso2':'CN', 'default_name':'China', 'country_codes':[{'country_code':'86', 'patterns':['XXX XXXX XXXX']}]}, {'iso2':'CO', 'default_name':'Colombia', 'country_codes':[{'country_code':'57', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'CR', 'default_name':'Costa Rica', 'country_codes':[{'country_code':'506', 'patterns':['XXXX XXXX']}]}, {'iso2':'CU', 'default_name':'Cuba', 'country_codes':[{'country_code':'53', 'patterns':['X XXX XXXX']}]}, {'iso2':'CV', 'default_name':'Cape Verde', 'country_codes':[{'country_code':'238', 'patterns':['XXX XXXX']}]}, {'iso2':'CW', 'default_name':'Curaçao', 'country_codes':[{'country_code':'599', 'prefixes':['9']}]}, {'iso2':'CY', 'default_name':'Cyprus', 'country_codes':[{'country_code':'357', 'patterns':['XXXX XXXX']}]}, {'iso2':'CZ', 'default_name':'Czech Republic', 'country_codes':[{'country_code':'420', 'patterns':['XXX XXX XXX']}]}, {'iso2':'DE', 'default_name':'Germany', 'country_codes':[{'country_code':'49', 'patterns':['XXXX XXXXXXX', '16X XXXXXXX', '17X XXXXXXX', '3601 4198XX']}]}, {'iso2':'DJ', 'default_name':'Djibouti', 'country_codes':[{'country_code':'253', 'patterns':['XX XX XX XX']}]}, {'iso2':'DK', 'default_name':'Denmark', 'country_codes':[{'country_code':'45', 'patterns':['XXXX XXXX']}]}, {'iso2':'DM', 'default_name':'Dominica', 'country_codes':[{'country_code':'1767', 'patterns':['XXX XXXX']}]}, {'iso2':'DO', 'default_name':'Dominican Rep.', 'country_codes':[{'country_code':'1809', 'patterns':['XXX XXXX']}, {'country_code':'1829', 'patterns':['XXX XXXX']}, {'country_code':'1849', 'patterns':['XXX XXXX']}]}, {'iso2':'DZ', 'default_name':'Algeria', 'country_codes':[{'country_code':'213', 'patterns':['XXX XX XX XX']}]}, {'iso2':'EC', 'default_name':'Ecuador', 'country_codes':[{'country_code':'593', 'patterns':['XX XXX XXXX']}]}, {'iso2':'EE', 'default_name':'Estonia', 'country_codes':[{'country_code':'372', 'patterns':['XXXX XXXX']}]}, {'iso2':'EG', 'default_name':'Egypt', 'country_codes':[{'country_code':'20', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'ER', 'default_name':'Eritrea', 'country_codes':[{'country_code':'291', 'patterns':['X XXX XXX']}]}, {'iso2':'ES', 'default_name':'Spain', 'country_codes':[{'country_code':'34', 'patterns':['XXX XXX XXX']}]}, {'iso2':'ET', 'default_name':'Ethiopia', 'country_codes':[{'country_code':'251', 'patterns':['XX XXX XXXX']}]}, {'iso2':'FI', 'default_name':'Finland', 'country_codes':[{'country_code':'358'}]}, {'iso2':'FJ', 'default_name':'Fiji', 'country_codes':[{'country_code':'679', 'patterns':['XXX XXXX']}]}, {'iso2':'FK', 'default_name':'Falkland Islands', 'country_codes':[{'country_code':'500'}]}, {'iso2':'FM', 'default_name':'Micronesia', 'country_codes':[{'country_code':'691'}]}, {'iso2':'FO', 'default_name':'Faroe Islands', 'country_codes':[{'country_code':'298', 'patterns':['XXX XXX']}]}, {'iso2':'FR', 'default_name':'France', 'country_codes':[{'country_code':'33', 'patterns':['X XX XX XX XX']}]}, {'iso2':'GA', 'default_name':'Gabon', 'country_codes':[{'country_code':'241', 'patterns':['X XX XX XX']}]}, {'iso2':'GB', 'default_name':'United Kingdom', 'country_codes':[{'country_code':'44', 'patterns':['XXXX XXXXXX']}]}, {'iso2':'GD', 'default_name':'Grenada', 'country_codes':[{'country_code':'1473', 'patterns':['XXX XXXX']}]}, {'iso2':'GE', 'default_name':'Georgia', 'country_codes':[{'country_code':'995', 'patterns':['XXX XXX XXX']}]}, {'iso2':'GF', 'default_name':'French Guiana', 'country_codes':[{'country_code':'594'}]}, {'iso2':'GH', 'default_name':'Ghana', 'country_codes':[{'country_code':'233', 'patterns':['XX XXX XXXX']}]}, {'iso2':'GI', 'default_name':'Gibraltar', 'country_codes':[{'country_code':'350', 'patterns':['XXXX XXXX']}]}, {'iso2':'GL', 'default_name':'Greenland', 'country_codes':[{'country_code':'299', 'patterns':['XXX XXX']}]}, {'iso2':'GM', 'default_name':'Gambia', 'country_codes':[{'country_code':'220', 'patterns':['XXX XXXX']}]}, {'iso2':'GN', 'default_name':'Guinea', 'country_codes':[{'country_code':'224', 'patterns':['XXX XXX XXX']}]}, {'iso2':'GP', 'default_name':'Guadeloupe', 'country_codes':[{'country_code':'590', 'patterns':['XXX XX XX XX']}]}, {'iso2':'GQ', 'default_name':'Equatorial Guinea', 'country_codes':[{'country_code':'240', 'patterns':['XXX XXX XXX']}]}, {'iso2':'GR', 'default_name':'Greece', 'country_codes':[{'country_code':'30', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'GT', 'default_name':'Guatemala', 'country_codes':[{'country_code':'502', 'patterns':['X XXX XXXX']}]}, {'iso2':'GU', 'default_name':'Guam', 'country_codes':[{'country_code':'1671', 'patterns':['XXX XXXX']}]}, {'iso2':'GW', 'default_name':'Guinea-Bissau', 'country_codes':[{'country_code':'245', 'patterns':['XXX XXXX']}]}, {'iso2':'GY', 'default_name':'Guyana', 'country_codes':[{'country_code':'592'}]}, {'iso2':'HK', 'default_name':'Hong Kong', 'country_codes':[{'country_code':'852', 'patterns':['X XXX XXXX']}]}, {'iso2':'HN', 'default_name':'Honduras', 'country_codes':[{'country_code':'504', 'patterns':['XXXX XXXX']}]}, {'iso2':'HR', 'default_name':'Croatia', 'country_codes':[{'country_code':'385', 'patterns':['XX XXX XXX']}]}, {'iso2':'HT', 'default_name':'Haiti', 'country_codes':[{'country_code':'509', 'patterns':['XXXX XXXX']}]}, {'iso2':'HU', 'default_name':'Hungary', 'country_codes':[{'country_code':'36', 'patterns':['XXX XXX XXX']}]}, {'iso2':'ID', 'default_name':'Indonesia', 'country_codes':[{'country_code':'62', 'patterns':['XXX XXXXXX']}]}, {'iso2':'IE', 'default_name':'Ireland', 'country_codes':[{'country_code':'353', 'patterns':['XX XXX XXXX']}]}, {'iso2':'IL', 'default_name':'Israel', 'country_codes':[{'country_code':'972', 'patterns':['XX XXX XXXX']}]}, {'iso2':'IN', 'default_name':'India', 'country_codes':[{'country_code':'91', 'patterns':['XXXXX XXXXX']}]}, {'iso2':'IO', 'default_name':'Diego Garcia', 'country_codes':[{'country_code':'246', 'patterns':['XXX XXXX']}]}, {'iso2':'IQ', 'default_name':'Iraq', 'country_codes':[{'country_code':'964', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'IR', 'default_name':'Iran', 'country_codes':[{'country_code':'98', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'IS', 'default_name':'Iceland', 'country_codes':[{'country_code':'354', 'patterns':['XXX XXXX']}]}, {'iso2':'IT', 'default_name':'Italy', 'country_codes':[{'country_code':'39', 'patterns':['XXX XXX XXX']}]}, {'iso2':'JM', 'default_name':'Jamaica', 'country_codes':[{'country_code':'1876', 'patterns':['XXX XXXX']}]}, {'iso2':'JO', 'default_name':'Jordan', 'country_codes':[{'country_code':'962', 'patterns':['X XXXX XXXX']}]}, {'iso2':'JP', 'default_name':'Japan', 'country_codes':[{'country_code':'81', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'KE', 'default_name':'Kenya', 'country_codes':[{'country_code':'254', 'patterns':['XXX XXX XXX']}]}, {'iso2':'KG', 'default_name':'Kyrgyzstan', 'country_codes':[{'country_code':'996', 'patterns':['XXX XXXXXX']}]}, {'iso2':'KH', 'default_name':'Cambodia', 'country_codes':[{'country_code':'855', 'patterns':['XX XXX XXX']}]}, {'iso2':'KI', 'default_name':'Kiribati', 'country_codes':[{'country_code':'686', 'patterns':['XXXX XXXX']}]}, {'iso2':'KM', 'default_name':'Comoros', 'country_codes':[{'country_code':'269', 'patterns':['XXX XXXX']}]}, {'iso2':'KN', 'default_name':'Saint Kitts & Nevis', 'country_codes':[{'country_code':'1869', 'patterns':['XXX XXXX']}]}, {'iso2':'KP', 'default_name':'North Korea', 'country_codes':[{'country_code':'850'}]}, {'iso2':'KR', 'default_name':'South Korea', 'country_codes':[{'country_code':'82', 'patterns':['XX XXXX XXX']}]}, {'iso2':'KW', 'default_name':'Kuwait', 'country_codes':[{'country_code':'965', 'patterns':['XXXX XXXX']}]}, {'iso2':'KY', 'default_name':'Cayman Islands', 'country_codes':[{'country_code':'1345', 'patterns':['XXX XXXX']}]}, {'iso2':'KZ', 'default_name':'Kazakhstan', 'country_codes':[{'country_code':'7', 'prefixes':['6', '7'], 'patterns':['XXX XXX XX XX']}]}, {'iso2':'LA', 'default_name':'Laos', 'country_codes':[{'country_code':'856', 'patterns':['XX XX XXX XXX']}]}, {'iso2':'LB', 'default_name':'Lebanon', 'country_codes':[{'country_code':'961', 'patterns':['XX XXX XXX']}]}, {'iso2':'LC', 'default_name':'Saint Lucia', 'country_codes':[{'country_code':'1758', 'patterns':['XXX XXXX']}]}, {'iso2':'LI', 'default_name':'Liechtenstein', 'country_codes':[{'country_code':'423', 'patterns':['XXX XXXX']}]}, {'iso2':'LK', 'default_name':'Sri Lanka', 'country_codes':[{'country_code':'94', 'patterns':['XX XXX XXXX']}]}, {'iso2':'LR', 'default_name':'Liberia', 'country_codes':[{'country_code':'231', 'patterns':['XX XXX XXXX']}]}, {'iso2':'LS', 'default_name':'Lesotho', 'country_codes':[{'country_code':'266', 'patterns':['XX XXX XXX']}]}, {'iso2':'LT', 'default_name':'Lithuania', 'country_codes':[{'country_code':'370', 'patterns':['XXX XXXXX']}]}, {'iso2':'LU', 'default_name':'Luxembourg', 'country_codes':[{'country_code':'352', 'patterns':['XXX XXX XXX']}]}, {'iso2':'LV', 'default_name':'Latvia', 'country_codes':[{'country_code':'371', 'patterns':['XXX XXXXX']}]}, {'iso2':'LY', 'default_name':'Libya', 'country_codes':[{'country_code':'218', 'patterns':['XX XXX XXXX']}]}, {'iso2':'MA', 'default_name':'Morocco', 'country_codes':[{'country_code':'212', 'patterns':['XX XXX XXXX']}]}, {'iso2':'MC', 'default_name':'Monaco', 'country_codes':[{'country_code':'377', 'patterns':['XXXX XXXX']}]}, {'iso2':'MD', 'default_name':'Moldova', 'country_codes':[{'country_code':'373', 'patterns':['XX XXX XXX']}]}, {'iso2':'ME', 'default_name':'Montenegro', 'country_codes':[{'country_code':'382'}]}, {'iso2':'MG', 'default_name':'Madagascar', 'country_codes':[{'country_code':'261', 'patterns':['XX XX XXX XX']}]}, {'iso2':'MH', 'default_name':'Marshall Islands', 'country_codes':[{'country_code':'692'}]}, {'iso2':'MK', 'default_name':'North Macedonia', 'country_codes':[{'country_code':'389', 'patterns':['XX XXX XXX']}]}, {'iso2':'ML', 'default_name':'Mali', 'country_codes':[{'country_code':'223', 'patterns':['XXXX XXXX']}]}, {'iso2':'MM', 'default_name':'Myanmar', 'country_codes':[{'country_code':'95'}]}, {'iso2':'MN', 'default_name':'Mongolia', 'country_codes':[{'country_code':'976', 'patterns':['XX XX XXXX']}]}, {'iso2':'MO', 'default_name':'Macau', 'country_codes':[{'country_code':'853', 'patterns':['XXXX XXXX']}]}, {'iso2':'MP', 'default_name':'Northern Mariana Islands', 'country_codes':[{'country_code':'1670', 'patterns':['XXX XXXX']}]}, {'iso2':'MQ', 'default_name':'Martinique', 'country_codes':[{'country_code':'596'}]}, {'iso2':'MR', 'default_name':'Mauritania', 'country_codes':[{'country_code':'222', 'patterns':['XXXX XXXX']}]}, {'iso2':'MS', 'default_name':'Montserrat', 'country_codes':[{'country_code':'1664', 'patterns':['XXX XXXX']}]}, {'iso2':'MT', 'default_name':'Malta', 'country_codes':[{'country_code':'356', 'patterns':['XX XX XX XX']}]}, {'iso2':'MU', 'default_name':'Mauritius', 'country_codes':[{'country_code':'230', 'patterns':['XXXX XXXX']}]}, {'iso2':'MV', 'default_name':'Maldives', 'country_codes':[{'country_code':'960', 'patterns':['XXX XXXX']}]}, {'iso2':'MW', 'default_name':'Malawi', 'country_codes':[{'country_code':'265', 'patterns':['XX XXX XXXX']}]}, {'iso2':'MX', 'default_name':'Mexico', 'country_codes':[{'country_code':'52'}]}, {'iso2':'MY', 'default_name':'Malaysia', 'country_codes':[{'country_code':'60', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'MZ', 'default_name':'Mozambique', 'country_codes':[{'country_code':'258', 'patterns':['XX XXX XXXX']}]}, {'iso2':'NA', 'default_name':'Namibia', 'country_codes':[{'country_code':'264', 'patterns':['XX XXX XXXX']}]}, {'iso2':'NC', 'default_name':'New Caledonia', 'country_codes':[{'country_code':'687'}]}, {'iso2':'NE', 'default_name':'Niger', 'country_codes':[{'country_code':'227', 'patterns':['XX XX XX XX']}]}, {'iso2':'NF', 'default_name':'Norfolk Island', 'country_codes':[{'country_code':'672'}]}, {'iso2':'NG', 'default_name':'Nigeria', 'country_codes':[{'country_code':'234', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'NI', 'default_name':'Nicaragua', 'country_codes':[{'country_code':'505', 'patterns':['XXXX XXXX']}]}, {'iso2':'NL', 'default_name':'Netherlands', 'country_codes':[{'country_code':'31', 'patterns':['X XX XX XX XX', '97 XXXX XXXXX']}]}, {'iso2':'NO', 'default_name':'Norway', 'country_codes':[{'country_code':'47', 'patterns':['XXXX XXXX']}]}, {'iso2':'NP', 'default_name':'Nepal', 'country_codes':[{'country_code':'977', 'patterns':['XX XXXX XXXX']}]}, {'iso2':'NR', 'default_name':'Nauru', 'country_codes':[{'country_code':'674'}]}, {'iso2':'NU', 'default_name':'Niue', 'country_codes':[{'country_code':'683'}]}, {'iso2':'NZ', 'default_name':'New Zealand', 'country_codes':[{'country_code':'64', 'patterns':['XXXX XXXX']}]}, {'iso2':'OM', 'default_name':'Oman', 'country_codes':[{'country_code':'968', 'patterns':['XXXX XXXX']}]}, {'iso2':'PA', 'default_name':'Panama', 'country_codes':[{'country_code':'507', 'patterns':['XXXX XXXX']}]}, {'iso2':'PE', 'default_name':'Peru', 'country_codes':[{'country_code':'51', 'patterns':['XXX XXX XXX']}]}, {'iso2':'PF', 'default_name':'French Polynesia', 'country_codes':[{'country_code':'689'}]}, {'iso2':'PG', 'default_name':'Papua New Guinea', 'country_codes':[{'country_code':'675'}]}, {'iso2':'PH', 'default_name':'Philippines', 'country_codes':[{'country_code':'63', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'PK', 'default_name':'Pakistan', 'country_codes':[{'country_code':'92', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'PL', 'default_name':'Poland', 'country_codes':[{'country_code':'48', 'patterns':['XXX XXX XXX']}]}, {'iso2':'PM', 'default_name':'Saint Pierre & Miquelon', 'country_codes':[{'country_code':'508'}]}, {'iso2':'PR', 'default_name':'Puerto Rico', 'country_codes':[{'country_code':'1787', 'patterns':['XXX XXXX']}, {'country_code':'1939', 'patterns':['XXX XXXX']}]}, {'iso2':'PS', 'default_name':'Palestine', 'country_codes':[{'country_code':'970', 'patterns':['XXX XX XXXX']}]}, {'iso2':'PT', 'default_name':'Portugal', 'country_codes':[{'country_code':'351', 'patterns':['XXX XXX XXX']}]}, {'iso2':'PW', 'default_name':'Palau', 'country_codes':[{'country_code':'680'}]}, {'iso2':'PY', 'default_name':'Paraguay', 'country_codes':[{'country_code':'595', 'patterns':['XXX XXX XXX']}]}, {'iso2':'QA', 'default_name':'Qatar', 'country_codes':[{'country_code':'974', 'patterns':['XX XXX XXX']}]}, {'iso2':'RE', 'default_name':'Réunion', 'country_codes':[{'country_code':'262', 'patterns':['XXX XXX XXX']}]}, {'iso2':'RO', 'default_name':'Romania', 'country_codes':[{'country_code':'40', 'patterns':['XXX XXX XXX']}]}, {'iso2':'RS', 'default_name':'Serbia', 'country_codes':[{'country_code':'381', 'patterns':['XX XXX XXXX']}]}, {'iso2':'RU', 'default_name':'Russian Federation', 'country_codes':[{'country_code':'7', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'RW', 'default_name':'Rwanda', 'country_codes':[{'country_code':'250', 'patterns':['XXX XXX XXX']}]}, {'iso2':'SA', 'default_name':'Saudi Arabia', 'country_codes':[{'country_code':'966', 'patterns':['XX XXX XXXX']}]}, {'iso2':'SB', 'default_name':'Solomon Islands', 'country_codes':[{'country_code':'677'}]}, {'iso2':'SC', 'default_name':'Seychelles', 'country_codes':[{'country_code':'248', 'patterns':['X XX XX XX']}]}, {'iso2':'SD', 'default_name':'Sudan', 'country_codes':[{'country_code':'249', 'patterns':['XX XXX XXXX']}]}, {'iso2':'SE', 'default_name':'Sweden', 'country_codes':[{'country_code':'46', 'patterns':['XX XXX XXXX']}]}, {'iso2':'SG', 'default_name':'Singapore', 'country_codes':[{'country_code':'65', 'patterns':['XXXX XXXX']}]}, {'iso2':'SH', 'default_name':'Saint Helena', 'country_codes':[{'country_code':'247'}, {'country_code':'290', 'patterns':['XX XXX']}]}, {'iso2':'SI', 'default_name':'Slovenia', 'country_codes':[{'country_code':'386', 'patterns':['XX XXX XXX']}]}, {'iso2':'SK', 'default_name':'Slovakia', 'country_codes':[{'country_code':'421', 'patterns':['XXX XXX XXX']}]}, {'iso2':'SL', 'default_name':'Sierra Leone', 'country_codes':[{'country_code':'232', 'patterns':['XX XXX XXX']}]}, {'iso2':'SM', 'default_name':'San Marino', 'country_codes':[{'country_code':'378', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'SN', 'default_name':'Senegal', 'country_codes':[{'country_code':'221', 'patterns':['XX XXX XXXX']}]}, {'iso2':'SO', 'default_name':'Somalia', 'country_codes':[{'country_code':'252', 'patterns':['XX XXX XXX']}]}, {'iso2':'SR', 'default_name':'Suriname', 'country_codes':[{'country_code':'597', 'patterns':['XXX XXXX']}]}, {'iso2':'SS', 'default_name':'South Sudan', 'country_codes':[{'country_code':'211', 'patterns':['XX XXX XXXX']}]}, {'iso2':'ST', 'default_name':'São Tomé & Príncipe', 'country_codes':[{'country_code':'239', 'patterns':['XX XXXXX']}]}, {'iso2':'SV', 'default_name':'El Salvador', 'country_codes':[{'country_code':'503', 'patterns':['XXXX XXXX']}]}, {'iso2':'SX', 'default_name':'Sint Maarten', 'country_codes':[{'country_code':'1721', 'patterns':['XXX XXXX']}]}, {'iso2':'SY', 'default_name':'Syria', 'country_codes':[{'country_code':'963', 'patterns':['XXX XXX XXX']}]}, {'iso2':'SZ', 'default_name':'Eswatini', 'country_codes':[{'country_code':'268', 'patterns':['XXXX XXXX']}]}, {'iso2':'TC', 'default_name':'Turks & Caicos Islands', 'country_codes':[{'country_code':'1649', 'patterns':['XXX XXXX']}]}, {'iso2':'TD', 'default_name':'Chad', 'country_codes':[{'country_code':'235', 'patterns':['XX XX XX XX']}]}, {'iso2':'TG', 'default_name':'Togo', 'country_codes':[{'country_code':'228', 'patterns':['XX XXX XXX']}]}, {'iso2':'TH', 'default_name':'Thailand', 'country_codes':[{'country_code':'66', 'patterns':['X XXXX XXXX']}]}, {'iso2':'TJ', 'default_name':'Tajikistan', 'country_codes':[{'country_code':'992', 'patterns':['XX XXX XXXX']}]}, {'iso2':'TK', 'default_name':'Tokelau', 'country_codes':[{'country_code':'690'}]}, {'iso2':'TL', 'default_name':'Timor-Leste', 'country_codes':[{'country_code':'670'}]}, {'iso2':'TM', 'default_name':'Turkmenistan', 'country_codes':[{'country_code':'993', 'patterns':['XX XXXXXX']}]}, {'iso2':'TN', 'default_name':'Tunisia', 'country_codes':[{'country_code':'216', 'patterns':['XX XXX XXX']}]}, {'iso2':'TO', 'default_name':'Tonga', 'country_codes':[{'country_code':'676'}]}, {'iso2':'TR', 'default_name':'Turkey', 'country_codes':[{'country_code':'90', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'TT', 'default_name':'Trinidad & Tobago', 'country_codes':[{'country_code':'1868', 'patterns':['XXX XXXX']}]}, {'iso2':'TV', 'default_name':'Tuvalu', 'country_codes':[{'country_code':'688'}]}, {'iso2':'TW', 'default_name':'Taiwan', 'country_codes':[{'country_code':'886', 'patterns':['XXX XXX XXX']}]}, {'iso2':'TZ', 'default_name':'Tanzania', 'country_codes':[{'country_code':'255', 'patterns':['XX XXX XXXX']}]}, {'iso2':'UA', 'default_name':'Ukraine', 'country_codes':[{'country_code':'380', 'patterns':['XX XXX XX XX']}]}, {'iso2':'UG', 'default_name':'Uganda', 'country_codes':[{'country_code':'256', 'patterns':['XX XXX XXXX']}]}, {'iso2':'US', 'default_name':'USA', 'country_codes':[{'country_code':'1', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'UY', 'default_name':'Uruguay', 'country_codes':[{'country_code':'598', 'patterns':['X XXX XXXX']}]}, {'iso2':'UZ', 'default_name':'Uzbekistan', 'country_codes':[{'country_code':'998', 'patterns':['XX XXX XX XX']}]}, {'iso2':'VC', 'default_name':'Saint Vincent & the Grenadines', 'country_codes':[{'country_code':'1784', 'patterns':['XXX XXXX']}]}, {'iso2':'VE', 'default_name':'Venezuela', 'country_codes':[{'country_code':'58', 'patterns':['XXX XXX XXXX']}]}, {'iso2':'VG', 'default_name':'British Virgin Islands', 'country_codes':[{'country_code':'1284', 'patterns':['XXX XXXX']}]}, {'iso2':'VI', 'default_name':'US Virgin Islands', 'country_codes':[{'country_code':'1340', 'patterns':['XXX XXXX']}]}, {'iso2':'VN', 'default_name':'Vietnam', 'country_codes':[{'country_code':'84'}]}, {'iso2':'VU', 'default_name':'Vanuatu', 'country_codes':[{'country_code':'678'}]}, {'iso2':'WF', 'default_name':'Wallis & Futuna', 'country_codes':[{'country_code':'681'}]}, {'iso2':'WS', 'default_name':'Samoa', 'country_codes':[{'country_code':'685'}]}, {'iso2':'XK', 'default_name':'Kosovo', 'country_codes':[{'country_code':'383', 'patterns':['XXXX XXXX']}]}, {'iso2':'YE', 'default_name':'Yemen', 'country_codes':[{'country_code':'967', 'patterns':['XXX XXX XXX']}]}, {'iso2':'ZA', 'default_name':'South Africa', 'country_codes':[{'country_code':'27', 'patterns':['XX XXX XXXX']}]}, {'iso2':'ZM', 'default_name':'Zambia', 'country_codes':[{'country_code':'260', 'patterns':['XX XXX XXXX']}]}, {'iso2':'ZW', 'default_name':'Zimbabwe', 'country_codes':[{'country_code':'263', 'patterns':['XX XXX XXXX']}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find((c) => c.name === 'United States'),\n '44': Countries.find((c) => c.name === 'United Kingdom'),\n '61': Countries.find((c) => c.name === 'Australia'),\n '64': Countries.find((c) => c.name === 'New Zealand'),\n '246': Countries.find((c) => c.name === 'Diego Garcia'),\n '255': Countries.find((c) => c.name === 'Tanzania'),\n '262': Countries.find((c) => c.name === 'Reunion'),\n '500': Countries.find((c) => c.name === 'Falkland Islands'),\n '590': Countries.find((c) => c.name === 'Guadeloupe'),\n '672': Countries.find((c) => c.name === 'Norfolk Island'),\n '1 268': Countries.find((c) => c.name === 'Antigua & Barbuda'),\n}; */\n\n/*\nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"names":["_","countries","hash"],"sourceRoot":""} \ No newline at end of file diff --git a/public/810.3054249999128f0d7a84.chunk.js b/public/810.3054249999128f0d7a84.chunk.js deleted file mode 100644 index bbdefcb00..000000000 --- a/public/810.3054249999128f0d7a84.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[810,53],{810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>C});var a=n(279),i=n(4874),o=n(9807),r=n(4494),s=n(5432),c=n(4159),d=n(2325),l=n(2384),u=n(1405),h=n(9709),g=n(9638),p=n(3910),v=n(2738),y=n(5565),m=n(1656),Z=n(7487),b=n(2398),k=n(6669),L=n(7922),f=n(3512),_=n(709),S=n(3789),w=n(5431);let x,E=null;const N=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new w.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(C.value=C.lastValue="+"+n.country_code,setTimeout((()=>{P.focus(),(0,b.Z)(P,!0)}),0))}}),C=new _.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{};let o=n?n.name||n.default_name:"";o===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,o),n||C.value.length-1>1?E.style.visibility="":E.style.visibility="hidden"}}),P=C.input;P.addEventListener("keypress",(e=>{if(!E.style.visibility&&"Enter"===e.key)return M()}));const T=new o.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;f.Z.managers.appStateManager.pushToState("keepSigned",e),S.Z.toggleStorages(e,!0)})),S.Z.getState().then((e=>{L.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),E=(0,r.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),E.style.visibility="hidden";const M=e=>{e&&(0,p.Z)(e);const t=(0,m.Z)([E,x],!0);(0,y.Z)(E,(0,d.ag)("PleaseWait")),(0,a.y)(E);let i=C.value;f.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:c.Z.id,api_hash:c.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(C.setError(),(0,y.Z)(C.label,(0,d.ag)("Login.PhoneLabelInvalid")),P.classList.add("error"),(0,y.Z)(E,(0,d.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),E.innerText=e.type)}))};(0,v.fc)(E,M),x=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),x.addEventListener("click",(()=>{h.default.mount()})),e.append(u.container,C.container,T.label,E,x);const A=document.createElement("h4");A.classList.add("text-center"),(0,d.$d)(A,"Login.Title");const I=document.createElement("div");I.classList.add("subtitle","text-center"),(0,d.$d)(I,"Login.StartText"),N.pageEl.querySelector(".container").append(A,I,e),s.Z||setTimeout((()=>{P.focus()}),0),(0,g.Z)(e),f.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=L.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&d.ZP.getLangPack(n.lang_code).then((()=>{(0,k.Z)(P,"input")}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=f.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(o||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,o=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield Z.Z.get(a))return t();setTimeout((()=>{f.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function r(e){try{c(o.next(e))}catch(e){t(e)}}function s(e){try{c(o.throw(e))}catch(e){t(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,s)}c((o=o.apply(n,a||[])).next())}));var n,a,i,o};t()})),e})).then((e=>{u.value.length||C.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{E&&((0,y.Z)(E,(0,d.ag)("Login.Next")),(0,u.Z)(E,void 0,void 0,!0),E.removeAttribute("disabled")),x&&x.removeAttribute("disabled"),f.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),C=N}}]); -//# sourceMappingURL=810.3054249999128f0d7a84.chunk.js.map \ No newline at end of file diff --git a/public/810.3054249999128f0d7a84.chunk.js.map b/public/810.3054249999128f0d7a84.chunk.js.map deleted file mode 100644 index 89e54edb4..000000000 --- a/public/810.3054249999128f0d7a84.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"810.3054249999128f0d7a84.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/putPreloader\";\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport IS_TOUCH_SUPPORTED from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport ripple from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\nimport wrapEmojiText from \"../lib/richTextProcessor/wrapEmojiText\";\r\nimport apiManagerProxy from \"../lib/mtproto/mtprotoworker\";\r\nimport CountryInputField from \"../components/countryInputField\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n countryInputField.override(country, code, countryName);\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","classList","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","e","key","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","append","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","push","Promise","resolve","forEach","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/810.67da4e1ee7f6571792cd.chunk.js b/public/810.67da4e1ee7f6571792cd.chunk.js new file mode 100644 index 000000000..d6679fc75 --- /dev/null +++ b/public/810.67da4e1ee7f6571792cd.chunk.js @@ -0,0 +1,2 @@ +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[810,53],{810:(e,t,n)=>{n.r(t),n.d(t,{default:()=>C});var a=n(279),i=n(4874),o=n(9807),r=n(4494),s=n(5432),c=n(4159),d=n(2325),l=n(2384),u=n(1405),h=n(9709),g=n(9638),p=n(3910),v=n(2738),y=n(5565),m=n(1656),Z=n(7487),b=n(2398),k=n(6669),L=n(7922),f=n(3512),_=n(709),S=n(3789),w=n(5431);let x,E=null;const N=new i.Z("page-sign",!0,(()=>{const e=document.createElement("div");let t,i;e.classList.add("input-wrapper");const u=new w.Z({onCountryChange:(e,n)=>{t=e,i=n,n&&(C.value=C.lastValue="+"+n.country_code,setTimeout((()=>{P.focus(),(0,b.Z)(P,!0)}),0))}}),C=new _.Z({onInput:e=>{l.Z.loadLottieWorkers();const{country:n,code:a}=e||{},o=n?n.name||n.default_name:"";o===u.value||t&&n&&a&&(t===n||i.country_code===a.country_code)||u.override(n,a,o),n||C.value.length-1>1?E.style.visibility="":E.style.visibility="hidden"}}),P=C.input;P.addEventListener("keypress",(e=>{if(!E.style.visibility&&"Enter"===e.key)return M()}));const T=new o.Z({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});T.input.addEventListener("change",(()=>{const e=T.checked;f.Z.managers.appStateManager.pushToState("keepSigned",e),S.Z.toggleStorages(e,!0)})),S.Z.getState().then((e=>{L.Z.isAvailable()?T.checked=e.keepSigned:(T.checked=!1,T.label.classList.add("checkbox-disabled"))})),E=(0,r.Z)("btn-primary btn-color-primary",{text:"Login.Next"}),E.style.visibility="hidden";const M=e=>{e&&(0,p.Z)(e);const t=(0,m.Z)([E,x],!0);(0,y.Z)(E,(0,d.ag)("PleaseWait")),(0,a.y)(E);const i=C.value;f.Z.managers.apiManager.invokeApi("auth.sendCode",{phone_number:i,api_id:c.Z.id,api_hash:c.Z.hash,settings:{_:"codeSettings"}}).then((e=>{n.e(392).then(n.bind(n,6392)).then((t=>t.default.mount(Object.assign(e,{phone_number:i}))))})).catch((e=>{t(),"PHONE_NUMBER_INVALID"===e.type?(C.setError(),(0,y.Z)(C.label,(0,d.ag)("Login.PhoneLabelInvalid")),P.classList.add("error"),(0,y.Z)(E,(0,d.ag)("Login.Next"))):(console.error("auth.sendCode error:",e),E.innerText=e.type)}))};(0,v.fc)(E,M),x=(0,r.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"}),x.addEventListener("click",(()=>{h.default.mount()})),e.append(u.container,C.container,T.label,E,x);const A=document.createElement("h4");A.classList.add("text-center"),(0,d.$d)(A,"Login.Title");const I=document.createElement("div");I.classList.add("subtitle","text-center"),(0,d.$d)(I,"Login.StartText"),N.pageEl.querySelector(".container").append(A,I,e),s.Z||setTimeout((()=>{P.focus()}),0),(0,g.Z)(e),f.Z.managers.apiManager.invokeApi("help.getNearestDc").then((e=>{var t;const n=L.Z.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&d.ZP.getLangPack(n.lang_code).then((()=>{(0,k.Z)(P,"input")}));const a=new Set([1,2,3,4,5]),i=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=f.Z.managers.apiManager.getNetworkerVoid(e.nearest_dc).then((()=>{i.push(e.nearest_dc)}))),(o||Promise.resolve()).then((()=>{i.forEach((e=>{a.delete(e)}));const e=[...a],t=()=>{return n=void 0,a=void 0,o=function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield Z.Z.get(a))return t();setTimeout((()=>{f.Z.managers.apiManager.getNetworkerVoid(n).finally(t)}),3e3)},new((i=void 0)||(i=Promise))((function(e,t){function r(e){try{c(o.next(e))}catch(e){t(e)}}function s(e){try{c(o.throw(e))}catch(e){t(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,s)}c((o=o.apply(n,a||[])).next())}));var n,a,i,o};t()})),e})).then((e=>{u.value.length||C.value.length||u.selectCountryByIso2(e.country)}))}),(()=>{E&&((0,y.Z)(E,(0,d.ag)("Login.Next")),(0,u.Z)(E,void 0,void 0,!0),E.removeAttribute("disabled")),x&&x.removeAttribute("disabled"),f.Z.managers.appStateManager.pushToState("authState",{_:"authStateSignIn"})})),C=N}}]); +//# sourceMappingURL=810.67da4e1ee7f6571792cd.chunk.js.map \ No newline at end of file diff --git a/public/810.67da4e1ee7f6571792cd.chunk.js.map b/public/810.67da4e1ee7f6571792cd.chunk.js.map new file mode 100644 index 000000000..f82f7cfaf --- /dev/null +++ b/public/810.67da4e1ee7f6571792cd.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"810.67da4e1ee7f6571792cd.chunk.js","mappings":"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","sources":["webpack://tweb/./src/pages/pageSignIn.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport Scrollable from '../components/scrollable';\r\nimport Page from './page';\r\nimport InputField from '../components/inputField';\r\nimport CheckboxField from '../components/checkboxField';\r\nimport Button from '../components/button';\r\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport App from '../config/app';\r\nimport I18n, {_i18n, i18n} from '../lib/langPack';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport ripple from '../components/ripple';\r\nimport findUpTag from '../helpers/dom/findUpTag';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport {randomLong} from '../helpers/random';\r\nimport pageSignQR from './pageSignQR';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport {DcAuthKey} from '../types';\r\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\r\nimport {HelpCountry, HelpCountryCode} from '../layer';\r\nimport {getCountryEmoji} from '../vendor/emoji';\r\nimport simulateEvent from '../helpers/dom/dispatchEvent';\r\nimport stateStorage from '../lib/stateStorage';\r\nimport rootScope from '../lib/rootScope';\r\nimport TelInputField from '../components/telInputField';\r\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport CountryInputField from '../components/countryInputField';\r\n\r\n// import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nconst onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n\r\n console.log('Added test country to list!');\r\n } */\r\n\r\n // const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n const countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected ||\r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country &&\r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n countryInputField.override(country, code, countryName);\r\n }\r\n\r\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n // console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned',\r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n\r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n // return;\r\n\r\n const phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n // lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n // console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n const qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n const tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n\r\n g();\r\n });\r\n\r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n\r\n // console.log('woohoo', nearestDcResult, country);\r\n })// .catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","classList","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","e","key","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","then","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","append","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","push","Promise","resolve","forEach","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute"],"sourceRoot":""} \ No newline at end of file diff --git a/public/774.04c4656f821730d3e97b.chunk.js b/public/836.c6892c261234c713a6ec.chunk.js similarity index 73% rename from public/774.04c4656f821730d3e97b.chunk.js rename to public/836.c6892c261234c713a6ec.chunk.js index 42b8670fb..b53a285b5 100644 --- a/public/774.04c4656f821730d3e97b.chunk.js +++ b/public/836.c6892c261234c713a6ec.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[774],{4425:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2384);class a{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.onVisibilityClickAdditional=()=>{this.passwordInputField.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()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(3910),a=i(503);class n extends a.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),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()};const t=this.input;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 a=this.toggleVisible=document.createElement("span");a.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(a),a.addEventListener("click",this.onVisibilityClick),a.addEventListener("touchend",this.onVisibilityClick)}}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},2582:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2325);class a{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var s=i(279),a=i(4755),n=i(4874),r=i(4494),o=i(6830),l=i(4425),d=i(2325),p=i(2582),c=i(3910),h=i(2738),m=i(2614),u=i(5565),b=i(1656),g=i(8115),w=i(3512);let y;const v=new n.Z("page-password",!0,(()=>{const e=new p.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),n=new d.ZP.IntlElement({key:"Login.Next"});t.append(n.element);const v=new o.Z({label:"LoginPassword",name:"password"});let L;y=v.input,e.inputWrapper.append(v.container,t);let Z,k=()=>(L||(L=window.setInterval(k,1e4)),w.Z.managers.passwordManager.getState().then((e=>{Z=e,Z.hint?(0,u.Z)(v.label,(0,m.Z)((0,g.Z)(Z.hint))):v.setLabel()})));const E=e=>{if(e&&(0,c.Z)(e),!y.value.length)return void y.classList.add("error");const a=(0,b.Z)([y,t],!0);let r=y.value;n.update({key:"PleaseWait"});const o=(0,s.y)(t);v.setValueSilently(""+Math.random()),v.setValueSilently(r),w.Z.managers.passwordManager.check(r,Z).then((e=>{"auth.authorization"===e._?(clearInterval(L),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),F&&F.remove()):(t.removeAttribute("disabled"),n.update({key:e._}),o.remove())})).catch((e=>{a(),v.input.classList.add("error"),e.type,n.update({key:"PASSWORD_HASH_INVALID"}),y.select(),o.remove(),k()}))};(0,h.fc)(t,E),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),n.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const V=a.Z.isMobile?100:166,F=new l.Z(v,V);return e.imageDiv.append(F.container),Promise.all([F.load(),k()])}),null,(()=>{y.focus(),w.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); -//# sourceMappingURL=774.04c4656f821730d3e97b.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[836],{4425:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2384);class a{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.onVisibilityClickAdditional=()=>{this.passwordInputField.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()}}},6830:(e,t,i)=>{i.d(t,{Z:()=>n});var s=i(3910),a=i(503);class n extends a.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),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()};const t=this.input;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 a=this.toggleVisible=document.createElement("span");a.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(a),a.addEventListener("click",this.onVisibilityClick),a.addEventListener("touchend",this.onVisibilityClick)}}},2614:(e,t,i)=>{function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},2582:(e,t,i)=>{i.d(t,{Z:()=>a});var s=i(2325);class a{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append((0,s.ag)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append((0,s.ag)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},9437:(e,t,i)=>{i.r(t),i.d(t,{default:()=>v});var s=i(279),a=i(4755),n=i(4874),r=i(4494),o=i(6830),l=i(4425),d=i(2325),p=i(2582),c=i(3910),h=i(2738),m=i(2614),u=i(5565),b=i(1656),g=i(8115),w=i(3512);let y;const v=new n.Z("page-password",!0,(()=>{const e=new p.Z({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),t=(0,r.Z)("btn-primary btn-color-primary"),n=new d.ZP.IntlElement({key:"Login.Next"});t.append(n.element);const v=new o.Z({label:"LoginPassword",name:"password"});let L;y=v.input,e.inputWrapper.append(v.container,t);const Z=()=>(L||(L=window.setInterval(Z,1e4)),w.Z.managers.passwordManager.getState().then((e=>{k=e,k.hint?(0,u.Z)(v.label,(0,m.Z)((0,g.Z)(k.hint))):v.setLabel()})));let k;const E=e=>{if(e&&(0,c.Z)(e),!y.value.length)return void y.classList.add("error");const a=(0,b.Z)([y,t],!0),r=y.value;n.update({key:"PleaseWait"});const o=(0,s.y)(t);v.setValueSilently(""+Math.random()),v.setValueSilently(r),w.Z.managers.passwordManager.check(r,k).then((e=>{"auth.authorization"===e._?(clearInterval(L),i.e(781).then(i.bind(i,5436)).then((e=>{e.default.mount()})),F&&F.remove()):(t.removeAttribute("disabled"),n.update({key:e._}),o.remove())})).catch((e=>{a(),v.input.classList.add("error"),e.type,n.update({key:"PASSWORD_HASH_INVALID"}),y.select(),o.remove(),Z()}))};(0,h.fc)(t,E),y.addEventListener("keypress",(function(e){if(this.classList.remove("error"),n.update({key:"Login.Next"}),"Enter"===e.key)return E()}));const V=a.Z.isMobile?100:166,F=new l.Z(v,V);return e.imageDiv.append(F.container),Promise.all([F.load(),Z()])}),null,(()=>{y.focus(),w.Z.managers.appStateManager.pushToState("authState",{_:"authStatePassword"})}))}}]); +//# sourceMappingURL=836.c6892c261234c713a6ec.chunk.js.map \ No newline at end of file diff --git a/public/836.c6892c261234c713a6ec.chunk.js.map b/public/836.c6892c261234c713a6ec.chunk.js.map new file mode 100644 index 000000000..9373bec9f --- /dev/null +++ b/public/836.c6892c261234c713a6ec.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"836.c6892c261234c713a6ec.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pagePassword.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\nimport PasswordInputField from '../passwordInputField';\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n // return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n // console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport InputField, {InputFieldOptions} from './inputField';\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport {AccountPassword} from '../layer';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nconst onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n const getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && rootScope.managers.passwordManager.getState().then((_state) => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n const value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n rootScope.managers.passwordManager.check(value, state).then((response) => {\r\n // console.log('passwordManager response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n\r\n switch(err.type) {\r\n default:\r\n // btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n\r\n getState();\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n // if(!isAppleMobile) {\r\n passwordInput.focus();\r\n // }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["PasswordMonkey","constructor","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","remove","PasswordInputField","options","super","plainText","onVisibilityClick","e","toggleVisible","toggle","input","type","setAttribute","name","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","append","htmlToSpan","html","span","innerHTML","LoginPage","element","body","querySelector","className","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","passwordInput","page","btnNext","btnNextI18n","key","label","getStateInterval","getState","window","setInterval","_state","state","hint","setLabel","onSubmit","value","length","update","preloader","setValueSilently","Math","random","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","Promise","all","focus"],"sourceRoot":""} \ No newline at end of file diff --git a/public/911.4ab2cba0db01b5782509.chunk.js b/public/911.4ab2cba0db01b5782509.chunk.js new file mode 100644 index 000000000..5523a9747 --- /dev/null +++ b/public/911.4ab2cba0db01b5782509.chunk.js @@ -0,0 +1,2 @@ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[911],{4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);const a=(e,t={})=>{const i=document.createElement(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}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.Z{constructor(e){super(Object.assign({plainText:!0},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}))}}},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2384);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.onVisibilityClickAdditional=()=>{this.passwordInputField.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(2384);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.style.display="none"),this.animation.canvas.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.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.style.display="",this.idleAnimation.play(),this.animation.canvas.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,{Z:()=>a});var s=i(3910),n=i(503);class a extends n.Z{constructor(e={}){super(Object.assign({plainText:!0},e)),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()};const t=this.input;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"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},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},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);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const h=document.createElement("div");let u;h.classList.add("c-ripple"),e.classList.contains("rp-square")&&h.classList.add("is-square"),e[c?"prepend":"append"](h);const p=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,d=1e3*+window.getComputedStyle(h).getPropertyValue("--ripple-duration").replace("s","");u=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),i&&i(c)};if(er.classList.add("hiding")),Math.max(i-d/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,d/2);a.Z||window.removeEventListener("contextmenu",u),u=null,g=!1},t&&t(c),window.requestAnimationFrame((()=>{const t=h.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,l=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=l+"px",h.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==h)&&(d===e||!(0,r.Z)(t.target,d));let g=!1;if(a.Z){const e=()=>{u&&u()};d.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];p(i,s),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else d.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(g)return void(g=!1);const{clientX:t,clientY:i}=e;p(t,i),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})}),{passive:!0})}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>l,gV:()=>c});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 l(e,t=!0){return c(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function c(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}},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})},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});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?t():s.then((()=>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 l=r},3911:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>pg,DIALOG_LIST_ELEMENT_TAG:()=>dg,default:()=>gg});var s=i(3512),n=i(2738),a=i(3910),o=i(2341),r=i(8497),l=i(4668),c=i(130),d=i(4755),h=i(3719),u=i(7309),p=i(5814),m=i(8805),g=i(5565),v=i(2325);class f{constructor(e,t,i=!0,s,n=!0,a=!0,o,r){this.name=e,this.type=t,this.clearable=i,this.autonomous=a,this.onFound=o,this.noIcons=r,this.list=gg.createChatList(),this.container=document.createElement("div"),s&&(this.container.className=s),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,v.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",n&&gg.setListClickListener(this.list,o,void 0,a)}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 y{constructor(e,t,i,s,n){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=n,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 m.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=s.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:s}=t;s.length&&s[0].mid===this.minMsgId&&s.shift();const n=this.searchGroups.messages;s.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;gg.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:54,meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),n.toggle(),this.minMsgId=s.length&&s[s.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=s.length,-1===this.foundCount&&(this.foundCount=i,n.nameEl&&(0,g.Z)(n.nameEl,(0,v.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}))}}var b=i(503);class w{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 b.Z({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)}}var S=i(426),C=i(9818),L=i(3241),I=i(3699),M=i(4494);const E=(e,t={})=>(0,M.Z)("btn-icon",Object.assign({icon:e||void 0},t));class P{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){this.slider=e,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=E("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 m.ZP(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider&&this.slider.addTab(this),this.listenerSetter=new I.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(){}onCloseAfterTimeout(){var e;this.destroyable&&(this.slider.tabs.delete(this),this.container.remove(),this.scrollable.destroy(),null===(e=this.listenerSetter)||void 0===e||e.removeAll())}setTitle(e){this.title.innerHTML="",this.title.append((0,v.ag)(e))}}class k extends P{constructor(e){super(e),this.eventListener=new L.Z}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}var T=i(1655),x=i(5953);class _{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{C.Z.findItemByType(this.navigationType)?C.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!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 P?n.container:n:this.canHideFirst?-1:0,t),!0},(0,x.Z)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,S.v)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach((e=>{(0,n.fc)(e,this.onCloseBtnClick)}))}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof P?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout((()=>{t.onOpenAfterTimeout()}),250)),C.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof P?e.container:e),!0}removeTabFromHistory(e){(0,T.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))}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){i||C.Z.removeByType(this.navigationType,!0);const s=e instanceof P?e:this.tabs.get(e);s&&(s.onClose&&s.onClose(),s.onCloseAfterTimeout&&setTimeout((()=>{s.onCloseAfterTimeout()}),280))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}createTab(e,t){const i=new e(t?void 0:this,!0);return i.managers=this.managers,i}}var A=i(1168),Z=i(6765);class F{constructor(e){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,n.fc)(this.container,(()=>{A.Z.createPopup(Z.Z).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}const D=(e={})=>(0,M.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);var R=i(410);const B=["January","February","March","April","May","June","July","August","September","October","November","December"],N=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],U=86400,O=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())/U+1)/7)};function H(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};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):B[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},W=2013,$=new RegExp("20[0-9]{1,2}"),j=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),q=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Q=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"),J=[31,29,31,30,31,30,31,31,30,31,30,31];function X(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===ae(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 l=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const c=e.getTime()-1;return void t.push({title:ae(l),minDate:l,maxDate:c})}let n;if(null===(n=Q.exec(i)))if(null===(n=Y.exec(i)))if(null===(n=$.exec(i))){if(null!==(n=j.exec(i))){const e=n[1],i=n[2],s=re(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void te(t,e-1,s);if(e>=W)return void ee(t,s,e)}}if(null!==(n=q.exec(i))){const e=n[1],i=re(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void te(t,s-1,i);s>=W&&ee(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 l=(new Date).getFullYear();if(oe(a-1,o)&&r>=W&&r<=l){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:ne(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>=W&&s<=12)return void ee(t,s-1,a);a<=12&&te(t,s-1,a-1)}else s>=W&&a<=12&&ee(t,a-1,s)}}function ee(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=W&&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:ie(a),minDate:a,maxDate:o})}}function te(e,t,i){if(oe(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=W;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 l=r.getTime();if(l>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const c=r.getTime()-1;o===n?e.push({title:se(l),minDate:l,maxDate:c}):e.push({title:ne(l),minDate:l,maxDate:c})}}var s}function ie(e){const t=new Date(e);return B[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function se(e){const t=new Date(e);return B[t.getMonth()].slice(0,3)+" "+t.getDate()}function ne(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function ae(e){const t=new Date(e);return N[t.getDay()]}function oe(e,t){return t>=0&&t<12&&e>=0&&e{this.uploadAvatar=e}));const e=new Br({}),t=document.createElement("div");t.classList.add("input-wrapper"),this.groupNameInputField=new b.Z({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new b.Z({label:"ChatLocation",name:"location",canBeEdited:!1}),t.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=D({icon:"arrow_next"}),(0,n.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=>{Hr.removeTabFromHistory(this),Hr.selectTab(0),_m.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const i=new Br({name:"Members",nameArgs:[this.peerIds.length]}),s=this.list=gg.createChatList({new:!0});i.content.append(s),e.content.append(this.avatarEdit.container,t),this.content.append(this.nextBtn),this.scrollable.append(e.container,i.container)}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}open(e,t=!1){this.isGeoChat=t,this.peerIds=e;const i=super.open();return i.then((()=>(t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(v.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}=gg.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(ce(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n})))))),i}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 he=i(5003),ue=i(6008);class pe{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach((e=>{const t=e.target;if(this.items.get(t)===e.isIntersecting)return;this.items.set(t,e.isIntersecting);const s={target:t,visible:e.isIntersecting,entry:e};i.push(s)})),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}}function me(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}var ge=i(4064),ve=i(4421);class fe extends ve.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(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){me(this.queue,(t=>t.div===e)),this.intersector.unobserve(e)}}class ye extends fe{constructor(e){super(e),this.onVisibilityChange=({target:e,visible:t})=>{t&&(me(this.queue,(t=>t.div===e)).forEach((e=>{e.wasSeen=!0,this.queue.unshift(e)})),this.setProcessQueueTimeout())},this.intersector=new pe(this.onVisibilityChange)}getItem(){return(0,ge.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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}var be=i(279),we=i(1405),Se=i(7530),Ce=i(9897);function Le(e,t=0,i=0,s=!1,n=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let a={_:"photoSizeEmpty",type:""},o=e.sizes||e.thumbs;if(n&&o&&"photo"!==e._&&(o=o.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==o?void 0:o.length){for(let e=0,s=o.length;e=t||n.height>=i)break}s&&"photoSizeEmpty"===a._&&"photoStrippedSize"===o[0]._&&(a=o[0])}return a}function Ie(e,t){return e.reduce(((e,t)=>e+t),t)}var Me=i(3228);class Ee{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=Ee.countRatios(e),this.proportions=Ee.countProportions(this.ratios),this.averageRatio=Ie(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Pe(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 Pe{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=Pe.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Me.Z)(e,1,2.75):(0,Me.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=Ie(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=Ie(t,0)+this.spacing*(s-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d2&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 l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/s*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/s*100+"%",8&i&&1&i&&(l.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(l.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(l.style.borderTopRightRadius="inherit"),2&i&&4&i&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}}))}var Te=i(9674);const xe={},_e=(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 Ae(e,t,i,s=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(i&&i());if(xe[t]&&s||e instanceof HTMLVideoElement)e&&_e(e,t),i&&i();else{const s=e instanceof HTMLImageElement,n=s?e:new Image;n.src=t,n.addEventListener("load",(()=>{!s&&e&&_e(e,t),xe[t]=!0,i&&i()}),{once:!0}),i&&n.addEventListener("error",(e=>{console.error("Render image from url failed:",e,t,n),i()}))}}function Ze(e,t,i){return new Promise((s=>{Ae(e,t,s,i)}))}function Fe(e,t,i,s,n=e,a){return s&&t.classList.add("fade-in"),new Promise((o=>{Ae(t,i,(()=>{Te.Z.mutateElement(e,(()=>{n.append(t),o(),s?t.addEventListener("animationend",(()=>{Te.Z.mutate((()=>{t.classList.remove("fade-in"),null==a||a.remove()}))}),{once:!0}):null==a||a.remove()}))}))}))}const De=(e,t,i,n,a,o,r)=>{const{timeout:l,raf:c}=e.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),o||delete e.dataset.raf),o&&s.Z.settings.animationsEnabled&&n)return void(e.dataset.raf=""+window.requestAnimationFrame((()=>{delete e.dataset.raf,De(e,t,i,n,a,o-1,r)})));i&&t&&e.classList.add(t);const d=()=>{delete e.dataset.timeout,!i&&t&&e.classList.remove("backwards",t),e.classList.remove("animating"),null==a||a()};if(null==r||r(),!s.Z.settings.animationsEnabled||!n)return e.classList.remove("animating","backwards"),void d();e.classList.add("animating"),e.classList.toggle("backwards",!i),e.dataset.timeout=""+setTimeout(d,n)},Re=De;var Be=i(3035),Ne=i(8487);class Ue{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,x.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,n.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 n=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;n{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,Be.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 s=0;(this.detached||this.preloader.parentElement!==e)&&(s=(0,Ne.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),Re(this.preloader,"is-visible",!0,200,void 0,s),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)&&Re(this.preloader,"is-visible",!1,200,(()=>{this.preloader.remove()}),1))}setProgress(e){if(this.totalLength||(0,Ne.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=""}}var Oe=i(3725),He=i(8594);const ze=[];let Ge=!1;function Ve(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,Oe.Z)();return ze[t](e),Ke(),i}function Ke(){Ge||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,n)=>{const a=()=>{return o=this,r=void 0,c=function*(){const o=performance.now();do{yield(0,He.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void n(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-o<6);t.length>0?(0,Be.T2)(a):s(i)},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(o,r||[])).next())}));var o,r,l,c};(0,Be.T2)(a)})).then(e.promise.resolve,e.promise.reject)}(ze.shift()).finally((()=>{Ge=!1,ze.length&&Ke()}))}var We=i(6663);let $e,je;function qe(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return We.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),je(n,0,0,s.width,s.height,t,i)),s}$e=We.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{je=e.default}));const Qe=new Map;function Ye(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;Qe.size>150&&Qe.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=Qe.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=>{$e.then((()=>{const a=new Image;a.onload=()=>{Ve({items:[[a,t,i,s]],context:null,process:qe},"unshift").then((()=>{n()}))},a.src=e}))}));Qe.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}var Je=i(4762),Xe=i(3306);const et=(0,Xe.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),tt=(0,Xe.Z)("ffd9");function it(e,t=!1){let i,s;return t?i=e instanceof Uint8Array?e:new Uint8Array(e):(i=new Uint8Array(et.concat(Array.from(e.slice(3)),tt)),i[164]=e[1],i[166]=e[2]),s=t?Je.IS_SAFARI?"image/png":"image/webp":"image/jpeg",function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,s)}function st(e,t,i=!1){return it(t.bytes,i)}function nt(e,t,i){const s=st(0,t,!1);let n,a;if(i){const e=Ye(s);n=e.canvas,a=e.promise}else n=new Image,a=Ze(n,s);return n.classList.add("thumbnail"),{image:n,loadPromise:a}}function at(e,t,i,s=!1){if(!t.downloaded||["video","gif"].includes(e.type)||s){if("document"===e._&&t.downloaded&&!s)return null;const n=e.sizes||e.thumbs,a=(null==n?void 0:n.length)?n.find((e=>"photoStrippedSize"===e._)):null;if(a&&"bytes"in a)return nt(0,a,i)}return null}var ot=i(9405),rt=i(3114);function lt(e,t,i,s,n=!0,a,o,r){const l=(0,rt.Z)(e);let c;r||(r=Le(e,i,s,void 0,o));const d="document"===e._;c=d||l?(0,ot.C)(e.w||r.w||512,e.h||r.h||512):(0,ot.C)(r.w||100,r.h||100);let h=(0,ot.C)(i,s);h=c=c.aspect(h,n);let u=!0;return(!d||["video","gif"].includes(e.type)||l)&&(h.width<200&&h.height<200&&(h=c=c.aspectCovered((0,ot.C)(200,200))),a&&(a.message||a.reply_to_mid||a.media.webpage||a.replies&&a.replies.pFlags.comments&&a.replies.channel_id.toChatId()!==le.IA)&&h.width<320&&(h=(0,ot.C)(320,h.height),u=!1),u&&h.width<120&&a&&(h=(0,ot.C)(120,h.height),u=!1)),t.style.width=h.width+"px",t.style.height=h.height+"px",{photoSize:r,size:c,isFit:u}}var ct=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function dt({photo:e,message:t,container:i,boxWidth:n,boxHeight:a,withTail:o,isOut:r,lazyLoadQueue:l,middleware:c,size:h,withoutPreloader:p,loadPromises:m,autoDownloadSize:g,noBlur:v,noThumb:f,noFadeIn:y,blurAfter:b,managers:w=s.Z.managers}){return ct(this,void 0,void 0,(function*(){const S=(0,rt.Z)(e);if(!e.sizes&&!e.thumbs&&!S)return n&&a&&!h&&"document"===e._&<(e,i,n,a,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};let C=0===g;h||(void 0===n&&(n=d.Z.active.regular.width),void 0===a&&(a=d.Z.active.regular.height)),i.classList.add("media-container");let L,I,M=i,E=!0,P=Promise.resolve();const k="document"===e._&&"image/gif"===e.mime_type&&!h,T=new Image;if(n&&a&&!h){const s=lt(e,i,n,a,void 0,t,void 0,k?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=s.photoSize,E=s.isFit,I=yield w.thumbsStorage.getCacheContext(e,h.type),!E&&!S){M=document.createElement("div"),M.classList.add("media-container-aspecter"),M.style.width=s.size.width+"px",M.style.height=s.size.height+"px";const n=at(e,I,!v,!0);if(n){P=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield dt({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:l,isOut:r,loadPromises:m,middleware:c,withoutPreloader:p,withTail:o,autoDownloadSize:g,noBlur:v,noThumb:!0,blurAfter:!0,managers:w})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(M)}}else h||(h=Le(e,n,a,!0)),I=yield w.thumbsStorage.getCacheContext(e,null==h?void 0:h.type);if(!f&&!S){const t=at(e,I,!v);t&&(P=Promise.all([P,t.loadPromise]),L=t.image,L.classList.add("media-photo"),M.append(L))}T.classList.add("media-photo");const x=(L||!I.downloaded)&&s.Z.settings.animationsEnabled&&!y;let _;const A=null==t?void 0:t.uploadingFileName;p||(I.downloaded&&!A||(_=new Ue({attachMethod:"prepend",isUpload:!!A})),A&&(_.attachPromise(u.Z.getUpload(A)),_.attach(i),C=void 0));const Z=e=>Fe(i,T,e,x,M,L),F=e=>ct(this,void 0,void 0,(function*(){if(!c||c()){if(b){const t=Ye(e,12);return t.promise.then((()=>Z(t.canvas.toDataURL())))}return Z(e)}}));let D;const R=h.w>=150&&h.h>=150||C,B=()=>ct(this,void 0,void 0,(function*(){C&&!p&&_&&(_.construct(),_.setManual());const t=(()=>{const t=k&&!h;return u.Z.downloadMediaURL({media:e,thumb:h,queueId:null==l?void 0:l.queueId,onlyCache:t?void 0:C})})(),s=yield w.thumbsStorage.getCacheContext(e,null==h?void 0:h.type);_&&!s.downloaded&&!p&&R&&_.attach(i,!1,t),C=void 0;const n=t.then(F);return n.catch((()=>{})),{download:t,render:n}}));return _&&_.setDownloadFunction(B),I.downloaded?P=D=(yield B()).render:l?l.push({div:i,load:()=>B().then((({download:e})=>e))}):D=(yield B()).render,m&&P&&m.push(P),yield P,{loadPromises:{thumb:P,full:D||Promise.resolve()},images:{thumb:L,full:T},preloader:_,aspecter:M}}))}var ht=i(5296);function ut(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}var pt=i(925),mt=i(6724);function gt(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}var vt=i(3013),ft=i(319);const yt='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let bt;function wt(e,t){if(!bt){const e=document.createElement("canvas");bt=e.getContext("2d",{alpha:!1}),bt.font=t}return bt.measureText(e).width}const St=new Map,Ct=new Set;let Lt=!1;function It(){Lt||(Lt=!0,(0,Be.T2)((()=>{Lt=!1,Ct.forEach(Et),Ct.clear()})))}function Mt(e){const t=e.dataset.sizeType;return t?d.Z.active[t].width:e.getBoundingClientRect().width}function Et(e){let t=St.get(e);const i=!t;let{text:s,textLength:n,from:a,multiplier:o,font:r,textWidth:l,elementWidth:c}=t||{};i&&(s=e.textContent,n=s.length,a=50,o=a>0&&a/100,r=`${e.dataset.fontWeight||"400"} 16px ${yt}`,l=wt(s,r),c=Mt(e),t={text:s,textLength:n,from:a,multiplier:o,font:r,textWidth:l,elementWidth:c},St.set(e,t));const d=Mt(e),h=i||c!==d;if(!i&&h&&(t.elementWidth=c=d),h)if(l>c){e.setAttribute("title",s);let i=s,n=c;for(;i.length>3;){const t=i.length,s=o&&(0,Me.Z)(o*t<<0,1,t-2)||Math.max(t+a-1,1),l=i.substr(0,s).replace(/\s*$/,""),d=i.substr(s+1).replace(/^\s*/,"");if(i=l+d,n=wt(i+"…",r),n{for(const[e]of St)Ct.add(e);It()}),{capture:!0,passive:!0});class Pt extends HTMLElement{connectedCallback(){St.set(this,null),this.dataset.sizeType?Et(this):(Ct.add(this),It())}disconnectedCallback(){St.delete(this),Ct.delete(this)}}function kt(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(Be.T2,e)}function Tt(e,t="auto"){if(0===e)return(0,v.ag)("FileSize.B",[0]);const i="auto"===t,s=Math.floor(Math.log(e)/Math.log(1024)),n="auto"===t?Math.max(0,s-1):t,a=Math.max(0,n),o=(e/Math.pow(1024,s)).toFixed(a);return(0,v.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][s],[i?o:parseFloat(o)])}function xt(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})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=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",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}customElements.define("middle-ellipsis-element",Pt);class _t{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,x.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=xt(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,Me.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,Me.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let n=this.min+s/i*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=(0,Me.Z)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}class At extends _t{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(vt.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let s=0,n=0;for(let a=0;a=t&&t>=s&&(s=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(vt.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)}}var Zt=i(8115);function Ft(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}var Dt=i(8456),Rt=i(493);function Bt(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,v.$d)(t,e?"ScamMessage":"FakeMessage"),t}function Nt(e){return t=this,i=void 0,a=function*(){const t=[],i=yield s.Z.managers.appPeersManager.getPeer(e);return i.pFlags.verified&&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}()),(i.pFlags.fake||i.pFlags.scam)&&t.push(Bt(i.pFlags.scam)),i.pFlags.premium&&t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}()),t},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(t,i||[])).next())}));var t,i,n,a}const Ut=new WeakMap;s.Z.addEventListener("peer_title_edit",(e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach((e=>{const t=Ut.get(e);t&&t.update()}))}));class Ot{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),e&&this.update(e),Ut.set(this.element,this)}setOptions(e){if(e)for(const t in e){const i=e[t];"object"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0"),this[t]=i}}update(e){var t,i,n,a,o,r;return n=this,a=void 0,r=function*(){this.setOptions(e);let n,a=this.fromName;if(void 0!==a)return void 0!==this.limitSymbols&&(a=(0,Dt.Z)(a,this.limitSymbols,this.limitSymbols)),void(0,c.Z)(this.element,(0,Zt.Z)(a));if(null!==(t=this.peerId)&&void 0!==t||(this.peerId=le.NM),this.peerId===s.Z.myId&&this.dialog)(0,g.Z)(this.element,(0,v.ag)(this.onlyFirstName?"Saved":"SavedMessages"));else{const e=null!==(i=this.managers)&&void 0!==i?i:s.Z.managers,[t,a]=yield Promise.all([(0,Rt.Z)(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols,e),this.withIcons&&Nt(this.peerId)]);if(null==a?void 0:a.length){const e=document.createElement("span");e.classList.add("peer-title-inner"),n=!0,(0,c.Z)(e,t);const i=document.createDocumentFragment();i.append(e,...a),(0,c.Z)(this.element,i)}else(0,c.Z)(this.element,t)}this.hasInner!==n&&(this.hasInner=n,this.element.classList.toggle("with-icons",n))},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}))}}function Ht(e){return t=this,i=void 0,a=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===s.Z.myId&&e.peerId!==s.Z.myId;if(t.append(i?(0,v.ag)("FromYou"):new Ot(Object.assign(Object.assign({},Ft(e)),{dialog:e.peerId===s.Z.myId})).element),(yield s.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=new Ot({peerId:e.peerId}).element;t.append(" ➝ ",i)}return t},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(t,i||[])).next())}));var t,i,n,a}function zt(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append(H(new Date(1e3*e.date))),t}var Gt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Vt(e=!0){const t=new Ue({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}s.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 Kt=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,r.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 l=r.join(", "),c=Array.from(a.querySelectorAll(l)),d=c.indexOf(e),h=c.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,d),s=h.slice(d+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class Wt extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new I.Z}render(){var e,t,i;return Gt(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=s.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const o=(0,Se.Z)(this.message),r="voice"===o.type,l=!this.voiceAsMusic&&r,h=this.message.pFlags.is_outgoing,p=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,m=gt(0|o.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const g=this.firstElementChild,f=document.createElement("div");f.classList.add("audio-download"),"audio"!==o.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),p&&(this.classList.add("is-outgoing"),this.append(f));const y=yield l?function(e){return Gt(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Se.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:o,container:r,availW:l}=function(e,t){const i=d.Z.isMobile?16:23,s=d.Z.isMobile?152:190,n=d.Z.isMobile?190:256,a=(0,Me.Z)(t/60*n,s,n),o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.classList.add("audio-waveform-bars"),o.setAttributeNS(null,"width",""+a),o.setAttributeNS(null,"height",""+i),o.setAttributeNS(null,"viewBox",`0 0 ${a} ${i}`);const r=Math.max(...e),l=e.length?e.length:100,c=Math.min(a/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=kt(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,ht.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/l*t.duration;t.currentTime=s}p.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),p.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),p.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),p.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,n.fc)(p,(e=>{(0,a.Z)(e),t.paused||s(e)}))}),ft.Z),()=>{p.remove(),p=null,t=null}}}))}(this):function(e){var t;return Gt(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Se.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,Zt.Z)(r.performer)),i?t.push(G(s.date)):t.length||t.push(Tt(n.size)),e.showSender&&t.push(yield Ht(s)),o.append(...(0,v.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const l=e.querySelector(".audio-title"),d=new Pt;d.dataset.fontWeight=e.dataset.fontWeight,d.dataset.sizeType=e.dataset.sizeType,a?d.append(yield Ht(s)):(0,c.Z)(d,(0,Zt.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),l.append(d),e.showSender&&l.append(zt(s));const h=e.querySelector(".audio-subtitle");return h.append(o),()=>{let t=!1,i=new At(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),h.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&h.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),b=this.querySelector(".audio-time");b.innerHTML=m;const w=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=vt.Z.addMedia(this.message,e),i=this.readyPromise=(0,Oe.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=y();const s=()=>gt(0|t.currentTime)+(l?" / "+m:""),o=()=>{b.innerText=s(),g.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&o();const r=(e,i=t.paused)=>{if(e&&(0,a.Z)(e),i){const e=!!this.searchContext;if(vt.Z.setSearchContext(this.searchContext||{peerId:le.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?Kt(this,this.message.mid):[];vt.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,n.fc)(g,(e=>r(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{g.classList.remove("playing"),b.innerText=m})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||vt.Z.isSafariBuffering(t)||(b.innerText=s())})),this.addAudioListener("pause",(()=>{g.classList.remove("playing")})),this.addAudioListener("play",o),r};if(null===(t=o.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield dt({photo:o,message:null,container:g,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});g.style.width=g.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(h)p&&(this.preloader=Vt(!1),this.preloader.attachPromise(u.Z.getUpload(p)),this.dataset.isOutgoing="1",this.preloader.attach(f,!1));else{let e=this.preloader;const t="audio"!==o.type;w(t);const s=t=>{if(this.audio.src)return;vt.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(vt.Z.willBePlayed(this.audio),Je.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(o.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=Vt(!1),s=(0,Oe.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),vt.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=ft.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(f,!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=Vt(),t||(this.readyPromise=(0,Oe.Z)());const s=()=>{i();const s=u.Z.downloadMediaURL({media:o});return t||s.then((()=>{this.readyPromise.resolve()})),e.attach(f,!1,s),{download:s}};e.setDownloadFunction(s),s()}this.classList.contains("corner-download")?g.append(f):this.append(f),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),f.classList.add("downloaded"),setTimeout((()=>{f.remove()}),200),vt.Z.willBePlayedMedia===this.audio&&(this.audio.play(),vt.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?s(!1):(0,n.fc)(g,(()=>{s(!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",Wt);var $t=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};let jt=0;function qt({doc:e,container:t,message:i,boxWidth:o,boxHeight:r,withTail:l,isOut:c,middleware:h,lazyLoadQueue:m,noInfo:g,group:v,onlyPreview:f,withoutPreloader:y,loadPromises:b,noPlayButton:w,size:S,searchContext:C,autoDownload:L,managers:I=s.Z.managers}){var M;return $t(this,void 0,void 0,(function*(){const E=null==L?void 0:L.video;let P=0===E;const k=!(o&&r),T=("video"!==e.type||e.size<=52428800&&!k)&&("gif"===e.type?s.Z.settings.autoPlay.gifs:s.Z.settings.autoPlay.videos);let x,_;if(!g){x=document.createElement("span"),x.classList.add("video-time"),t.append(x);let i=!1;"gif"!==e.type?(x.innerText=gt(e.duration,!1),w||"round"===e.type||(T&&!P?x.classList.add("tgico","can-autoplay"):i=!0)):(x.innerText="GIF",T||w||(i=!0,P=void 0)),i&&(_=document.createElement("span"),_.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(_))}const A={};if("image/gif"===e.mime_type){const s=yield dt({photo:e,message:i,container:t,boxWidth:o,boxHeight:r,withTail:l,isOut:c,lazyLoadQueue:m,middleware:h,withoutPreloader:y,loadPromises:b,autoDownloadSize:E,size:S,managers:I});return A.thumb=s,A.loadPromise=s.loadPromises.full,A}let Z;const F=ut();if(F.classList.add("media-video"),F.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 o=d.Z.active.round,r=o.width/2,l=3.5,c=r-2*l;s.innerHTML=`\n \n `;const h=s.firstElementChild.firstElementChild;jt||(jt=2*Math.PI*c),h.style.strokeDasharray=jt+" "+jt,h.style.strokeDashoffset=""+jt,x.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const u=document.createElement("canvas");u.width=u.height=e.w,s.prepend(u,x),s.append(F),t.append(s);const p=u.getContext("2d"),m=()=>{const e=s.message,t=vt.Z.addMedia(e,!P),i=()=>{(_m.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,Ne.Z)(t)||(t.removeEventListener("play",c),t.removeEventListener("timeupdate",l),t.removeEventListener("pause",d),t.removeEventListener("ended",m))}))},o=()=>{p.drawImage(t,0,0);const e=jt-t.currentTime/t.duration*jt;return h.style.strokeDashoffset=""+e,!t.paused},r=()=>{t.duration&&((0,Ne.Z)(t)?(t.paused&&o(),x.innerText=gt(t.duration-t.currentTime,!1)):i())},l=(0,mt.Z)((()=>{(0,Be.T2)(r)}),1e3,!1),c=()=>{F.classList.add("hide"),s.classList.remove("is-paused"),(0,ht.cK)(o,u),Z&&Z.preloader&&Z.preloader.classList.contains("manual")&&Z.onClick()},d=()=>{(0,Ne.Z)(t)?s.classList.add("is-paused"):i()},m=()=>{F.classList.remove("hide"),s.classList.add("is-paused"),F.currentTime=0,x.innerText=gt(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",c),t.addEventListener("timeupdate",l),t.addEventListener("pause",d),t.addEventListener("ended",m),(0,n.fc)(u,(i=>{if((0,a.Z)(i),Z&&!Z.detached&&Z.onClick(),t.paused){const i=!!C;if(vt.Z.setSearchContext(C||{peerId:le.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?Kt(s,e.mid):[];vt.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?(o(),r(),F.classList.add("hide")):d():c()};i.pFlags.is_outgoing?(s.onLoad=m,s.dataset.isOutgoing="1"):m()}else F.autoplay=!0;let D,R;if(i){if(D=yield dt({photo:e,message:i,container:t,boxWidth:o,boxHeight:r,withTail:l,isOut:c,lazyLoadQueue:m,middleware:h,withoutPreloader:!0,loadPromises:b,autoDownloadSize:null==L?void 0:L.photo,size:S,managers:I}),A.thumb=D,!T&&"gif"!==e.type||f)return A.loadPromise=D.loadPromises.full,A;if(l){const e=(D.images.thumb||D.images.full).parentElement;F.width=+e.getAttributeNS(null,"width"),F.height=+e.getAttributeNS(null,"height"),e.append(F)}}!F.parentElement&&t&&((null==D?void 0:D.aspecter)||t).append(F);const B=()=>$t(this,void 0,void 0,(function*(){return R=yield I.thumbsStorage.getCacheContext(e)}));yield B();const N=null==i?void 0:i.uploadingFileName;N?(Z=new Ue({attachMethod:"prepend",isUpload:!0}),Z.attachPromise(u.Z.getUpload(N)),Z.attach(t,!1),P=void 0):R.downloaded||e.supportsStreaming||y?e.supportsStreaming&&(Z=new Ue({cancelable:!1,attachMethod:"prepend"})):Z=new Ue({attachMethod:"prepend"});const U=(0,Oe.Z)();if(F.addEventListener("error",(e=>{4!==F.error.code&&console.error("Error "+F.error.code+"; details: "+F.error.message),Z&&!N&&Z.detach(),U.isFulfilled||U.resolve()}),{once:!0}),(0,pt.Z)(F).then((()=>{v&&p.Z.addAnimation(F,v),Z&&!N&&Z.detach(),U.resolve()})),"video"===e.type){const e=()=>{F.duration&&(x.innerText=gt(F.duration-F.currentTime,!1))},t=(0,mt.Z)((()=>{(0,Be.T2)(e)}),1e3,!1);F.addEventListener("timeupdate",t),_&&F.addEventListener("timeupdate",(()=>{Te.Z.mutateElement(_,(()=>{_.remove()}))}),{once:!0})}F.muted=!0,F.loop=!0,F.autoplay=!0;let O=P&&(null===(M=null==D?void 0:D.preloader)||void 0===M?void 0:M.loadFunc);const H=()=>$t(this,void 0,void 0,(function*(){Z&&P&&!y&&(Z.construct(),Z.setManual()),yield B();let s=Promise.resolve();if(Z&&!N||y)if(R.downloaded||e.supportsStreaming)e.supportsStreaming&&(P?s=Promise.reject():!R.downloaded&&Z&&(Z.attach(t,!1,null),F.addEventListener(Je.IS_SAFARI?"timeupdate":"canplay",(()=>{Z.detach()}),{once:!0})));else{const i=s=I.apiFileManager.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId,onlyCache:P});Z&&Z.attach(t,!1,i)}return!P&&O&&(O(),O=null),P=void 0,s.then((()=>$t(this,void 0,void 0,(function*(){!h||h()?("round"===e.type&&vt.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield B(),Ae(F,R.url)):U.resolve()}))),(()=>{})),{download:s,render:U}}));return Z&&!N&&Z.setDownloadFunction(H),"gif"!==e.type||T?A.loadPromise=m?(m.push({div:t,load:()=>H().then((({render:e})=>e))}),Promise.resolve()):(yield H()).render:(0,n.fc)(t,(e=>{(0,a.Z)(e),_.remove(),H()}),{capture:!0,once:!0}),A}))}function Qt({messages:e,attachmentDiv:t,middleware:i,uploading:n,lazyLoadQueue:a,isOut:o,chat:r,loadPromises:l,autoDownload:c,managers:h=s.Z.managers}){const u=[];for(const t of e){const e=(0,Se.Z)(t),i="photo"===e._?Le(e,480,480):{w:e.w,h:e.h};u.push({size:i,media:e,message:t})}ke({container:t,items:u.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:d.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0}),u.forEach(((e,s)=>{const{size:n,media:r,message:d}=e,u=t.children[s];u.dataset.mid=""+d.mid,u.dataset.peerId=""+d.peerId;const p=u.firstElementChild;let m;m="photo"===r._?dt({photo:r,message:d,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:i,size:n,loadPromises:l,autoDownloadSize:c.photo,managers:h}):qt({doc:d.media.document,container:p,message:d,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:i,loadPromises:l,autoDownload:c,managers:h}),m&&l&&l.push(m)}))}d.Z.addEventListener("changeScreen",((e,t)=>{if(t===d._.mobile||e===d._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=d.Z.active.round.width,i=t/2,s=i-7;jt=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=jt+" "+jt,n.style.strokeDashoffset=""+jt}))}}));var Yt=i(467),Jt=i(1243),Xt=i(2491),ei=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function ti({message:e,withTime:t,fontWeight:i,voiceAsMusic:a,showSender:r,searchContext:l,loadPromises:c,autoDownloadSize:d,lazyLoadQueue:h,sizeType:p,managers:m=s.Z.managers,cacheContext:g}){var f;return ei(this,void 0,void 0,(function*(){i||(i=500),p||(p="");const y=0===d,b=e.media.document||e.media.webpage.document,w=null==e?void 0:e.uploadingFileName;if("audio"===b.type||"voice"===b.type||"round"===b.type){const s=new Wt;return s.withTime=t,s.message=e,s.noAutoDownload=y,s.lazyLoadQueue=h,s.loadPromises=c,a&&(s.voiceAsMusic=a),l&&(s.searchContext=l),r&&(s.showSender=r),s.dataset.fontWeight=""+i,s.dataset.sizeType=p,yield s.render(),s}const S=b.file_name?b.file_name.split("."):"";let C="";C=S.length>1&&Array.isArray(S)?(0,Yt.ST)(S.pop().split(" ",1)[0].toLowerCase()):"file";const L=document.createElement("div");L.classList.add("document",`ext-${C}`),L.dataset.docId=""+b.id,L.doc=b;const I=document.createElement("div");let M;I.classList.add("document-ico");const E=!!g,P=()=>E?g:m.thumbsStorage.getCacheContext(b);g=yield P();let k=!1;if((null===(f=b.thumbs)||void 0===f?void 0:f.length)||e.pFlags.is_outgoing&&g.url&&"photo"===b.type){L.classList.add("document-with-thumb"),k=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(b.type))I.innerHTML=``,t.push(I.firstElementChild);else{performance.now();const e=yield dt({photo:b,message:null,container:I,boxWidth:54,boxHeight:54,loadPromises:c,withoutPreloader:!0,lazyLoadQueue:h,size:Le(b,54,54,!0),managers:m});I.style.width=I.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 M=document.createElement("span"),M.classList.add("document-ico-text"),M.innerText=C,I.append(M);const T=b.file_name?(0,Xt.Z)(b.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const x=document.createElement("span"),_=[Tt(b.size)];if(t&&_.push(G(e.date)),r&&_.push(yield Ht(e)),!t&&!r){const e=document.createElement("span"),t=Tt(b.size);e.append(" / ",t),e.style.visibility="hidden",_.push(e)}L.innerHTML=`\n ${g.downloaded&&!w||!e.mid||!k?"":'
'}\n
\n
\n `;const A=L.querySelector(".document-name"),Z=new Pt;Z.dataset.fontWeight=""+i,Z.dataset.sizeType=p,Z.textContent=T,e.mid||L.classList.add("downloaded"),A.append(Z),r&&A.append(zt(e));const F=L.querySelector(".document-size");if(x.append(...(0,v.A1)(_," · ")),F.append(x),L.prepend(I),!w&&e.pFlags.is_outgoing&&!e.mid)return L;let D,R=null;const B=()=>{if(L.classList.remove("downloading"),b.size>le.Iw&&!w)return R.setManual(),R.attach(D),R.preloader.classList.add("manual"),void R.setDownloadFunction(U);if(b.size<=le.Iw&&L.classList.add("downloaded"),D){if(D!==I){const e=D;setTimeout((()=>{e.remove()}),200)}D=null}R&&(R=null)},N=e=>{L.classList.add("downloading");const t=document.createElement("span"),i=Tt(b.size);t.style.position="absolute",t.style.left="0",e.then(B,ft.Z).finally((()=>{x.style.visibility="",t.remove()}));const s=e=>Tt(e);let n=s(0);x.style.visibility="hidden",t.append(n," / ",i),x.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},U=e=>{var t;const i=!e||e.isTrusted,n=L.doc;let a;const r=_m.chat.bubbles?_m.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!R||R.detached;a=u.Z.downloadMediaURL({media:n,queueId:r}),e&&a.then((()=>{setTimeout((()=>ei(this,void 0,void 0,(function*(){const e=(yield P()).url;window.open(e)}))),s.Z.settings.animationsEnabled?250:0)}))}else a=o.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?u.Z.downloadMediaURL({media:n,queueId:r}):u.Z.downloadToDisc({media:n,queueId:r});else a=u.Z.downloadToDisc({media:n,queueId:r},!0);a.catch((()=>{L.classList.remove("downloading")})),D&&(R.attach(D,!0,a),N(a))},{fileName:O}=(0,Jt.Z)({media:b,downloadId:"1"});if(yield m.apiFileManager.isDownloading(O)){D=L.querySelector(".document-download")||I;const e=u.Z.downloadToDisc({media:b},!0);R=new Ue,R.attach(D,!1,e),R.setDownloadFunction(U),N(e)}else if(!g.downloaded||w)if(D=L.querySelector(".document-download")||I,R=new Ue({isUpload:!!w}),w){const e=u.Z.getUpload(w);R.attachPromise(e),R.attach(D),N(e)}else R.construct(),R.setManual(),R.attach(D),R.setDownloadFunction(U),void 0!==d&&d>=b.size&&(0,n.tH)(R.preloader);return(0,n.fc)(L,(e=>{R?R.onClick(e):U(e)})),L}))}s.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,n.tH)(e)}))}));var ii=i(3178),si=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))},ni=i(5269),ai=i(8938),oi=i(5471);const ri={};function li(e,t,i){return n=this,a=void 0,r=function*(){const n=e.id+"-"+i,{width:a,height:o}=t;let r=ri[n];if(r&&r.width>=a&&r.height>=o)return;r=ri[n]={width:a,height:o};const l=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(ri[n]!==r)return;if(l&&l.w>=a&&l.h>=o)return;const c=new Promise((e=>{t.toBlob((t=>e(t)))})),d=yield c;ri[n]===r&&(s.Z.managers.appDocsManager.saveLottiePreview(e.id,d,a,o,i),delete ri[n])},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}));var n,a,o,r}var ci=i(2790),di=i(13),hi=i(2384),ui=i(7730),pi=i(671),mi=i(1656),gi=i(5432),vi=i(5975);class fi extends L.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,vi.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,a.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)),gi.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(n.pf,this.onClick,this.listenerOptions),Je.IS_MOBILE_SAFARI||C.Z.removeByType(this.navigationType)}open(e){this.close(),Je.IS_MOBILE_SAFARI||C.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(n.pf,(e=>{(0,a.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),gi.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(n.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}const yi=document.createElement("div");let bi;yi.classList.add("toast");const wi=new fi("toast");function Si(){wi.close(),yi.classList.remove("is-visible"),bi&&clearTimeout(+bi),bi=window.setTimeout((()=>{yi.remove(),bi=void 0}),200)}function Ci(e,t){wi.close(),(0,g.Z)(yi,e),yi.parentElement||(document.body.append(yi),yi.offsetLeft),yi.classList.add("is-visible"),bi&&clearTimeout(+bi),wi.open(yi),bi=window.setTimeout(Si,3e3),t&&wi.addEventListener("toggle",t,{once:!0})}function Li(e){Ci((0,v.ag)(e.langPackKey,e.langPackArguments),e.onClose)}wi.addEventListener("toggle",(e=>{e||Si()}));const Ii=new class extends fi{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()},d.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(),gi.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),gi.Z||window.addEventListener("mousemove",this.onMouseMove)}},Mi=e=>{if(e.element)return e.element;const{icon:t,text:i,onClick:s,checkboxField:o,noCheckboxClickListener:l}=e,c=document.createElement("div");c.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:"");let d=e.textElement;d||(d=e.textElement=i?(0,v.ag)(i,e.textArgs):document.createElement("span"),e.regularText&&(d.innerHTML=e.regularText)),d.classList.add("btn-menu-item-text"),c.append(d);const h=!!o||!!e.keepOpen;return s&&(0,n.fc)(c,(e=>{(0,a.Z)(e);const t=(0,r.Z)(e.target,"btn-menu");t&&!t.classList.contains("active")||!1!==s(e)&&(h||Ii.close(),o&&!l&&(o.checked="radio"===o.input.type||!o.checked))}),e.options),o&&c.append(o.label),e.element=c},Ei=(e,t)=>{const i=document.createElement("div");i.classList.add("btn-menu"),t&&e.forEach((e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}}));const s=e.map(Mi);return i.append(...s),i};var Pi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function ki(e,t){return Pi(this,void 0,void 0,(function*(){const i=e.map(((e,i,s)=>Pi(this,void 0,void 0,(function*(){if(yield t(e,i,s))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}var Ti=i(3624);function xi({pageX:e,pageY:t},i,s,n){const a=Array.from(i.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||i,{scrollWidth:o}=a,{scrollHeight:r}=i,l=document.body.getBoundingClientRect(),c=l.width,h=l.height;let u=8,p=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(p+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),s=d.Z.isMobile?"right":"left";let v="top";const f=h-r-m,y=c-o-p,b=g,w={x:{left:e,right:Math.min(y,e-o)},intermediateX:"right"===s?b:y,y:{top:t,bottom:t-r},intermediateY:f},S={left:w.x.left+o+p<=c,right:w.x.right>=g},C={top:w.y.top+r+m<=h,bottom:w.y.bottom-m>=m};{const e=S[s]?w.x[s]:(s="center",w.intermediateX);i.style.left=e+"px"}{const e=C[v]?w.y[v]:(v="center",w.intermediateY);i.style.top=e+"px"}return i.className=i.className.replace(/(top|center|bottom)-(left|center|right)/g,""),i.classList.add(("center"===v?v:"bottom")+"-"+("center"===s?s:"left"===s?"right":"left")),{width:o,height:r}}let _i=!1,Ai=0;function Zi(){Ai&&clearTimeout(Ai),Ai=window.setTimeout((()=>{Ai=0,_i=!1}),400),_i=!0}function Fi(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e),n=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(Je.IS_APPLE&&gi.Z){let i;const o={capture:!0},r=()=>{clearTimeout(i),n("touchmove",r,o),n("touchend",r,o),n("touchcancel",r,o)};s("touchstart",(n=>{n.touches.length>1?r():(s("touchmove",r,o),s("touchend",r,o),s("touchcancel",r,o),i=window.setTimeout((()=>{_i?r():(t(n.touches[0]),r(),Ii.isOpened()&&e.addEventListener("touchend",a.Z,{once:!0}))}),400))}))}else s("contextmenu",gi.Z?i=>{t(i),Ii.isOpened()&&e.addEventListener("touchend",a.Z,{once:!0})}:t)}var Di=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Ri{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,x.Z)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=D({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new F((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()})),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}))}}function Bi(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}class Ni{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?(0,c.Z)(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append((0,v.ag)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),t=!0),e.checkboxField){this.checkboxField=e.checkboxField;const i=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(i?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(t=!0,this.container.append(this.checkboxField.label)),!e.noCheckboxSubtitle&&!i){const t=()=>{(0,g.Z)(this.subtitle,(0,v.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?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.noWrap&&this.title.classList.add("no-wrap"),e.title?"string"==typeof e.title?this.title.innerHTML=e.title:this.title.append(e.title):this.title.append((0,v.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"),"string"==typeof i?s.innerHTML=i:s.append(i),t.append(s)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&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,n.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,we.Z)(this.container,void 0,void 0,!0))}createMedia(e){this.container.classList.add("row-with-padding");const t=this.media=document.createElement("div");return t.classList.add("row-media"),e&&t.classList.add("row-media-"+e),this.container.append(t),t}}const Ui=(e,t)=>Bi(e.map((e=>({container:e.container,input:e.radioField.input}))),t);function Oi(e){navigator.clipboard?navigator.clipboard.writeText(e):function(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)}(e)}var Hi=i(144),zi=i(9750),Gi=i(3789);class Vi{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&&(Gi.Z.getState().then((t=>{i.checked=(0,zi.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{s.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const n=this.main=document.createElement("div");n.classList.add("radio-field-main"),e.text?n.innerHTML=e.text:e.langKey&&(0,v.$d)(n,e.langKey),t.append(i,n)}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}}var Ki=i(5701);function Wi(e){return(e.length>=5&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class $i extends b.Z{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,Ki.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(b.I.Neutral),void(this.options.onChange&&this.options.onChange());Wi(e)?this.setState(b.I.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)}))}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){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.checkUsernamePromise=this.managers.appUsersManager.checkUsername(e),this.checkUsernamePromise.then((t=>{this.getValue()===e&&(t?this.setState(b.I.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&"USERNAME_INVALID"===t.type&&this.setError(this.options.invalidText)})).then((()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&Wi(t)&&this.checkUsername(t)})))}}var ji=i(9807);class qi extends A.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,A.x)(t.buttons)})),this.className=e,t.peerId){const e=new Wm;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,v.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,v.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,c.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 ji.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)}}class Qi extends k{init(){return e=this,t=void 0,a=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 Br({name:e?"ChannelType":"GroupType"}),i=(0,Hi.a)(),a=new Ni({radioField:new Vi({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new Ni({radioField:new Vi({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=Ui([a,o],(e=>{const t=[c,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),g()})),l=yield this.managers.appChatsManager.getChat(this.chatId);t.content.append(r);const c=new Br({}),d=new Ni({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{Oi(this.chatFull.exported_invite.link),Ci(v.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),h=(0,M.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,n.fc)(h,(()=>{new qi("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,mi.Z)([h],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),d.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),c.content.append(d.container,h);const u=new Br({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),p=document.createElement("div");p.classList.add("input-wrapper");const m="t.me/",g=()=>{const e=a.radioField.checked&&y!==m||f.isValidToChange()&&f.input.classList.contains("valid");b.classList.toggle("is-visible",e)},f=new $i({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:g,peerId:this.chatId.toPeerId(!0),head:m},this.managers),y=m+(l.username||"");p.append(f.container),u.content.append(p);const b=D({icon:"check",className:"is-visible"});this.content.append(b),(0,n.fc)(b,(()=>{(0,be.p)(b);const e=o.radioField.checked?f.getValue():"";this.managers.appChatsManager.migrateChat(this.chatId).then((t=>this.managers.appChatsManager.updateUsername(t,e))).then((()=>{this.close()}))}),{listenerSetter:this.listenerSetter}),(y!==m?o:a).radioField.checked=!0,f.setOriginalValue(y),this.scrollable.append(t.container,c.container,u.container);{const t=new Br({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new ji.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 n=()=>{i.setValueSilently(!!l.pFlags.noforwards)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()})),n(),t.content.append(i.label),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}}class Yi{constructor(e){this.loading=!1,this.loaded=!1,(0,x.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}))))}}var Ji=i(8479),Xi=i(7120),es=i(2946),ts=i(4789),is=i(8763),ss=i(1352);const ns=new class{constructor(){if(ss.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()}},as=ns;var os=i(6690),rs=i(2566);function ls(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}function cs(e,t=s.Z.managers){var i,n,a,o,r,l;return a=this,o=void 0,l=function*(){const s=yield t.appChatsManager.getChat(e);if("chatForbidden"===s._)return(0,v.ag)("YouWereKicked");const a=yield t.appProfileManager.getCachedFullChat(e);let o;o=a?"channelFull"===a._?a.participants_count:null===(i=a.participants.participants)||void 0===i?void 0:i.length:s.participants_count||(null===(n=s.participants)||void 0===n?void 0:n.participants.length),o=o||1;const r=s.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,v.ag)(r,[ls(o)])},new((r=void 0)||(r=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 r?n:new r((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,o||[])).next())}))}var ds=i(8493),hs=i(8050),us=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ps{constructor(e){this.container=document.createElement("div"),this.list=gg.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=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(const e in this.tempIds)++this.tempIds[e];this.list=gg.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,x.Z)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>us(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 ki(e,(e=>us(this,void 0,void 0,(function*(){if(e.isPeerId()&&!(yield this.managers.appPeersManager.getPeer(e)).deleted)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,v.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,v.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new Br({});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 m.ZP(t),(0,n.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,r.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,n.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new Br({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new m.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,n.fc)(this.chatsContainer,(e=>{const t=(0,is.Z)(e.target,"data-peer-id");if((0,a.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 s=(0,Ki.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",s),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend(Ur()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return us(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([s.Z.myId]))}))}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return us(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=as.height/72*1.25|0,t=this.getTempId("dialogs"),i=this.managers.appMessagesManager.getConversations(this.query,this.offsetIndex,e,this.folderId,!0);this.promise=i;const n=yield i;if(this.tempIds.dialogs!==t)return;this.promise=null;let a=n.dialogs;if(a.length){const e=(0,hs.Z)(a[a.length-1])||0;a=a.slice(),(0,ge.Z)(a,(e=>e.peerId===s.Z.myId)),this.chatRightsAction&&(a=yield ki(a,(e=>this.filterByRights(e.peerId)))),yield this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),n.isEnd){if(!this.loadedWhat.dialogs)return yield this.renderSaved(),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 us(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,ds.Z)(t):!!(0,Xi.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return us(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);this.promise=i;const[n,a]=yield i;if(this.tempIds.contacts!==t)return;if(a){let t=e?a.my_results.concat(a.results):a.my_results;this.chatRightsAction&&(t=yield ki(t,(e=>this.filterByRights(e)))),this.peerType.includes("dialogs")||(t=t.filter((e=>e.isUser()))),this.cachedContacts=(0,os.Z)(n.concat(t))}else this.cachedContacts=n.slice();(0,T.Z)(this.cachedContacts,s.Z.myId),this.promise=null}const t=as.height/72*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return us(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),i=yield t;if(this.tempIds.channelParticipants!==e)return;const n=i.participants.map((e=>(0,rs.Z)(e)));(0,T.Z)(n,s.Z.myId),this.renderResultsFunc(n),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){return us(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield ki(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>us(this,void 0,void 0,(function*(){const{dom:t}=gg.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new ji.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield cs(e.toChatId()):e===s.Z.myId?(0,v.ag)(this.selfPresence):ce(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const s=document.createElement("div");s.classList.add("selector-user","scale-in");const n=new Wm;return n.classList.add("selector-user-avatar","tgico","avatar-32"),n.isDialog=!0,s.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new Ot({peerId:e.toPeerId(),dialog:!0}).element),n.updateWithOptions({peerId:e})),t&&("string"==typeof t?s.innerHTML=t:((0,g.Z)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(s,this.input),this.onChange&&this.onChange(this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),s}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)};s.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:ts.f.Static})}))}}class ms extends A.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new ps({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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),gi.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.title.append(this.selector.input)}}var gs=i(6848);class vs extends k{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 Br({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=gg.createChatList({new:!0});i.append(s);const{dom:n}=gg.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(ce(yield this.managers.appUsersManager.getUser(this.userId)));const a=new ys({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,gs.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 Br({});if("channelParticipantBanned"===this.participant._){const i=(0,M.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,n.fc)(i,(()=>{const t=(0,mi.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,M.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,n.fc)(i,(()=>{(0,mi.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{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var fs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ys{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return fs(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,Ji.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,a=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const o of this.v){const r=o.flags[0];o.checkboxField=new ji.Z({text:o.text,checked:(0,Xi.Z)(t,r,s),restriction:!0,withRipple:!0}),(e.participant&&i.pFlags[r]||t.username&&(o.flags.includes("pin_messages")||o.flags.includes("change_info")))&&(o.checkboxField.input.disabled=!0,(0,n.fc)(o.checkboxField.label,(e=>{Ci(v.ZP.format(a,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[r]&&e.listenerSetter.add(o.checkboxField.input)("change",(()=>{o.checkboxField.checked||this.v.filter((e=>this.toggleWith[r].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(o.checkboxField.label)}}))}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 bs extends k{init(){return fs(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new Br({name:"ChannelPermissionsHeader"});e=new ys({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 Br({name:"PrivacyExceptions"}),i=new Ni({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new ms({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{a(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),a=e=>fs(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void Ci("User is no longer participant")}const i=this.slider.createTab(vs);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const o=t.generateContentElement();o.classList.add("chatlist-container");const r=gg.createChatList({new:!0});o.append(r),(0,n.fc)(r,(e=>{const t=(0,l.Z)(e.target,dg);if(!t)return;const i=t.dataset.peerId.toPeerId();a(i)}),{listenerSetter:this.listenerSetter});const c=(t,i)=>fs(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.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...(0,v.v_)(a.map((e=>(0,v.ag)(e))),!1))),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=gg.addDialogNew({peerId:(0,es.Z)(e.peer),container:r,rippleEnabled:!0,avatarSize:48,append:t});c(i.listEl,e)},h=()=>{(0,g.Z)(i.subtitle,(0,v.ag)(p?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[p]))};let u,p=0;const m=()=>(u=new Yi({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,r.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return p=e.count,h(),e.participants.length<50||e.count===r.childElementCount}))}),u.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield m():(h(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,m())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class ws{constructor(e,t,i){this.peerId=e,this.peerType=t,this.onSelect=i,this.construct()}construct(){return e=this,t=void 0,s=function*(){let{peerId:e,peerType:t,onSelect:i}=this;const s=new Ot({peerId:e}).element,n=A.Z.MANAGERS;void 0===t&&(t=yield n.appPeersManager.getDialogType(e));const a=(t,s=h&&!!t.size)=>{let a=n.appChatsManager.leave(e.toChatId());s&&(a=a.finally((()=>n.appMessagesManager.flushHistory(e)))),i&&i(a)},o=t=>{let s;if(e.isUser())s=n.appMessagesManager.flushHistory(e,!1,h?!!t.size:void 0);else{if(!t.size)return a(t);s=n.appChatsManager.delete(e.toChatId())}i&&i(s)};let r,l,c,d,h;switch(t){case"channel":(yield n.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(r="ChannelDeleteMenu",l="AreYouSureDeleteAndExitChannel",d=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:o}],h=[{text:"DeleteChannelForAll"}]):(r="LeaveChannelMenu",l="ChannelLeaveAlertWithName",c=[s],d=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":r="DeleteChatUser",l="AreYouSureDeleteThisChatWithUser",c=[s],d=[{langKey:"DeleteChatUser",isDanger:!0,callback:o}],h=[{text:"DeleteMessagesOptionAlso",textArgs:[new Ot({peerId:e}).element]}];break;case"saved":r="DeleteChatUser",l="AreYouSureDeleteThisChatSavedMessages",d=[{langKey:"DeleteChatUser",isDanger:!0,callback:o}];break;case"megagroup":case"group":(yield n.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(r="DeleteMegaMenu",l="AreYouSureDeleteAndExit",d=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:o}],h=[{text:"DeleteChat.DeleteGroupForAll"}]):(r="LeaveMegaMenu",l="AreYouSureDeleteAndExitName",c=[s],d=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new qi("popup-delete-chat",{peerId:e,titleLangKey:r,descriptionLangKey:l,descriptionLangArgs:c,buttons:d,checkboxes:h}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Ss=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Cs extends k{init(){var e;return Ss(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId);let s=null!==(e=i.available_reactions)&&void 0!==e?e:[];const n=new Set(s),a=new Br({caption:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"EnableReactionsChannelInfo":"EnableReactionsGroupInfo"}),o=new ji.Z({toggle:!0,checked:!!n.size}),r=new Ni({checkboxField:o,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});a.content.append(r.container);const l=new Br({name:"AvailableReactions"}),c=t.map((e=>{const t=new ji.Z({toggle:!0,checked:n.has(e.reaction)});this.listenerSetter.add(t.input)("change",(()=>{t.checked?(n.add(e.reaction),o.checked||o.setValueSilently(!0)):(n.delete(e.reaction),!n.size&&o.checked&&o.setValueSilently(!1)),h()}));const i=new Ni({checkboxField:t,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return Oa({row:i,doc:e.static_icon,size:"small"}),l.content.append(i.container),t}));this.listenerSetter.add(r.checkboxField.input)("change",(()=>{o.checked?c.every((e=>!e.checked))&&(c.forEach((e=>e.checked=!0)),h()):(c.forEach((e=>e.checked=!1)),h())}));const d=()=>Ss(this,void 0,void 0,(function*(){const e=Array.from(n);if([...e].sort().join()===[...s].sort().join())return;const t=yield this.managers.appProfileManager.getCachedFullChat(this.chatId);t&&(t.available_reactions=e),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,e),s=e})),h=(0,Ki.Z)(d,3e3,!1,!0);this.eventListener.addEventListener("destroy",d,{once:!0}),this.scrollable.append(a.container,l.container)}))}}var Ls=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Is extends P{_init(){var e;return Ls(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",null!==(e=this.tempId)&&void 0!==e||(this.tempId=0);const t=++this.tempId;this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let i=yield this.managers.appProfileManager.getChatFull(this.chatId,!0);const a=yield this.managers.appChatsManager.getChat(this.chatId),o=yield this.managers.appChatsManager.isBroadcast(this.chatId),r=yield this.managers.appChatsManager.isChannel(this.chatId),l=[],c=e=>{l.push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&l.forEach((e=>e()))})),this.listenerSetter.add(s.Z)("chat_full_update",(e=>Ls(this,void 0,void 0,(function*(){this.chatId===e&&(i=(yield this.managers.appProfileManager.getCachedFullChat(e))||i)}))));const d=this.chatId.toPeerId(!0),h=yield this.managers.appChatsManager.hasRights(this.chatId,"change_type"),u=yield this.managers.appChatsManager.hasRights(this.chatId,"change_permissions");{const e=new Br({noDelimiter:!0}),r=[],l=document.createElement("div");if(l.classList.add("input-wrapper"),this.chatNameInputField=new b.Z({label:o?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new b.Z({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(a.title),this.descriptionInputField.setOriginalValue(i.about),l.append(this.chatNameInputField.container,this.descriptionInputField.container),r.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new Ri({peerId:d,inputFields:r,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.content.append(this.editPeer.avatarEdit.container,l),h){const t=new Ni({titleLangKey:o?"ChannelType":"GroupType",clickable:()=>{const e=this.slider.createTab(Qi);e.chatId=this.chatId,e.chatFull=i,e.open(),this.listenerSetter.add(e.eventListener)("destroy",s)},icon:"lock",listenerSetter:this.listenerSetter}),s=()=>{let e;t.subtitle.textContent="",e=o?a.username?"TypePublic":"TypePrivate":a.username?"TypePublicGroup":"TypePrivateGroup",t.subtitle.append((0,v.ag)(e))};s(),e.content.append(t.container)}if(h||u){const s=new Ni({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(Cs);e.chatId=this.chatId,e.open().then((()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)}))},listenerSetter:this.listenerSetter}),n=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,a=()=>{var e;const t=null!==(e=i.available_reactions)&&void 0!==e?e:[];s.subtitle.innerHTML=t.length+"/"+n};a(),e.content.append(s.container)}if(u&&!o){const t=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new Ni({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(bs);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>Ls(this,void 0,void 0,(function*(){const e=yield this.managers.appChatsManager.getChatTyped(this.chatId);i.subtitle.innerHTML=t.reduce(((t,i)=>t+ +(0,Xi.Z)(e,i,e.default_banned_rights)),0)+"/"+t.length}));n(),e.content.append(i.container),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()}))}if(this.scrollable.append(e.container),(0,n.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}),o&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const t=new ji.Z({text:"PeerInfo.SignMessages",checked:!!a.pFlags.signatures,withRipple:!0});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,t.checked).then((()=>{e()}))})),c((()=>{t.setValueSilently(!!a.pFlags.signatures)})),e.content.append(t.label)}}if(!o){const e=new Br({});if(!o&&h){const t=new ji.Z({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(t.input)("change",(()=>{const e=t.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!t.checked).then((()=>{e()}))}));const s=()=>{t.setValueSilently(r&&!i.pFlags.hidden_prehistory)};s(),c(s),e.content.append(t.label)}e.content.childElementCount&&this.scrollable.append(e.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new Br({}),t=(0,M.Z)("btn-primary btn-transparent danger",{icon:"delete",text:o?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,n.fc)(t,(()=>{new ws(d,void 0,(e=>{const i=(0,mi.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}r||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{d===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var Ms=i(6272);function Es(e){return"+"+(0,Ms.u)(e).formatted}var Ps=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ks extends P{init(){return Ps(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));this.setTitle(e?"AddContactTitle":"Edit");{const t=new Br({noDelimiter:!0}),i=[],a=document.createElement("div");if(a.classList.add("input-wrapper"),this.nameInputField=new b.Z({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new b.Z({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=yield this.managers.appUsersManager.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(a.append(this.nameInputField.container,this.lastNameInputField.container),i.push(this.nameInputField,this.lastNameInputField),this.editPeer=new Ri({peerId:this.peerId,inputFields:i,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const i=document.createElement("div");i.classList.add("avatar-edit"),i.append(this.editPeer.avatarElem);const n=new ji.Z({text:"Notifications"});n.input.addEventListener("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute(this.peerId)})),this.listenerSetter.add(s.Z)("notify_settings",(e=>Ps(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,es.Z)(e.peer.peer);if(this.peerId===t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const o=document.createElement("div");o.classList.add("profile-name"),o.append(new Ot({peerId:this.peerId}).element);const r=document.createElement("div");if(r.classList.add("profile-subtitle"),r.append((0,v.ag)("EditContact.OriginalName")),t.content.append(i,o,r,a),e){const e=yield this.managers.appUsersManager.getUser(this.peerId),i=new Ni({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?Es(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new Ot({peerId:this.peerId}).element]});t.content.append(i.container)}else{const e=new Ni({checkboxField:n,listenerSetter:this.listenerSetter}),i=!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1));n.checked=i,t.content.append(e.container)}}else t.content.append(a);this.scrollable.append(t.container),(0,n.fc)(this.editPeer.nextBtn,(()=>Ps(this,void 0,void 0,(function*(){this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(this.peerId)).phone).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}if(!e){const e=new Br({}),t=(0,M.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,n.fc)(t,(()=>{new qi("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,A.x)([{langKey:"Delete",callback:()=>{const e=(0,mi.Z)([t],!0);this.managers.appUsersManager.deleteContacts([this.peerId]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}))}}class Ts extends P{init(){this.container.classList.add("add-members-container"),this.nextBtn=D({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()));if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}}))}attachToPromise(e){const t=(0,be.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const i="privacy"===this.peerType;return this.selector=new ps({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[i?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:i,filterPeerTypeBy:i?["isAnyGroup","isUser"]:void 0,managers:this.managers}),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),t}}var xs=i(2365),_s=i(1708),As=i(6074);const Zs=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],Fs=["red","green","yellow","blue","violet","pink","cyan","orange"],Ds=[0,7,4,1,6,3,5];function Rs(e,t=!0){if(!e)return"";const i=Ds[Math.abs(+e)%7];return(t?Fs:Zs)[i]}function Bs(e,t=!1){if(!e)return"";const i=e.trim().split(" ");if(!i[0])return"";const s=[...i[0]][0];if(t||1===i.length)return(0,Zt.Z)(s);const n=[...i[i.length-1]][0];return(0,Zt.Z)(s+n)}var Ns=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Us(e,t,i,n,a=new Image,o=!1){return Ns(this,void 0,void 0,(function*(){const o=yield s.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,n),r=o.result,l=o.cached;let c,d,h;if(a.classList.add("avatar-photo"),l)d=()=>{(0,g.Z)(e,a),e.dataset.color=""};else{const o=s.Z.settings.animationsEnabled;o&&a.classList.add("fade-in");let r=!1;if("photo_big"===n){const s=yield Us(e,t,i,"photo_small");c=s.loadPromise,h=s.thumbImage}else if(i.stripped_thumb){h=new Image,e.classList.add("avatar-relative"),h.classList.add("avatar-photo","avatar-photo-thumbnail");const t=it(i.stripped_thumb);c=Ze(h,t).then((()=>{r||(0,g.Z)(e,h)}))}d=()=>{r=!0,h?e.append(a):(0,g.Z)(e,a),setTimeout((()=>{e.childElementCount&&Te.Z.mutateElement(a,(()=>{e.dataset.color="",o&&a.classList.remove("fade-in"),h&&h.remove()}))}),o?200:0)}}const u=r.then((e=>Ze(a,e))).then(d);return yield c||u,{cached:l,loadPromise:c||u,thumbImage:h}}))}function Os(e,t,i,s){(0,c.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),s&&e.classList.add(s)}function Hs(e,t,i=!1,n="",a=!1,o){return Ns(this,void 0,void 0,(function*(){const r=s.Z.myId;if(t===r&&i)return void Os(e,"","","tgico-saved");const l=s.Z.managers;if(t!==le.NM&&t.isUser()){const i=yield l.appUsersManager.getUser(t);if(i&&i.pFlags&&i.pFlags.deleted)return void Os(e,"",Rs(t),"tgico-deletedaccount")}const c=o?"photo_big":"photo_small",d=yield l.appPeersManager.getPeerPhoto(t),h=!!d,u=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!h||!u||!(yield l.appAvatarsManager.isAvatarCached(t,c))){let a="";if(!t||t===r&&i||(a=Rs(t)),t===le.hj)return void Os(e,"",a,"tgico-reply_filled");const o=yield n?Bs(n):function(e,t=s.Z.managers){var i,n,a,o,r;return n=this,a=void 0,r=function*(){const s=yield t.appPeersManager.getPeer(e);return Bs(null!==(i=s.title)&&void 0!==i?i:[s.first_name,s.last_name].filter(Boolean).join(" "))},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}))}(t,l);Os(e,o,a,"")}return h?Us(e,t,d,c,void 0,a):void 0}))}const zs=e=>e.touches?e.touches[0]:e,Gs=window;let Vs=!1;Ii.addEventListener("toggle",(e=>{Vs=e}));class Ks{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{gi.Z?Gs.removeEventListener("touchmove",this.handleMove,{capture:!0}):(Gs.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{return t=this,i=void 0,n=function*(){const t=zs(e);if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,gi.Z?Gs.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):Gs.addEventListener("mousemove",this.handleMove,!1)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||Vs)return void this.reset();this.cancelEvent&&(0,a.Z)(e);const t=zs(e),i=t.clientX,s=t.clientY,n=this.xDown-i,o=this.yDown-s;if(!this.hadMove){if(!n&&!o)return;this.hadMove=!0,gi.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const r=this.onSwipe(n,o,e);void 0!==r&&r&&this.reset()},(0,x.Z)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){gi.Z?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),Gs.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),Gs.addEventListener("mouseup",this.reset))}removeListeners(){gi.Z?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),Gs.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),Gs.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!gi.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var Ws=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class $s{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>Ws(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add($s.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=()=>Ws(this,void 0,void 0,(function*(){if(i){const e=yield dt({container:t,photo:i,size:Le(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 Us(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($s.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add($s.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add($s.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add($s.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add($s.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add($s.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add($s.BASE_CLASS+"-arrow",$s.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 I.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let o=!1,r=!1;(0,n.fc)(this.container,(e=>Ws(this,void 0,void 0,(function*(){if(r)return void(0,a.Z)(e);if(o)return void(o=!1);if(!i())return;const t=this.container.getBoundingClientRect(),n=e.pageX,l=n-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||l>t.width*s&&l{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];r=!0,Gm(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),r=!1}else{const e=n>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,Be.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const l=()=>{o=!0,document.body.addEventListener(gi.Z?"touchend":"click",(e=>{o=!1}),{once:!0})};let c=0,d=0,h=0,u=0;this.swipeHandler=new Ks({element:this.avatars,onSwipe:(e,t)=>{h=e;let i=d+e*-$s.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!r:(l(),(0,a.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();c=e.width,u=-c*(this.tabs.childElementCount-1),d=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=$s.TRANSLATE_TEMPLATE.replace("{x}",d+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(c/$s.SCALE))*(h>=0?1:-1);l(),this.avatars.classList.remove("no-transition"),(0,Be.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 Ws(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 As.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=>Ws(this,void 0,void 0,(function*(){const t=e.pop();if((0,_s.Z)(t),!i.current){const s=e[0],n=(0,ge.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*$s.SCALE*i;this.avatars.style.transform=$s.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($s.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()}}$s.BASE_CLASS="profile-avatars",$s.SCALE=xs.Z?2:1,$s.TRANSLATE_TEMPLATE=xs.Z?`translate3d({x}, 0, -1px) scale(${$s.SCALE})`:"translate({x}, 0)";function js(e){return t=this,i=void 0,n=function*(){const t=new Ot;return yield t.update(e),t.element},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}var qs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Qs=(e,t)=>{(0,c.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class Ys{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,this.setPeerStatus=(e=!1)=>{const t=this.peerId;if(this.element.classList.toggle("is-me",t===s.Z.myId),t&&(s.Z.myId!==t||!this.isDialog))return _m.setPeerStatus(t,this.subtitle,e,!0,(()=>t===this.peerId),!this.isDialog).then((e=>{e&&e()}))},xs.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new I.Z)}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new Br({noDelimiter:!0}),this.avatar=new Wm,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.isDialog=this.isDialog,this.avatar.attachClickEvent(),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 Ni({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>qs(this,void 0,void 0,(function*(){"A"!==e.target.tagName&&(Oi((yield this.managers.appProfileManager.getProfileByPeerId(this.peerId)).about),Ci(v.ZP.format("BioCopied",!0)))})),listenerSetter:this.listenerSetter}),this.bio.title.classList.add("pre-wrap"),this.username=new Ni({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>qs(this,void 0,void 0,(function*(){Oi("@"+(yield this.managers.appPeersManager.getPeer(this.peerId)).username),Ci(v.ZP.format("UsernameCopied",!0))})),listenerSetter:this.listenerSetter}),this.phone=new Ni({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>qs(this,void 0,void 0,(function*(){Oi("+"+(yield this.managers.appUsersManager.getUser(this.peerId)).phone),Ci(v.ZP.format("PhoneCopied",!0))})),listenerSetter:this.listenerSetter}),this.link=new Ni({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{Oi(this.link.title.textContent),Ci(v.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),this.location=new Ni({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 Ni({checkboxField:new ji.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute(this.peerId)})),e.add(s.Z)("dialog_notify_settings",(e=>qs(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),xs.Z&&this.element.append(Ur()),e.add(s.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(s.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)})),e.add(s.Z)("peer_title_edit",(e=>{e===this.peerId&&this.fillUsername()})),e.add(s.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(s.Z)("contacts_update",(e=>qs(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(s.Z)("avatar_update",(e=>{this.peerId===e&&this.setAvatar()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}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!==s.Z.myId||!this.isDialog}setAvatar(){return qs(this,void 0,void 0,(function*(){if(this.canBeDetailed()&&(yield this.managers.appPeersManager.getPeerPhoto(this.peerId))){const e=this.avatars;return this.avatars=new $s(this.scrollable,this.managers),yield this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(xs.Z&&this.scrollable.container.classList.add("parallax"))}xs.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),yield this.avatar.updateWithOptions({peerId:this.peerId}),this.section.content.prepend(this.avatar,this.name,this.subtitle)}))}fillUsername(){return qs(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerUsername(e);return Qs(t,this.username)}}))}fillUserPhone(){return qs(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appUsersManager.getUser(e);return Qs(t.phone?Es(t.phone):void 0,this.phone)}}))}fillNotifications(){return qs(this,void 0,void 0,(function*(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else(0,Be.T2)((()=>{e.container.style.display="none"}))}))}fillRows(){return qs(this,void 0,void 0,(function*(){const e=this.peerId;yield Promise.all([this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(),(()=>qs(this,void 0,void 0,(function*(){const[t]=yield Promise.all([js({peerId:e,dialog:this.isDialog,withIcons:!0})]);(0,g.Z)(this.name,t)})))(),this.setPeerStatus(!0)])}))}fillProfileElements(){return qs(this,void 0,void 0,(function*(){this.cleaned&&(this.cleaned=!1,this.cleanupHTML(),yield Promise.all([this.setAvatar(),this.fillRows()]))}))}_setMoreDetails(e,t){return qs(this,void 0,void 0,(function*(){if(Qs(t.about?(0,ii.Z)(t.about):void 0,this.bio),!e.isUser()){const i=yield this.managers.appChatsManager.getChat(e.toChatId());if(i.username)Qs("https://t.me/"+i.username,this.link);else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&Qs(e.link,this.link)}}const i=t.location;"channelLocation"==(null==i?void 0:i._)&&Qs(i.address,this.location),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4)}))}setMoreDetails(e){return qs(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const t=this.peerId,i=this.threadId;if(!t||(yield this.managers.appPeersManager.isRestricted(t))||!this.canBeDetailed())return;const s=yield this.managers.acknowledged.appProfileManager.getProfileByPeerId(t,e),n=s.result.then((e=>qs(this,void 0,void 0,(function*(){this.peerId!==t||this.threadId!==i||(yield this.managers.appPeersManager.isRestricted(t))||(yield this._setMoreDetails(t,e))}))));s.cached&&(yield n)}))}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup()}}var Js=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Xs={};class en extends P{constructor(e){super(e,!1),this.threadId=0}init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,M.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);const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.title.append((0,v.ag)("Profile")),this.editBtn=E("edit"),a.append(this.title,this.editBtn);const o=document.createElement("div");o.classList.add("transition-item");const r=this.title.cloneNode();r.append((0,v.ag)("PeerInfo.SharedMedia")),o.append(r),i.append(a,o),this.header.append(i),this.profile=new Ys(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",e),this.searchSuper.container.classList.toggle("is-full-viewport",e),c(+e),e||this.searchSuper.cleanScrollPositions()},c=(0,S.v)(i,"slide-fade",400,null,!1);c(0),(0,n.fc)(this.closeBtn,(e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),c(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,n.fc)(this.editBtn,(e=>{let t;t=this.peerId.isAnyChat()?this.slider.createTab(Is):this.slider.createTab(ks),t&&(t instanceof Is?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.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.renderNewMessages(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.renderNewMessages(e)})),this.searchSuper=new uo({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((()=>{d.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const d=D({icon:"addmember_filled"});this.content.append(d),(0,n.fc)(d,(()=>Js(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,l;if(t.length>1)n="AddMembersAlertTitle",a=[(0,v.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new Ot({peerId:e}).element),t})),i||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new Ot({peerId:t[0]}).element),r=[e],i||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new Ot({peerId:t[0]}).element],checked:!0}])}r.push(new Ot({peerId:e}).element),new qi("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&Li({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(Ts);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 ms({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})}renderNewMessages(e){return Js(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e;if(Xs[t])for(const i of this.searchSuper.mediaTabs){const s=i.inputFilter,n=Xs[t][s];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],s).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===t&&-1!==this.searchSuper.usedFromHistory[s]&&(this.searchSuper.usedFromHistory[s]+=a.length,this.searchSuper.performSearchResult(a,i,!1)))}}))}deleteDeletedMessages(e,t){if(!this.init&&Xs[e]){for(const i of t)for(const t of this.searchSuper.mediaTabs){const s=t.inputFilter,n=Xs[e][s];if(!n)continue;const a=n.findIndex((e=>e.mid===i));if(-1!==a&&(n.splice(a,1),this.peerId===e)){const t=this.searchSuper.tabs[s].querySelector(`[data-mid="${i}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[s]>=a+1&&--this.searchSuper.usedFromHistory[s]}}this.scrollable.onScroll()}}cleanupHTML(){return Js(this,void 0,void 0,(function*(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",(yield this.searchSuper.canViewMembers())&&(yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")))}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var i;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,historyStorage:null!==(i=Xs[e])&&void 0!==i?i:Xs[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){return Js(this,void 0,void 0,(function*(){this.peerChanged&&(this.peerChanged=!1,yield this.cleanupHTML(),yield this.toggleEditBtn(),yield this.profile.fillProfileElements())}))}toggleEditBtn(){return Js(this,void 0,void 0,(function*(){let e;e=this.peerId.isUser()?this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId())):yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}destroy(){this.destroyable=!0,this.onCloseAfterTimeout(),this.profile.destroy(),this.searchSuper.destroy()}}const tn="is-right-column-shown",sn=new class extends _{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,d.Z.addEventListener("changeScreen",((e,t)=>{t===d._.medium&&e!==d._.mobile&&this.toggleSidebar(!1)})),d.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(en,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;t?e?(t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):t.container.remove():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(tn);let s;if(void 0!==e?e?i||(s=!0):i&&(s=!0):s=!0,!s)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=_m.selectTab(i?1:2,t);return document.body.classList.toggle(tn,e),n}};R.GO.appSidebarRight=sn;const nn=sn;class an{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)}}var on=i(5418),rn=i(9976),ln=i(8799),cn=i(3447),dn=i(7746);function hn(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,pi.w1)(e).join("-").replace(/-?fe0f/g,"")}}const un=new Set;function pn(e,t,i=!1,n=!1){var a;const o=document.createElement("span");let r;if(o.classList.add("super-emoji"),n&&!rn.Z?r=function(e){return(0,ii.Z)(e,{entities:[hn(e)]})}(e):(e=(0,dn.Z)(e),r=(0,Zt.Z)(e)),o.append(r),o.children.length>1){const e=o.firstElementChild;o.innerHTML="",o.append(e)}if("IMG"===(null===(a=o.firstElementChild)||void 0===a?void 0:a.tagName)){const e=o.firstElementChild,t=e.src;if(!un.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),s.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,Be.T2)((()=>{s.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),o.classList.remove("empty"),un.add(t)}))}),{once:!0}),o.append(i)}}i?t.prepend(o):t.appendChild(o)}function mn(e){return(0,r.Z)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class gn{constructor(e){this.managers=e,this.closeScrollTop=0,this.onContentClick=e=>{(0,a.Z)(e);const t=mn(e.target);t&&(_m.chat.input.onEmojiSelected(t,!1),gi.Z&&(0,ln.Z)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},i=new Map([["Emoji.Recent",[]]]);for(const t in cn.Z){const s=""+cn.Z[t],n=e[+s[0]-1];if(!n)continue;let a=i.get(n);a||(a=[],i.set(n,a)),a[+s.slice(1)||0]=t}i.delete(e.pop()),i.forEach(((e,i)=>{const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append((0,v.ag)(i));const a=document.createElement("div");a.classList.add("super-emojis"),s.append(n,a),e.forEach((e=>{pn((0,pi.zu)(e),a,!1)})),t[i]=s}));const a=this.menu=this.content.previousElementSibling,o=this.scroll=new m.ZP(this.content,"EMOJI"),r=(0,be.y)(this.content,!0);Promise.all([(0,on.Z)(200),this.managers.appEmojiManager.getRecentEmojis().then((e=>{const t=!!e.length,i=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[i].classList.add("active");const s=zn.menuOnClick(a,o,void 0,i);return this.stickyIntersector=s.stickyIntersector,this.setMenuActive=s.setActive,e}))]).then((([i,s])=>{r.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of s)pn(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map((e=>{const i=t[e];return i||console.error("no div by category:",e),o.container.append(i),this.stickyIntersector.observeStickyHeaderChanges(i),i}))})),(0,n.fc)(this.content,this.onContentClick),this.init=null,s.Z.addEventListener("emoji_recent",(e=>{const t=Array.from(this.recentItemsDiv.children);for(let i=0,s=t.length;i{this.closeScrollTop=this.scroll.scrollTop}))}onClose(){}}class vn extends fe{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new pe((e=>{const{target:t,visible:i}=e,s=me(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){this.intersector.observe(e)}}var fn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const yn=100;class bn{constructor(e,t,i,n=!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,Oe.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>fn(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img");i&&(i&&i.classList.remove("hide"),yield(0,Be.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),p.Z.getAnimations(t).forEach((e=>{p.Z.checkAnimation(e,!0,!0)})))})))),this.managers=s.Z.managers,this.lazyLoadQueue=new vn(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),n&&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])=>fn(this,void 0,void 0,(function*(){const i=(yield qt({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video");e.style.opacity="";const i=e.querySelector("img");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),p.Z.getAnimations(t).forEach((e=>{p.Z.checkAnimation(e,!0,!0)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){let i=e.w,s=e.h;s{e.forEach((e=>{i.add(e)})),s.remove()})),Vn.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}class Sn extends fe{constructor(e,t,i){super(e),this.onVisibilityChange=t,this._queue=new Map,this.intersector=new pe((e=>{const{target:t,visible:i}=e,s=me(this.queue,(e=>e.div===t));i&&(s.length?s:[this._queue.get(t)]).forEach((e=>{this.queue.unshift(e||this._queue.get(t))})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}var Cn=i(2648);function Ln(e,t,i,s){return void 0===s&&(s=e.parentElement===t?(0,Cn.Z)(e):-1),s!==i&&(-1!==s&&si?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}function In(e){return new Promise(((t,i)=>{var s;const{button:n,checkbox:a}=e;n.callback=e=>{t(e?!!e.size:void 0)};const o=(0,A.x)(e.buttons||[n]),r=o.find((e=>e.isCancel));r.callback=()=>{i()},e.buttons=o,null!==(s=e.checkboxes)&&void 0!==s||(e.checkboxes=a&&[a]),new qi("popup-confirmation",e).show()}))}var Mn=i(7625);function En(e,t,i,s=e.getBoundingClientRect(),n=t.getBoundingClientRect()){let{top:a,right:o,bottom:r,left:l}=n;if(i){const e=t.querySelector(".sticky");e&&(a=e.getBoundingClientRect().bottom)}if(s.top>=r||s.bottom<=a||s.right<=l||s.left>=o)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},d="visualViewport"in window?window.visualViewport:window,h=d.width||d.innerWidth,u=d.height||d.innerHeight;return{rect:{top:s.topo&&o!==h?(c.right=!0,++c.horizontal,o):s.right,bottom:s.bottom>r&&r!==u?(c.bottom=!0,++c.vertical,r):s.bottom,left:s.left{if(Tn||e.buttons>1||0!==e.button)return;let t=(0,r.Z)(e.target,"media-sticker-wrapper");if(!t)return;const s=t.dataset.docId;if(!s)return;const o="sticker-viewer",l="STICKER-VIEWER",c=p.Z.getOnlyOnePlayableGroup(),d=(0,Ti.k)();let h,u;const m=({mediaContainer:e,doc:t,middleware:s,lockGroups:a,isSwitching:c})=>kn(this,void 0,void 0,(function*(){const d=(0,di.Z)(t),u=e.getBoundingClientRect(),m=(0,ot.C)(t.w,t.h),g=d?280:360,v=(0,ot.C)(g,g),f=u.width===u.height?v:m.aspectFitted(v),y=(0,r.Z)(e,"bubble"),b=!y||y.classList.contains("is-out"),w=document.createElement("div");w.classList.add(o+"-transformer");const S=document.createElement("div");S.classList.add(o+"-sticker"),S.style.width=f.width+"px",S.style.height=f.height+"px";const C=document.createElement("div");if(C.classList.add(o+"-emoji"),C.append((0,Zt.Z)(t.stickerEmojiRaw)),d){const e=(g*Xn-g)/3*(b?1:-1);w.classList.add("has-effect"),w.style.setProperty("--translateX",`${e}px`),C.style.setProperty("--translateX",-e+"px")}const L=(0,r.Z)(e,"scrollable"),I=En(e,L,!0,u);(I.overflow.vertical||I.overflow.horizontal)&&S.classList.add("is-overflow");const M=e.getBoundingClientRect(),E=M.width/f.width,P=M.height/f.height,k=M.left-(as.width-M.width)/2,T=M.top-(as.height-M.height)/2;w.style.transform=`translate(${k}px, ${T}px) scale(${E}, ${P})`,c&&w.classList.add("is-switching"),w.append(S,C),h.append(w);const x=yield ta({doc:t,div:S,group:l,width:f.width,height:f.height,play:!1,loop:!0,middleware:s,managers:i,needFadeIn:!1,isOut:b,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!s())return;h.parentElement||document.body.append(h);const _=x instanceof Pn.Z?new Promise((e=>x.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([_,(0,Be.d1)()]),yield(0,on.Z)(0),s()){if(a&&(p.Z.setOnlyOnePlayableGroup(l),p.Z.checkAnimations(!0)),x instanceof Pn.Z){const t=hi.Z.getAnimation(e);x.curFrame=t.curFrame,x.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),x.removeEventListener("enterFrame",i))};x.addEventListener("enterFrame",i)})),x.pause()}else x instanceof HTMLVideoElement&&(x.currentTime=e.querySelector("video").currentTime);return{ready:()=>{(x instanceof Pn.Z||x instanceof HTMLVideoElement)&&x.play(),d&&(0,n.tH)(S)},transformer:w}}})),g=window.setTimeout((()=>kn(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",f),h=document.createElement("div"),h.classList.add(o),Tn=!0;const e=d.get(),n=yield i.appDocsManager.getDoc(s);if(!e())return;let a;try{if(a=yield m({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:r,transformer:l}=a;u=l,Re(h,"is-visible",!0,200,(()=>{e()&&r()})),document.addEventListener("mousemove",v)}))),125),v=e=>kn(this,void 0,void 0,(function*(){const s=(0,r.Z)(e.target,"media-sticker-wrapper");if(!s||t===s)return;const n=s.dataset.docId;if(!n)return;t=s,d.clean();const a=d.get(),o=yield i.appDocsManager.getDoc(n);if(!a())return;let l;try{if(l=yield m({doc:o,mediaContainer:t,middleware:a,isSwitching:!0}),!l)return}catch(e){return}const{ready:c,transformer:h}=l,p=u;Re(p,"is-switching",!0,200,(()=>{p.remove()})),u=h,Re(h,"is-switching",!1,200,(()=>{a()&&c()}))})),f=e=>{(0,vi.Z)(e.target,t)||(document.removeEventListener("mousemove",f),y())},y=()=>{clearTimeout(g),d.clean(),h&&(Re(h,"is-visible",!1,200,(()=>{h.remove(),p.Z.setOnlyOnePlayableGroup(c),p.Z.checkAnimations(!1),Tn=!1})),(0,n.fc)(document.body,a.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",v)};document.addEventListener("mousemove",f),document.addEventListener("mouseup",y,{once:!0})}))}var _n=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class An{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)=>{p.Z.getAnimations(e).forEach((e=>{t?p.Z.checkAnimation(e,!1):p.Z.checkAnimation(e,!0,!0)}))},this.processVisible=e=>_n(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=d.Z.active.esgSticker.width,n=ta({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=>_n(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 Sn(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)),ta({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.unobserve(e)}}class Zn{constructor(e){this.managers=e,this.mounted=!1,this.categories={},this.categoriesMap=new Map,this.localCategories=[]}setFavedLimit(e){const t=s.Z.premium?e.stickers_faved_limit_premium:e.stickers_faved_limit_default;this.categories.faved.limit=t}createCategory(e,t){const i=document.createElement("div");i.classList.add("emoji-category","hide");const s=document.createElement("div");s.classList.add("category-items","super-stickers");const n=document.createElement("div");n.classList.add("category-title"),n.append(t);const a=E(void 0,{noRipple:!0});a.classList.add("menu-horizontal-div-item");const o=document.createElement("div");o.classList.add("menu-horizontal-div-item-padding"),a.append(o);const r={elements:{container:i,title:n,items:s,menuTab:a,menuTabPadding:o},set:e,items:[],id:""+e.id};return i.append(n,s),this.categories[e.id]=r,this.categoriesMap.set(i,r),this.categoriesIntersector.observe(i),this.stickyIntersector.observeStickyHeaderChanges(i),r}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)})),this.setCategoryItemsHeight(e),i.classList.remove("hide")}))}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}setCategoryItemsHeight(e){const t=this.content.getBoundingClientRect().width-10,i=d.Z.active.esgSticker.width,s=Math.floor(t/i),n=Math.ceil(e.items.length/s)*i;e.elements.items.style.minHeight=n+"px"}renderStickerSet(e,t=!1){return _n(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,Zt.Z)(e.title)),{menuTab:s,menuTabPadding:n,container:a}=i.elements,o=t?this.localCategories.filter((e=>e.mounted)).length:65535;Ln(s,this.menu,o);const r=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,r.then((e=>e.documents))),Ln(a,this.scroll.container,o,-1),Ua({set:e,container:n,group:Hn,lazyLoadQueue:zn.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers");const e=this.content.previousElementSibling;this.menu=e.firstElementChild;const t=new m.v7(e);this.scroll=new m.ZP(this.content,"STICKERS"),this.scroll.onAdditionalScroll=()=>{o()};const i={root:Vn.getElement()};this.categoriesIntersector=new pe((({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);t?s.elements.items.append(...s.items.map((({element:e})=>e))):s.elements.items.textContent=""}),i);const a=e=>{e.elements.items.textContent="",e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scroll.container.addEventListener("click",(e=>{const t=e.target;if((0,r.Z)(t,"category-title")){const e=(0,r.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if("recent"===i.set.id)return;new qn({id:i.set.id,access_hash:i.set.access_hash}).show()}else zn.onMediaClick(e)}));const o=(e=!1)=>{s.Z.dispatchEvent("choosing_sticker",!e)};Vn.addEventListener("closed",(()=>{o(!0)})),Vn.addEventListener("opened",(()=>{o()}));const{stickyIntersector:l,setActive:c}=zn.menuOnClick(this.menu,this.scroll,t);this.stickyIntersector=l;const h=(0,be.y)(this.content,!0),u=(e,t,i)=>{const s=this.createCategory({id:e},(0,v.ag)(t));return this.localCategories.push(s),s.elements.title.classList.add("disable-hover"),i&&s.elements.menuTab.classList.add("tgico-"+i),s.elements.menuTabPadding.remove(),this.toggleLocalCategory(s,!1),s},p=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,Mn.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,Mn.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},g=u("faved","FavoriteStickers","saved");g.elements.menuTab.classList.add("active");const f=u("recent","Stickers.Recent","recent");f.limit=20;const y=E("close",{noRipple:!0});f.elements.title.append(y),(0,n.fc)(y,(()=>{In({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),ft.Z)}));const b=u("premium","PremiumStickersShort"),w=document.createElement("span");w.classList.add("tgico-star","color-premium"),b.elements.menuTab.append(w);const S=[Promise.all([this.managers.apiManager.getAppConfig(),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),p(g,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{p(f,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(b,s.Z.premium&&!!t),this.categoryAppendStickers(b,Promise.resolve(e)),s.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(S).finally((()=>{h.remove()})),Promise.all(S).finally((()=>{this.mounted=!0,o(),c(0)})),this.superStickerRenderer=new An(zn.lazyLoadQueue,Hn,this.managers,i);const C=this.superStickerRenderer.lazyLoadQueue;Vn.addLazyLoadQueueRepeat(C,this.superStickerRenderer.processInvisible),s.Z.addEventListener("stickers_installed",(e=>{!this.categories[e.id]&&this.mounted&&this.renderStickerSet(e,!0)})),s.Z.addEventListener("stickers_deleted",(({id:e})=>{const t=this.categories[e];t&&this.mounted&&(t.elements.container.remove(),t.elements.menuTab.remove(),this.categoriesIntersector.unobserve(t.elements.container),a(t),delete this.categories[e],this.categoriesMap.delete(t.elements.container))})),s.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))})),s.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{if(this.mounted){const i=this.categories["faved"===e?"faved":"recent"];p(i,t)}})),s.Z.addEventListener("app_config",(e=>{this.setFavedLimit(e)}));const L=()=>{for(const[e,t]of this.categoriesMap)this.setCategoryItemsHeight(t)};d.Z.addEventListener("resize",L),Vn.addEventListener("opened",L),xn({listenTo:this.content,listenerSetter:new I.Z}),Wn({listenTo:this.content,verifyRecent:e=>!!(0,vi.Z)(e,this.categories.recent.elements.items),onOpen:()=>{Vn.setIgnoreMouseOut(!0)},onClose:()=>{Vn.setIgnoreMouseOut(!1)}}),this.init=null}toggleLocalCategory(e,t){if(t){let t=this.localCategories.indexOf(e);const i=this.localCategories.slice(0,t).filter((e=>!e.mounted));t-=i.length,Ln(e.elements.menuTab,this.menu,t),Ln(e.elements.container,this.scroll.container,t)}else e.elements.menuTab.remove(),e.elements.container.remove();e.mounted=t}onLocalCategoryUpdate(e){this.setCategoryItemsHeight(e),this.toggleLocalCategory(e,!!e.items.length)}deleteSticker(e,t,i){const s=(0,ge.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}spliceExceed(e){const{items:t,limit:i}=e;t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),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,ge.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)}onClose(){}}const Fn="GIFS-SEARCH";class Dn extends P{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=(0,r.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;_m.chat.input.sendMessageWithDocument(i)?d.Z.isMobile&&nn.onCloseBtnClick():console.warn("got no doc by id:",i)}}init(){this.container.id="search-gifs-container",this.inputSearch=new w("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,n.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new bn(this.gifsDiv,Fn,this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",p.Z.checkAnimations(void 0,Fn),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return nn.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}})),e}search(e,t=!0){return i=this,s=void 0,a=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(le.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}}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class Rn extends P{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new ye,this.inputSearch=new w("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),xn({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,n.fc)(this.setsDiv,(e=>{const t=(0,r.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void _m.chat.input.sendMessageWithDocument(e)}const i=(0,r.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,n=i.dataset.access_hash,a=(0,r.Z)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:n}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(a.textContent="",a.append((0,v.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{a.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:n}).then((e=>{new qn(e.set).show()}))}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",p.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,c.Z)(s.firstElementChild,(0,Zt.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,v.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,v.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.renderFeatured()})),e}renderFeatured(){return this.managers.appStickersManager.getFeaturedStickers().then((e=>{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,Mn.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()})),p.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()}}class Bn extends L.Z{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=!1,this.onMouseOut=e=>{if(!this.isActive())return;if(clearTimeout(this.displayTimeout),this.ignoreMouseOut)return;const t=e.toElement;t&&(0,vi.Z)(t,this.element)||(this.displayTimeout=window.setTimeout((()=>{this.toggle(!1)}),200))},this.toggle=e=>{return t=this,i=void 0,n=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())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"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.forceClose=!1,this.dispatchEvent("opened")}),gi.Z?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),gi.Z?0:200)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},(0,x.Z)(this,e)}attachButtonListener(e,t){let i=!0;gi.Z?(0,n.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{clearTimeout(this.displayTimeout),this.onMouseOut(e)})),i=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout((()=>{this.toggle(!0)}),200)}))}init(){gi.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e){this.ignoreMouseOut=e}}var Nn,Un=i(3815),On=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Hn="emoticons-dropdown";class zn extends Bn{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(p.Z.checkAnimations(!0,Hn),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>On(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=_m.chat,i=this.tabsEl.children,s=Array.from(i),[n,a]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[2].toggleAttribute("disabled",!n),s[3].toggleAttribute("disabled",!a);const o=this.tabsEl.querySelector(".active");!o||1===(0,Cn.Z)(o)||n&&a||this.selectTab(0,!1)})),this.addEventListener("open",(()=>On(this,void 0,void 0,(function*(){gi.Z&&(0,ln.Z)()&&(yield(0,on.Z)(100)),this.element.parentElement!==_m.chat.input.chatInput&&_m.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),zn.lazyLoadQueue.lock(),p.Z.lockIntersectionGroup(Hn)})))),this.addEventListener("opened",(()=>{p.Z.unlockIntersectionGroup(Hn),zn.lazyLoadQueue.unlock(),zn.lazyLoadQueue.refresh()})),this.addEventListener("close",(()=>{zn.lazyLoadQueue.lock(),p.Z.lockIntersectionGroup(Hn),p.Z.checkAnimations(!0,Hn)})),this.addEventListener("closed",(()=>{p.Z.unlockIntersectionGroup(Hn),zn.lazyLoadQueue.unlock(),zn.lazyLoadQueue.refresh(),this.savedRange=void 0}))}init(){this.managers=s.Z.managers,this.emojiTab=new gn(this.managers),this.stickersTab=new Zn(this.managers),this.gifsTab=new wn(this.managers),this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,ue.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),p.Z.checkAnimations(!1,Hn)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{1===this.tabId?nn.isTabExists(Rn)||nn.createTab(Rn).open():nn.isTabExists(Dn)||nn.createTab(Dn).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",(e=>{var t;const i=_m.chat.input.messageInput;(null===(t=i.lastChild)||void 0===t?void 0:t.tagName)?i.lastElementChild.remove():i.lastChild&&(i.lastChild.textContent.length?i.lastChild.textContent=i.lastChild.textContent.slice(0,-1):i.lastChild.remove());const s=new Event("input",{bubbles:!0,cancelable:!0});_m.chat.input.messageInput.dispatchEvent(s),(0,a.Z)(e)}));const e=Je.IS_APPLE_MOBILE,t=e?1:0;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,n.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!gi.Z){let e,t=!1;const i=t=>{e=t};Un.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return _m.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}static sendDocId(e,t,i){return On(this,void 0,void 0,(function*(){return(yield _m.chat.input.sendMessageWithDocument(e,void 0,t,i))?(Gn.container&&(Gn.forceClose=!0,Gn.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===_m.chat.input.messageInput)return e.getRangeAt(0)}}Nn=zn,zn.lazyLoadQueue=new ye,zn.menuOnClick=(e,t,i,s=0)=>{let n=-1;const a=t=>t!==s&&(e.children[s].classList.remove("active"),e.children[t].classList.add("active"),s=t,!0),o=new an(t.container,((s,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=(0,Cn.Z)(o);!s&&r||(a(r),i&&i.scrollIntoViewNew({element:e.children[r],position:"center",axis:"x"}))}));return e.addEventListener("click",(e=>{let i=e.target;if(i=(0,r.Z)(i,"menu-horizontal-div-item"),!i)return;const s=(0,Cn.Z)(i);if(!a(s))return;const o=(t.splitUp||t.container).children[s].offsetTop+1;t.container.scrollTop=n=o})),{stickyIntersector:o,setActive:a}},zn.onMediaClick=(e,t=!1,i)=>On(void 0,void 0,void 0,(function*(){let s=e.target;if(s=(0,l.Z)(s,"DIV"),!s)return!1;const n=s.dataset.docId;return!!n&&Nn.sendDocId(n,t,i)}));const Gn=new zn;R.GO.emoticonsDropdown=Gn;const Vn=Gn;var Kn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Wn(e){const{listenTo:t,isStickerPack:i,verifyRecent:n,appendTo:a,onOpen:o,onClose:l}=e;let c,d;const h=e=>Kn(this,void 0,void 0,(function*(){const t=yield s.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===d.id));return e?!i:i}));return function({buttons:e,findElement:t,listenTo:i,appendTo:s,filterButtons:n,onOpen:a,onClose:o}){null!=s||(s=document.body);const r=new I.Z,l=new I.Z,c=(0,Ti.k)();let d;Fi(i,(e=>{const i=t(e);if(!i)return;let s=d;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),(()=>{Di(this,void 0,void 0,(function*(){yield null==a?void 0:a(i);const t=yield u();if(!t)return;s=t.element;const{cleanup:n,destroy:r}=t;xi(e,s),Ii.openBtnMenu(s,(()=>{null==o||o(),n(),setTimeout((()=>{r()}),300)}))}))})()}),r);const h=()=>{l.removeAll(),c.clean()},u=()=>Di(this,void 0,void 0,(function*(){h(),e.forEach((e=>e.element=void 0));const t=n||(e=>ki(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=d=Ei(i,l);return a.classList.add("contextmenu"),s.append(a),{element:a,cleanup:h,destroy:()=>{a.remove()}}}));return{element:d,destroy:()=>{h(),r.removeAll()}}}({listenTo:t,appendTo:a,findElement:e=>c=(0,r.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>Kn(this,void 0,void 0,(function*(){return d=yield s.Z.managers.appDocsManager.getDoc(c.dataset.docId),null==o?void 0:o()})),onClose:l,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new qn(d.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>s.Z.managers.appStickersManager.faveSticker(d.id,!1),verify:()=>h(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>s.Z.managers.appStickersManager.faveSticker(d.id,!0),verify:()=>h(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>Vn.stickersTab.deleteRecentSticker(d),verify:()=>{var e;return null!==(e=null==n?void 0:n(c))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>zn.sendDocId(d.id,!1,!0),verify:()=>!(!_m.chat.peerId||_m.chat.peerId===s.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>_m.chat.input.scheduleSending((()=>_m.chat.input.sendMessageWithDocument(d))),verify:()=>!!_m.chat.peerId}]})}var $n=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const jn="STICKERS-POPUP";class qn extends A.Z{constructor(e){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=(0,r.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;_m.chat.input.sendMessageWithDocument(i)&&this.hide()},this.title.append((0,v.ag)("Loading")),this.addEventListener("close",(()=>{p.Z.setOnlyOnePlayableGroup(),s()}));const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),(0,n.fc)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),(0,be.y)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const i=(0,M.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.scrollable.append(t),this.body.append(this.stickersFooter);const{destroy:s}=Wn({listenTo:this.stickersDiv,isStickerPack:!0});xn({listenTo:this.stickersDiv,listenerSetter:this.listenerSetter}),this.loadStickerSet()}loadStickerSet(){return this.managers.appStickersManager.getStickerSet(this.stickerSetInput).then((e=>$n(this,void 0,void 0,(function*(){if(!e)return Li({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;p.Z.setOnlyOnePlayableGroup(jn);const i=(0,v.ag)("Stickers",[e.set.count]);e.set.installed_date?(t=(0,M.Z)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append((0,v.ag)("RemoveStickersCount",[i]))):(t=(0,M.Z)("btn-primary btn-color-primary",{noRipple:!0}),t.append((0,v.ag)("AddStickersCount",[i]))),(0,n.fc)(t,(()=>{const i=(0,mi.Z)([t],!0);this.managers.appStickersManager.toggleStickerSet(e.set).then((()=>{this.hide()})).catch((()=>{i()}))}));const s=new ye,a=yield Promise.all(e.documents.map((e=>$n(this,void 0,void 0,(function*(){if("documentEmpty"===e._)return;const t=document.createElement("div");t.classList.add("sticker-set-sticker");const i=d.Z.active.esgSticker.width;return yield ta({doc:e,div:t,lazyLoadQueue:s,group:jn,play:!0,loop:!0,width:i,height:i,withLock:!0}),t})))));(0,c.Z)(this.title,(0,Zt.Z)(e.set.title)),this.stickersFooter.classList.toggle("add",!e.set.installed_date),this.stickersFooter.textContent="",this.stickersFooter.append(t),this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="",this.stickersDiv.append(...a.filter(Boolean)),this.scrollable.onAdditionalScroll()}))))}}var Qn=i(2131);function Yn({size:e,doc:t,middleware:i,target:s,side:n,skipRatio:a,play:o,managers:r,fullThumb:l,withRandomOffset:c,relativeEffect:d,loopEffect:h}){const u=document.createElement("div");let p;u.classList.add("emoji-animation"),u.style.width=e+"px",u.style.height=e+"px";const m=()=>{null==p||p.remove(),u.remove(),_m.chat.bubbles.scrollable.container.removeEventListener("scroll",w)},g=ta({div:u,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!h,width:e,height:e,play:o,group:"none",skipRatio:a,managers:r,fullThumb:l}).then((({render:e})=>e)).then((e=>((0,ai.Z)(e),p=e,p.addEventListener("enterFrame",(e=>{(h||e!==p.maxFrame)&&(0,Ne.Z)(s)||m()})),Qn.Z&&p.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),p))),v=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},f=c?v(16):0,y=c?v(4):0,b=()=>{if(!(0,Ne.Z)(s))return void m();const t=s.getBoundingClientRect(),i=t.width/200,a="center"===n?0:16*("right"===n?1:-1)*i,o="center"===n?0:0*i,r="right"===n?t.right:t.left,l=t.top,c=("center"===n?(t.width-e)/2:"right"===n?-e:0)+a+f,h=(t.height-e)/2+o+y,p=r+c,g=l+h;g<=-e||g>=as.height?m():d?("center"!==n?u.style[n]=-1*Math.abs(a)+"px":u.style.left=c+"px",u.style.top=h+"px"):(u.style.top=g+"px",u.style.left=p+"px")},w=kt(b);return _m.chat.bubbles.scrollable.container.addEventListener("scroll",w),b(),d?(u.classList.add("is-relative"),s.parentElement.append(u)):_m.emojiAnimationContainer.append(u),{animationDiv:u,stickerPromise:g}}var Jn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Xn=1.49,ea={};function ta({doc:e,div:t,middleware:i,lazyLoadQueue:o,group:l,play:c,onlyThumb:h,emoji:m,width:g,height:v,withThumb:f,loop:y,loadPromises:b,needFadeIn:w,needUpscale:S,skipRatio:C,static:L,managers:I=s.Z.managers,fullThumb:M,isOut:E,noPremium:P,withLock:k,relativeEffect:T,loopEffect:x}){var _;return Jn(this,void 0,void 0,(function*(){const A=e.sticker;if(1===A&&(L=!0),!g&&!v){const t=d.Z.active,i=m?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,ot.C)(e.w,e.h).aspectFitted(i);g=s.width,v=s.height}if(2===A&&hi.Z.loadLottieWorkers(),!A)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");let Z;t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper");const F=(t=(null==Z?void 0:Z.type))=>Jn(this,void 0,void 0,(function*(){return Z=yield I.thumbsStorage.getCacheContext(e,t)})),D=!L&&(2===A||3===A),R=(0,di.Z)(e);void 0!==E&&R&&!E&&t.classList.add("reflect-x");const B=R&&k;if(B){t.classList.add("is-premium-sticker","tgico-premium_lock");const i=ea[e.id];i&&t.style.setProperty("--lock-url",`url(${i})`)}if(L&&1!==A){const t=Le(e,g,v,!1);yield F(t.type)}else yield F(null==M?void 0:M.type);const N=m?(0,pi.tB)(m):-1,U=Z.downloaded&&!w,O=D,H=2===A||3===A?yield I.appDocsManager.getLottieCachedThumb(e.id,N):void 0;let z=(0,Oe.Z)(),G=!1;if(((null===(_=e.thumbs)||void 0===_?void 0:_.length)||H)&&!t.firstElementChild&&(!U||O||h)&&!1!==f){let n,a=H||e.thumbs[0];const r=()=>{t.childElementCount||(n.classList.add("media-sticker","thumbnail"),Te.Z.mutateElement(t,(()=>{t.append(n),z.resolve()})))};if("url"in a)n=new Image,Ae(n,a.url,r),G=!0;else if("bytes"in a)if("photoPathSize"===a._)if(a.bytes.length){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}(a.bytes),n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.classList.add("rlottie-vector","media-sticker","thumbnail"),o.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const r=document.createElementNS(n,"path");r.setAttributeNS(null,"d",i),s.Z.settings.animationsEnabled&&r.setAttributeNS(null,"fill","url(#g)"),o.append(r),t.append(o)}else a=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||a;else N<=0&&(n=new Image,ni.Z||e.pFlags.stickerThumbConverted||Z.url?(Ae(n,st(0,a,!0),r),G=!0):ui.Z.convert("main-"+e.id,a.bytes).then((s=>{I.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),a.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t.childElementCount||Ae(n,st(0,a,!0),r)})).catch((()=>{})));else if((2===A&&N<=0||3===A)&&(f||h)){const e=()=>Jn(this,void 0,void 0,(function*(){if(t.childElementCount||i&&!i())return;const e=()=>{t.childElementCount||i&&!i()||Ae(n,Z.url,r)};if(yield F(),Z.url)e();else{const t=nt(0,a,!0);n=t.image,t.loadPromise.then(e)}}));if(o&&h)return void o.push({div:t,load:e});e(),a.url&&(G=!0)}}if(b&&G&&b.push(z),h)return;const V=(0,oi.Z)("MIDDLEWARE"),K=()=>Jn(this,void 0,void 0,(function*(){if(i&&!i())throw V;if(2===A&&!L)return yield u.Z.downloadMedia({media:e,queueId:null==o?void 0:o.queueId,thumb:M}).then((o=>Jn(this,void 0,void 0,(function*(){if(i&&!i())throw V;const d=yield hi.Z.loadAnimationWorker({container:t,loop:y&&!m,autoplay:c,animationData:o,width:g,height:v,name:"doc"+e.id,needUpscale:S,skipRatio:C,toneIndex:N},l,i),h=B?()=>{var i,s;const n=null!==(i=ea[s=e.id])&&void 0!==i?i:ea[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,l=i.getImageData(o,r,n,a).data;let c=0,d=0,h=0,u=0;for(let e=0;e{const i=t.firstElementChild;!1!==w&&(w=(w||!i||"svg"===i.tagName)&&s.Z.settings.animationsEnabled);const n=()=>{i&&i!==d.canvas&&"DIV"!==i.tagName&&i.remove()};w?Te.Z.mutate((()=>{d.canvas.classList.add("fade-in"),i&&i.classList.add("fade-out"),d.canvas.addEventListener("animationend",(()=>{Te.Z.mutate((()=>{d.canvas.classList.remove("fade-in"),n()}))}),{once:!0})})):i&&Te.Z.mutate(n),!1!==f&&li(e,d.canvas,N),B&&h()}),{once:!0}),m){const e={a:[],v:1};let s;I.appStickersManager.preloadAnimatedEmojiStickerAnimation(m),(0,n.fc)(t,(n=>Jn(this,void 0,void 0,(function*(){(0,a.Z)(n);const o=hi.Z.getAnimation(t);if(o.paused){const e=yield I.appStickersManager.getAnimatedEmojiSoundDocument(m);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield u.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,pt.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}o.autoplay=!0,o.restart()}if(!_m.chat.peerId.isUser())return;const l=yield I.appStickersManager.getAnimatedEmojiSticker(m,!0);if(!l)return;const{animationDiv:c}=Yn({doc:l,middleware:i,side:E?"right":"left",size:280,target:t,play:!0,withRandomOffset:!0});void 0===E||E||c.classList.add("reflect-x"),s||(s=(0,mt.Z)((()=>{if(!e.a.length)return;const i=e.a[0].t;e.a.forEach((e=>{e.t=(e.t-i)/1e3}));const s=(0,r.Z)(t,"bubble");I.appMessagesManager.setTyping(_m.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,ci.Z)(+s.dataset.mid),emoticon:m,interaction:{_:"dataJSON",data:JSON.stringify(e)}},!0),e.a.length=0}),1e3,!1)),n.isTrusted&&(e.a.push({i:1,t:Date.now()}),s())}))))}return d}))));if(L||3===A){let n;L?n=new Image:(n=ut(),n.muted=!0,c&&(n.autoplay=!0),y&&(n.loop=!0));const a=t.firstElementChild!==n&&t.firstElementChild;return!1!==w&&(w=(w||!U||(L?a:!a||"svg"===a.tagName))&&s.Z.settings.animationsEnabled),n.classList.add("media-sticker"),w&&n.classList.add("fade-in"),new Promise(((s,r)=>Jn(this,void 0,void 0,(function*(){const c=()=>Jn(this,void 0,void 0,(function*(){if(i&&!i())return void r(V);const o=()=>{Te.Z.mutateElement(t,(()=>{if(t.append(n),a&&a.classList.add("fade-out"),3===A&&!function(e,t){const i=e.id+"-"+t;return!!ri[i]}(e,N)){(0,ai.Z)(n);const t=document.createElement("canvas");t.width=g*window.devicePixelRatio,t.height=v*window.devicePixelRatio,t.getContext("2d").drawImage(n,0,0,t.width,t.height),li(e,t,N)}3===A&&l&&p.Z.addAnimation(n,l),s(n),w&&n.addEventListener("animationend",(()=>{n.classList.remove("fade-in"),null==a||a.remove()}),{once:!0})}))};yield F(),L?Ae(n,Z.url,o):(n.src=Z.url,(0,pt.Z)(n).then(o))}));if(yield F(),Z.url)c();else{let t;if(2===A&&L){const i=Le(e,g,v,!1);t=u.Z.downloadMediaURL({media:e,thumb:i,queueId:null==o?void 0:o.queueId})}else t=u.Z.downloadMediaURL({media:e,queueId:null==o?void 0:o.queueId});t.then(c,r)}}))))}})),W=!o||U&&!D?K():(o.push({div:t,load:K}),Promise.resolve());return U&&L&&(z=W,b&&b.push(z)),2===A&&R&&void 0!==E&&!P&&function({container:e,doc:t,managers:i,middleware:s,isOut:o,width:r,loadPromise:l,relativeEffect:c,loopEffect:d}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,n.fc)(e,(i=>Jn(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{Si(),new qn(t.stickerSetInput).show()},void Li({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield l;const{animationDiv:n,stickerPromise:u}=Yn({doc:t,middleware:s,side:o?"right":"left",size:r*Xn,target:e,play:!0,fullThumb:(0,di.Z)(t),relativeEffect:c,loopEffect:d});void 0===o||o||n.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t,doc:e,managers:I,middleware:i,isOut:E,width:g,loadPromise:W,relativeEffect:T,loopEffect:x}),{render:W}}))}class ia extends P{init(){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)}open(e){const t=Object.create(null,{open:{get:()=>super.open}});return i=this,s=void 0,a=function*(){const i=t.open.call(this),s=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const n=document.createElement("h3");(0,c.Z)(n,(0,Zt.Z)(s.poll.question));const a=s.results.results.map((e=>e.voters/s.results.total_voters*100));oa(a);const o=document.createDocumentFragment();return s.results.results.forEach(((t,i)=>{if(!t.voters)return;const n=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const d=document.createElement("div");(0,c.Z)(d,(0,Zt.Z)(r.text));const h=document.createElement("div");h.innerText=Math.round(a[i])+"%",l.append(d,h);const u=gg.createChatList();u.classList.add("poll-results-voters"),gg.setListClickListener(u,(()=>{nn.onCloseBtnClick()}),void 0,!0),u.style.minHeight=50*Math.min(t.voters,4)+"px",o.append(n,l,u);let p,m=4,g=!1,f=t.voters-4;const y=()=>{g||(g=!0,this.managers.appPollsManager.getVotes(e,r.option,p,m).then((e=>{e.votes.forEach((e=>{const{dom:t}=gg.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()})),p&&(f-=e.votes.length,b.lastElementChild.replaceWith((0,v.ag)("PollResults.LoadMore",[Math.min(20,f)]))),p=e.next_offset,m=20,f&&e.votes.length||b.remove()})).finally((()=>{g=!1})))};if(y(),f<=0)return;const b=document.createElement("div");b.classList.add("poll-results-more","show-more","rp-overflow"),b.addEventListener("click",y),(0,we.Z)(b);const w=document.createElement("div");w.classList.add("tgico-down"),b.append(w,(0,v.ag)("PollResults.LoadMore",[Math.min(20,f)])),o.append(b)})),this.resultsDiv.append(n,o),nn.toggleSidebar(!0).then((()=>{})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}const sa="stacked-avatars";class na{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(sa),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("stacked-avatars-avatar-container"));let a=n.firstElementChild;a||(a=new Wm,a.classList.add("avatar-"+this.avatarSize,"stacked-avatars-avatar"),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()))}}let aa=0;const oa=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}}};s.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)}))})),d.Z.addEventListener("resize",(()=>{ua.setMaxLength(),ua.resizePolls()})),d.Z.addEventListener("changeScreen",(()=>{ua.setMaxLength()}));const ra=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),la===e&&ca===t&&da===i&&(la=ca=null,da=0)}),200)};let la,ca,da,ha=!1;class ua 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=as.width<=360?as.width-120:d.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,o=function*(){aa||(aa=document.getElementById("poll-line").getTotalLength(),ua.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 o=this.isMultiple?'':"",r=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${o}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${r}`,(0,c.Z)(this.firstElementChild,(0,Zt.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,c.Z)(t,(0,Zt.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,v.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 n=2,a=7,o=2*Math.PI*a,r=document.createElementNS("http://www.w3.org/2000/svg","circle");r.classList.add("poll-quiz-timer-circle"),r.setAttributeNS(null,"cx","16"),r.setAttributeNS(null,"cy","16"),r.setAttributeNS(null,"r",""+a),r.setAttributeNS(null,"stroke-width",""+n),i.append(r),this.descDiv.append(i);const l=1e3*e.close_period,c=1e3*(e.close_date-(yield s.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(c-e)/l,s=(c-e)/1e3+1|0;t.innerHTML=gt(s),s<=5&&(t.style.color="#ee545c",r.style.stroke="#ee545c"),r.style.strokeDashoffset=o+i*o,r.style.strokeDasharray=`${o} ${o}`,e>=c&&(clearInterval(this.quizInterval),t.innerHTML="",r.style.strokeDashoffset=o,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 l=document.createElement("div");l.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append((0,v.ag)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",l.append(this.viewResults,this.votersCountDiv),this.append(l),this.viewResults.addEventListener("click",(e=>{(0,a.Z)(e),nn.isTabExists(ia)||nn.createTab(ia).open(this.message)})),(0,we.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,v.ag)("Chat.Poll.SubmitVote")),(0,we.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,n.fc)(this.sendVoteBtn,(e=>{(0,a.Z)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then((()=>{this.chosingIndexes.length=0,this.answerDivs.forEach((e=>{e.classList.remove("is-chosing")}))}))})),l.append(this.sendVoteBtn));const d=!(e.chosenIndexes.length||this.isClosed);d&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),d&&(this.setVotersCount(t),(0,n.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{l(o.next(e))}catch(e){n(e)}}function r(e){try{l(o.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}l((o=o.apply(e,t||[])).next())}));var e,t,i,o}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,n.fc)(t,(i=>{(0,a.Z)(i),t.classList.add("active"),((e,t,i)=>{la&&ra(la,ca,da);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,c.Z)(a,(0,ii.Z)(e,{entities:t})),_m.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),la=s,ca=i,da=window.setTimeout((()=>{ra(s,i,da)}),gi.Z?5e3:7e3),ha||(ha=!0,_m.addEventListener("peer_changed",(()=>{la&&ra(la,ca,da)})))})(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,n.tH)(t)}}}clickHandler(e){const t=(0,r.Z)(e.target,"poll-answer");if(!t)return;(0,a.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 a,o;if(s.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(a=e.results)||void 0===a?void 0:a.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===(o=this.quizTimer)||void 0===o?void 0:o.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),(0,g.Z)(this.typeDiv,(0,v.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,n.fc)(this,this.clickHandler):(0,n.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&&Re(this,"",!this.isRetracted,340),(0,Be.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 na({avatarSize:16});i.render(t),(0,g.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,Be.T2)(e):e()}let n;e=e.slice(),oa(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,g.Z)(this.votersCountDiv,(0,v.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]*ua.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*ua.MAX_OFFSET)}}ua.MAX_OFFSET=-46.5,ua.MAX_LENGTH=0,customElements.define("poll-element",ua);var pa=i(2064);class ma{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function ga(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}const va=new Set(["all","web","webk"]),fa=new Set;function ya(e){return e.find((e=>va.has(e.platform)&&!fa.has(e.reason)))}function ba(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function wa(e){return!(!e.restriction_reason||(t=e.restriction_reason,!ya(t)));var t}var Sa=i(1346),Ca=i(2614);const La={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function Ia(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*=t.m,e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>v.ZP.format(La[e.type],!0,[e.duration])));return(0,v.v_)(e,!1,t)}const s=i.map((e=>(0,v.ag)(La[e.type],[e.duration]))),n=document.createElement("span");return n.append(...(0,v.v_)(s,!1)),n}const Ma={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:"3672990"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"؋",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8893",max_amount:"88930176"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11408",max_amount:"114088432"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"դր.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"41129",max_amount:"411293180"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"12503",max_amount:"125036607"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"145",max_amount:"1451625"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ман.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"171",max_amount:"1711164"},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:"187",max_amount:"1873042"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"৳",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"9415",max_amount:"94154281"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"лв.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"186",max_amount:"1869710"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"139",max_amount:"1399458"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"692",max_amount:"6926834"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"518",max_amount:"5182986"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"129",max_amount:"1290450"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"95",max_amount:"954630"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"926",max_amount:"9268013"},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:"669",max_amount:"6692902"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"410927",max_amount:"4109270000"},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:"69166",max_amount:"691668622"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kč",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2367",max_amount:"23674601"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"712",max_amount:"7120540"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5497",max_amount:"54971796"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"د.ج.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14655",max_amount:"146557782"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ج.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1879",max_amount:"18794601"},EUR:{code:"EUR",title:"Euro",symbol:"€",native:"€",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"95",max_amount:"957150"},GBP:{code:"GBP",title:"British Pound",symbol:"£",native:"£",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"82",max_amount:"822531"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"293",max_amount:"2939866"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"781",max_amount:"7811180"},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:"7845675"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2476",max_amount:"24763692"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"721",max_amount:"7210988"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"37819",max_amount:"378197939"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1490695",max_amount:"14906950000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"₪",native:"₪",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"348",max_amount:"3480155"},INR:{code:"INR",title:"Indian Rupee",symbol:"₹",native:"₹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"7894",max_amount:"78945050"},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:"133",max_amount:"1336303"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15175",max_amount:"151753529"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"¥",native:"¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"136",max_amount:"1362010"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"11787",max_amount:"117879251"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"7950",max_amount:"79509472"},KRW:{code:"KRW",title:"South Korean Won",symbol:"₩",native:"₩",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1297",max_amount:"12971249"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"₸",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47177",max_amount:"471777437"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ل.ل.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"152338",max_amount:"1523381760"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"රු.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"36271",max_amount:"362713465"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"د.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1018",max_amount:"10188182"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1928",max_amount:"19284237"},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:"312408",max_amount:"3124087599"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4614",max_amount:"46144273"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1534",max_amount:"15349670"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2015",max_amount:"20158770"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"440",max_amount:"4406499"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6383",max_amount:"63830365"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"₦",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"41513",max_amount:"415132815"},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:"3612",max_amount:"36125609"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"990",max_amount:"9902585"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"नेरू",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12731",max_amount:"127318435"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"160",max_amount:"1603695"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"100",max_amount:"1007566"},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:"381",max_amount:"3818809"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"₱",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5499",max_amount:"54994501"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"₨",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"20651",max_amount:"206515440"},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:"446",max_amount:"4466920"},PYG:{code:"PYG",title:"Paraguayan Guaraní",symbol:"PYG",native:"₲",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6909",max_amount:"69095662"},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:"3640988"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"473",max_amount:"4736501"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"дин.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11252",max_amount:"112520089"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"руб.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"5282",max_amount:"52825030"},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:"3752099"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1022",max_amount:"10224070"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"139",max_amount:"1390698"},THB:{code:"THB",title:"Thai Baht",symbol:"฿",native:"฿",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3529",max_amount:"35290499"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"977",max_amount:"9773409"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1667",max_amount:"16673549"},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:"684",max_amount:"6847347"},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:"2973",max_amount:"29735499"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233200",max_amount:"2332000087"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"₴",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"2974",max_amount:"29741945"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3788",max_amount:"37883728"},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:"3979",max_amount:"39794286"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1094209",max_amount:"10942099215"},VND:{code:"VND",title:"Vietnamese Đồng",symbol:"₫",native:"₫",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23270",max_amount:"232700000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ر.ي.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25024",max_amount:"250249914"},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:"1624",max_amount:"16246189"}};function Ea(e,t,i){const s=(e=+e)<0,n=Ma[t];if(!n)throw new Error("CURRENCY_WRAP_INVALID");const a=e/Math.pow(10,n.exp);let o=n.exp;"IRR"==t&&Math.floor(a)==a&&(o=0);let r=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,l="";return l=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."),l[0].length>3&&(l[0]=l[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(l[1]||"").lengthTa(this,void 0,void 0,(function*(){return t?(0,Rt.Z)(e,t):new Ot({peerId:e}).element}));switch(a._){case"messageActionPhoneCall":l+="."+a.type,r=[Ia(a.duration,t)];break;case"messageActionGroupCall":l+="."+a.type,r=[],l.endsWith("You")||e.pFlags.post||r.push(d(e.fromId,t)),void 0!==a.duration?r.push(Ia(a.duration,t)):r.push(ka(e));break;case"messageActionInviteToGroupCall":{const i=[e.fromId,a.users[0].toPeerId()];let n="Chat.Service.VoiceChatInvitation";const l=s.Z.myId;i[0]===l?n+="ByYou":i[1]===l&&(n+="ForYou"),(0,T.Z)(i,l),o=n,r=i.map((e=>d(e,t))),r.push(ka(e));break}case"messageActionGroupCallScheduled":{const i=new Date,n=new Date(1e3*a.schedule_date),l=(n.getTime()-i.getTime())/864e5,h=new Date(i);h.setDate(h.getDate()+1);const u=yield c.appPeersManager.isBroadcast(e.peerId);o=u?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",r=[];const p=s.Z.myId;let m;e.fromId===p?o+="You":u||r.push(d(e.fromId,t));const g=[];l<1&&n.getDate()===i.getDate()?m="TodayAtFormattedWithToday":l<2&&n.getDate()===h.getDate()?m="Time.TomorrowAt":(m="formatDateAtTime",g.push(new v.ZP.IntlDateElement({date:n,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),g.push(V(n));const f=(0,v.ag)(m,g);r.push(f);break}case"messageActionChatCreate":{const i=s.Z.myId;e.fromId===i?l+="You":r=[d(e.fromId,t)];break}case"messageActionPinMessage":{const i=e.peerId,s=yield c.appMessagesManager.getMessageByPeer(i,e.reply_to_mid);r=[d(e.fromId,t)],s?r.push(xa(s,t)):(o="ActionPinnedNoText",e.reply_to_mid&&c.appMessagesManager.fetchMessageReplyTo(e));break}case"messageActionChatJoinedByRequest":{const i=yield c.appPeersManager.isBroadcast(e.peerId);e.pFlags.out?o=i?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=i?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",r=[d(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":r=[d(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":r=[],"messageActionChatEditTitle"===a._&&r.push(d(e.fromId,t)),r.push(t?a.title:(0,Ca.Z)((0,Zt.Z)(a.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const i=a.users||[a.user_id];if(r=[d(e.fromId,t)],i.length>1){const e=(0,v.v_)(yield Promise.all(i.map((e=>d(e.toPeerId(),t)))),!1,t);if(t)r.push(...e);else{const t=document.createElement("span");t.append(...e),r.push(t)}}else r.push(d(i[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=(0,ii.Z)(a.domain,{entities:[{_:"messageEntityUrl",length:a.domain.length,offset:0}]});r=[(0,Ca.Z)(e)];break}case"messageActionPaymentSent":{const s=a.pFlags.recurring_init,n=a.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",r=[Ea(a.total_amount,a.currency),d(e.peerId,t)],e.reply_to_mid){const a=yield c.appMessagesManager.getMessageByPeer((null===(i=e.reply_to)||void 0===i?void 0:i.reply_to_peer_id)?(0,es.Z)(e.reply_to.reply_to_peer_id):e.peerId,e.reply_to_mid);a?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",r.push(xa(a,t).then((e=>(e.classList.add("is-receipt-link"),e))))):c.appMessagesManager.fetchMessageReplyTo(e)}break}default:o=v.Hz[l]||`[${a._}]`}o||(o=v.Hz[l],void 0===o&&(o="["+l+"]"));const h=r&&(yield Promise.all(r));return t?v.ZP.format(o,!0,h):(0,v.$d)(n,o,h)}}))}(e,t)}catch(e){return console.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(i,n||[])).next())}));var i,n,a,o}function Aa(e,t=e.message,i,n,a,o){return r=this,l=void 0,d=function*(){const r=[];let l=!1;const c=(e,t)=>{if(e){if(void 0===t&&l)return;t=n?v.ZP.format(e,!0):(0,v.ag)(e)}if(n)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}},d=s.Z.managers.appMessagesManager,h=wa(e);let u=e.totalEntities;if(e.media&&!h){(0,ai.Z)(e);let s=!0;if(e.grouped_id){if(i){const t=yield d.getMidsByMessage(e);if(i.length===t.length){for(const e of t)if(!i.includes(e)){s=!1;break}}else s=!1}if(s){const i=yield d.getAlbumText(e.grouped_id);t=i.message,u=i.totalEntities,o||(c("AttachAlbum"),l=!0)}}else s=!1;if(!s&&!o||!t){const i=e.media;switch(i._){case"messageMediaPhoto":c("AttachPhoto");break;case"messageMediaDice":c(void 0,n?i.emoticon:(0,Zt.Z)(i.emoticon));break;case"messageMediaVenue":t=i.title,c("AttachLocation");break;case"messageMediaGeo":c("AttachLocation");break;case"messageMediaGeoLive":c("AttachLiveLocation");break;case"messageMediaPoll":const e="📊 "+(i.poll.question||"poll");c(void 0,n?e:(0,Zt.Z)(e));break;case"messageMediaContact":c("AttachContact");break;case"messageMediaGame":{const e="🎮 "+i.game.title;c(void 0,n?e:(0,Zt.Z)(e));break}case"messageMediaDocument":{const e=i.document;if("video"===e.type)c("AttachVideo");else if("voice"===e.type)c("AttachAudio");else if("gif"===e.type)c("AttachGif");else if("round"===e.type)c("AttachRound");else if("sticker"===e.type){const i=r.length;if(e.stickerEmojiRaw){const t=e.stickerEmojiRaw+" ";c(void 0,n?t:(0,Zt.Z)(t))}c("AttachSticker");const s=r.splice(i,2);if(n)r.push(s[0]+s[1]);else{const e=window.document.createElement("span");e.append(...s),r.push(e)}t=""}else if("audio"===e.type){const t=e.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);c(void 0,n?i:(0,Zt.Z)(i))}else c(void 0,n?e.file_name:(0,Zt.Z)(e.file_name));break}case"messageMediaInvoice":c(void 0,n?i.title:(0,Zt.Z)(i.title));break;case"messageMediaUnsupported":c(v.nK)}}const a=r.length;for(let e=1;e{m&&!m()||(p.forEach((e=>e.remove())),r&&r.classList.toggle("is-round",u))})),h}))}class Ra extends ma{constructor(e){super(e,((e,t="",i)=>Za(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const s=yield Da({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:i});this.container.classList.toggle("is-media",s),s?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e}}function Ba(e,t,i,s){const n=new Ra("reply"),a=n.fill(e,t,i);if(s){const e=Rs(s,!1),[t,i,a]=(0,pa.oo)(e);n.container.style.setProperty("--override-color",`${t}, ${i}, ${a}`),n.container.classList.add("is-overriding-color")}return{container:n.container,fillPromise:a}}var Na=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Ua({set:e,lazyLoadQueue:t,container:i,group:n,autoplay:a,width:o,height:r,managers:l=s.Z.managers}){var c;return Na(this,void 0,void 0,(function*(){if(null===(c=e.thumbs)||void 0===c?void 0:c.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>Na(this,void 0,void 0,(function*(){const t=yield l.appStickersManager.getStickerSetThumbDownloadOptions(e),s=u.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return s.then((t=>{hi.Z.loadAnimationWorker({container:i,loop:!0,autoplay:a,animationData:t,width:o,height:r,needUpscale:!0,name:"setThumb"+e.id},n)}));{let t;return e.pFlags.videos?(t=ut(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),s.then((s=>{Ae(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&p.Z.addAnimation(t,n)}))}))}}))});const s=l.appStickersManager.getStickerSet(e),d=yield s;"documentEmpty"!==d.documents[0]._&&ta({doc:d.documents[0],div:i,group:n,lazyLoadQueue:t,managers:l,width:o,height:r})}))}function Oa({doc:e,row:t,size:i,managers:s}){const n=t.media,a=t.createMedia("small");n&&a.classList.add("hide");const o=n?[]:void 0,r="small"===i?32:48,l=ta({div:a,doc:e,width:r,height:r,loadPromises:o,managers:s}).then((({render:e})=>e));return o&&Promise.all(o).then((()=>{a.classList.remove("hide"),n.remove()})),l}var Ha=i(6519);class za{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=(0,Ti.k)(),(0,x.Z)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id,!0)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{if(!t()||void 0!==i&&!i)return e(!1);this._updateList(),e(!0)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,i,s=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,s,n,i),n}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=!1,i=this.get(e),s){return n=this,a=void 0,r=function*(){if(!i)return;i.index=yield this.getIndex(i),this.onUpdate&&this.onUpdate(i);const e=(0,Ha.Z)(this.sorted,i,"index");if(!t&&this.onSort){const t=this.middleware.get();(s||this.updateElementWith)((()=>{t()&&this.onSort(i,e)}))}},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function s(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}l((r=r.apply(n,a||[])).next())}));var n,a,o,r}}var Ga=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Va extends za{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=>Ga(this,void 0,void 0,(function*(){const t=ce(yield this.managers.appUsersManager.getUser(e.id));(0,g.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;Ln(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=gg.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:Be.T2,updateListWith:e=>Ga(this,void 0,void 0,(function*(){return(0,Ne.Z)(this.list)?(yield(0,He.e9)(),(0,Ne.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,(0,x.Z)(this,e),this.list=gg.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),Va.SORT_INTERVAL)};i()}}Va.SORT_INTERVAL=3e4;var Ka=i(3444);function Wa(e){let t=!1;return new Ks(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,r.Z)(t.target,"progress-line")&&!(0,Ka.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,n)=>{if(!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,a.Z)(n),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function $a(e){return Wa(Object.assign(Object.assign({},e),{onSwipe:(t,i,s)=>{if(Math.abs(t)>50)return e.onSwipe(t,i,s),Zi(),!0}}))}class ja extends ms{constructor(e,t,i=!1){super({peerTypes:["dialogs","contacts"],onSelect:i?t:i=>{return s=this,n=void 0,o=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}_m.setInnerPeer({peerId:i}),_m.chat.input.initMessagesForward(e)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}var qa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Qa{constructor(e,t,i,s){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.construct()}construct(){return qa(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:n}=this;const a=new Ot({peerId:e}).element,o=A.Z.MANAGERS;t=t.slice();const r=(s,a)=>{n&&n(),"scheduled"===i?o.appMessagesManager.deleteScheduledMessages(e,t):o.appMessagesManager.deleteMessages(e,t,!!s.size||a)},l=[{langKey:"Delete",isDanger:!0,callback:r}],c=[];let d,h,u,p;if(1===t.length?d="DeleteSingleMessagesTitle":(d="DeleteMessagesTitle",h=[(0,v.ag)("messages",[t.length])]),u=(yield o.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())c.push({text:"DeleteMessagesOptionAlso",textArgs:[a]});else{const i=yield o.appChatsManager.getChat(e.toChatId()),n=(0,Xi.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield ki(t,(t=>qa(this,void 0,void 0,(function*(){return(yield o.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?c.push({text:"DeleteForAll"}):(c.push({text:"DeleteMessagesOption"}),u="DeleteMessagesTextGroup",p=[(0,v.ag)("messages",[i.length])]))}else l[0].callback=e=>r(e,!0)}(0,A.x)(l),new qi("popup-delete-chat",{peerId:e,titleLangKey:d,titleLangArgs:h,descriptionLangKey:u,descriptionLangArgs:p,buttons:l,checkboxes:c}).show()}))}}class Ya extends qi{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()}}function Ja(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var Xa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const eo=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class to extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,r.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,o=t;const l=(e,t=!0)=>{const n=+e.dataset.mid;if(!n||!e.dataset.peerId)return;const a=e.dataset.peerId.toPeerId();(0,Ne.Z)(o)||(o=e);let r=i.get(a);if(r||i.set(a,r=new Set),r.has(n))return;const c=this.isMidSelected(a,n);if(void 0===s&&(s=!c),r.add(n),s&&!c||!s&&c){const s=eo(i);if(this.toggleByElement&&t){s<2&&(0,vi.Z)(e,o)&&(o=e);const t=this.getElementsBetween(o,e);t.length&&t.forEach((e=>{l(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 c=!1;const d=e=>{c||(Ja(),c=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",d),void this.listenerSetter.removeManual(document,"mouseup",h,u)):void l(t)},h=e=>{i.size&&(0,n.fc)(window,a.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",d),Ja()},u={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",d),this.listenerSetter.add(document)("mouseup",h,u)},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,r.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let l=o.indexOf(e),c=o.indexOf(t);return n||([c,l]=[l,c]),o.slice(l+1,c)},this.cancelSelection=e=>Xa(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),Ja(),e&&(this.doNotAnimate=void 0)})),(0,x.Z)(this,e),this.navigationType="multiselect-"+(0,Hi.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return gi.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void Fi(e,(t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,a.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),Ja();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)}),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 ji.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(),Re(e,"is-selected",!1,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){return Xa(this,void 0,void 0,(function*(){const t=this.selectedMids.size;if(!t&&!e)return;let i=!t,s=!t;const n=!t;for(const[e,t]of this.selectedMids){const n=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(n,Array.from(t));if(i=a.cantForward,s=a.cantDelete,i&&s)break}this.onUpdateContainer&&this.onUpdateContainer(i,s,n)}))}toggleSelection(e=!0,t=!1){const i=this.isSelecting,s=this.selectedMids.size;if(this.isSelecting=!!s||t,i===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),gi.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),i&&Ja()),(0,ln.Z)();const n=!!s||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),Je.IS_MOBILE_SAFARI||(n?C.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):C.Z.removeByType(this.navigationType)),t&&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(),Re(e,"is-selected",t,200)}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return eo(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 io extends to{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,r.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,g.Z)(this.selectionCountEl,(0,v.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(Re(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,(()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)})),Re(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=E(`close ${e}-cancel`,{noRipple:!0});(0,n.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=E(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,n.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),_m.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=E(`forward ${e}-forward`),(0,n.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new ja(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=E(`delete danger ${e}-delete`),(0,n.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new Qa(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 so extends to{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,r.Z)(e,"grouped-item")||(0,r.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,r.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)=>Xa(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>Xa(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:a}=yield this.chat.input.center(t);Re(this.listenElement,"is-selecting",e,t?200:0,(()=>{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 o=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,M.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,v.ag)("MessageScheduleSend")),(0,n.fc)(this.selectionSendNowBtn,(()=>{new Ya(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,M.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,v.ag)("Forward")),(0,n.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new ja(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,M.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,v.ag)("Delete")),(0,n.fc)(this.selectionDeleteBtn,(()=>{new Qa(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!==o&&(i.style.transform=`translateX(${-o}px)`,s.style.transform=`translateX(${o}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!==o&&(this.selectionLeft.style.transform=`translateX(-${o}px)`,this.selectionRight.style.transform=`translateX(${o}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,g.Z)(this.selectionCountEl,(0,v.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>Xa(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("bubble-first")||e.classList.contains("avoid-selection"))}}var no=i(7401);function ao(e){const t=(0,Dt.Z)(e.description||"",150,180);return(0,ii.Z)(t)}function oo(e){let t=e.title||e.author||e.site_name||"";return t=(0,Dt.Z)(t,80,100),(0,ii.Z)(t,{noLinks:!0,noLinebreaks:!0})}var ro=i(2342),lo=i(6566),co=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class ho{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{_m.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,n.tH)(this.searchSuper.selection.selectionForwardBtn):new ja({[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,n.tH)(this.searchSuper.selection.selectionDeleteBtn):new Qa(this.peerId,[this.mid],"chat")},this.managers=t.managers;gi.Z||Fi(e,(e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,r.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),(()=>{co(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=>co(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"),xi(e,this.element),Ii.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}}),i)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>co(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:()=>co(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=Ei(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class uo{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new ye,this.middleware=(0,Ti.k)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,he.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,x.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new I.Z,this.searchContextMenu=new ho(this.container,this,this.listenerSetter),this.selection=new io(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 m.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,v.ag)(e.name)),i.append(s),t.append(i),(0,we.Z)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let o;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),gi.Z&&(this.swipeHandler=$a({element:this.tabsContainer,onSwipe:(e,t,i)=>{const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let r;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){r=e;break}void 0!==r&&(o=function(e){const t=e=>{(0,a.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(r))}}));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 f(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,ue.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),o&&(o(),o=void 0),this.onTransitionEnd()}),void 0,i,this.listenerSetter),(0,n.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,a.Z)(e),this.selection.toggleByElement((0,r.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>co(this,void 0,void 0,(function*(){const n=(0,r.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.dataset.peerId.toPeerId(),l=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,r.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),c=l.findIndex((e=>e.mid===a&&e.peerId===o)),d=yield this.managers.appMessagesManager.getMessageByPeer(o,a);(new Rm).setSearchContext(this.copySearchContext(i)).openMedia(d,l[c].element,0,!1,l.slice(0,c),l.slice(c+1))}));(0,n.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,n.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,He.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,lo.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],{dom:s}=gg.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:54,loadPromises:i}),n=gg.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dom:s,highlightWord:this.searchContext.query});return i.push(n),Promise.all(i)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return co(this,void 0,void 0,(function*(){const s=(0,Se.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=Le(s,200,200);return a="photo"!==s._?yield(yield qt({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:o})).thumb:yield dt({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),[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 co(this,void 0,void 0,(function*(){const i=(0,Se.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield ti({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 co(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,ro.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)}const a=document.createElement("div");a.classList.add("preview","row-media"),n.photo?dt({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:Le(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,c.Z)(a,Bs(n.title||n.display_url||n.description||n.url,!0)));const o=oo(n),r=ao(n),l=ga((0,ii.Z)(n.url||"")).firstElementChild;if(l instanceof HTMLAnchorElement)try{l.innerText=decodeURIComponent(l.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(l),this.showSender&&r.append("\n",yield Ht(e)),o.textContent||o.append((0,Xt.Z)(n.display_url.split("/",1)[0]));const d=new Ni({title:o,titleRight:zt(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});if(d.container.append(a),d.container.innerText.trim().length)return{message:e,element:d.container}}))}performSearchResult(e,t,i=!0){return co(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield(0,He.e9)(),"inputMessagesFilterPhotoVideo"===l&&this.searchContext.query.trim()?(l="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===l&&(r=this.searchGroups.messages);const c={elemsToAppend:s,inputFilter:l,message:void 0,middleware:o,promises:a,searchGroup:r};let d;switch(l){case"inputMessagesFilterEmpty":d=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":d=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":d=this.processDocumentFilter;break;case"inputMessagesFilterUrl":d=this.processUrlFilter}if(d){d=d.bind(this);const t=e.map((e=>co(this,void 0,void 0,(function*(){try{return c.message=e,yield d(c)}catch(t){this.log.error("error rendering filter",l,c,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i.filter(Boolean))}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,l);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"===l?1:e.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 a=(t,n,a=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=gg.addDialogNew({peerId:t,container:n.list,avatarSize:48,autonomous:n.autonomous});return{dom:i,peerId:t}})).forEach((({dom:e,peerId:t})=>co(this,void 0,void 0,(function*(){const n=yield this.managers.appPeersManager.getPeer(t);if(a&&(n.participants_count||n.participants)){const s=new RegExp(`(${ba(i)}|${ba((0,Yt.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield cs(t.toChatId()))}else if(t===s.Z.myId)e.lastMessageSpan.append((0,v.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,Ms.u)(e.phone).formatted)}e.lastMessageSpan.innerHTML=""+i+""}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0).then(o).then((e=>{e&&a(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(a(e.my_results,this.searchGroups.contacts,!0),a(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 v.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,n.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.appMessagesManager.getConversations(i,0,20,0).then(o).then((e=>{e&&a(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>Gi.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.innerHTML="",i.recentSearch.slice(0,20).forEach((e=>co(this,void 0,void 0,(function*(){const{dom:t}=gg.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:48,autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?ce(yield this.managers.appUsersManager.getUser(e.toUserId())):cs(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===s.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.length&&e.forEach((e=>{gg.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:54,autonomous:!1,noIcons:this.searchGroups.people.noIcons})})),this.searchGroups.people.setActive()})),e()])}}loadMembers(e){return co(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let s;const a=t=>co(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new Va({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,n.fc)(this.membersList.list,(e=>{const t=(0,l.Z)(e.target,dg);if(!t)return;const i=t.dataset.peerId.toPeerId();let s=Promise.resolve();d.Z.isMobile&&(s=nn.toggleSidebar(!1)),s.then((()=>{_m.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,rs.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const n=this.membersList?200:50;s=this.managers.appProfileManager.getChannelParticipants(t,void 0,n,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const s=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(s?s.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]=s.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n;const a=e.inputFilter;if(this.loadPromises[a])return this.loadPromises[a];if("members"===e.type)return this.loadMembers(e);const o=null!==(n=this.historyStorage[a])&&void 0!==n?n:this.historyStorage[a]=[];if(!("inputMessagesFilterEmpty"!==a||o.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[a]=!0,Promise.resolve();const r=this.loadPromises[a]=Promise.resolve().then((()=>co(this,void 0,void 0,(function*(){var n,l;if(o.length&&this.usedFromHistory[a]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(r,a))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const c=o.length?o[o.length-1].mid:0,d=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:a},maxId:c,limit:i,nextRate:null!==(n=(l=this.nextRates)[a])&&void 0!==n?n:l[a]=0}));if(o.push(...d.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((d.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(d.history,a),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[a]=null}));return r}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),s=i.map((e=>({_:e.inputFilter}))),[n,a]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,s),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let o,r=0;i.forEach((e=>{const t=n.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&(void 0===o&&(o=e),++r)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!a),a&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),this.navScrollableContainer.classList.toggle("hide",r<=1))}))}load(e=!1,t=!1){var i;return co(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,ge.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(as.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 v.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(i,l);const c=(0,no.Z)(a,"desc");let d=0;for(;dc[d]);++d);a[n]={container:e,items:l},Ln(e,this.tabs[t],d)}return a[n]}canViewMembers(){return Promise.all([this.searchContext.peerId.isAnyChat(),this.managers.appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()),this.managers.appChatsManager.hasRights(this.searchContext.peerId.toChatId(),"view_participants")]).then((([e,t,i])=>e&&!t&&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.urlsToRevoke.length&&(this.urlsToRevoke.forEach((e=>{URL.revokeObjectURL(e)})),this.urlsToRevoke.length=0),this.mediaTabs.forEach((e=>{if(e.contentTab.innerHTML="",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,be.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,Ji.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.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}}const po=(e,t,i,s)=>{((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(n.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const n=e.querySelector(".btn-menu");if((0,a.Z)(i),e.classList.contains("menu-open"))Ii.close();else{const e=t&&t(i),a=()=>{Ii.openBtnMenu(n,s)};e instanceof Promise?e.then(a):a()}}))},mo=(e={},t,i,s,n)=>{var a;e.asDiv=!0;const o=null!==(a=e.container)&&void 0!==a?a:E("more",e);o.classList.add("btn-menu-toggle");const r=Ei(i,e.listenerSetter);return r.classList.add(t),po(o,s,e,n),o.append(r),o};function go(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}}var vo;!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(vo||(vo={}));const fo=vo;class yo{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,g.Z)(i,t):(0,v.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===fo.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===fo.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new Br({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:fo.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:fo.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:fo.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,Hi.a)();i.forEach((({type:e,langKey:t})=>{const i=new Ni({radioField:new Vi({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=Ui([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=Nr(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 Ni(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(Ts).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=go(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 fo.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case fo.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case fo.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"))return;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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((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,v.v_)([e.users.length?(0,v.ag)("Users",[e.users.length]):null,e.chats.length?(0,v.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,v.ag)("PrivacySettingsController.AddUsers")]}}class bo extends k{init(){return e=this,t=void 0,s=function*(){this.header.classList.add("with-border"),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,v.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,v.ag)("PrivacyPhoneInfo4"),document.createElement("br"),function(e={}){const t=document.createElement("a");if(t.classList.add("anchor-copy"),e.mePath){const i="https://t.me/"+e.mePath;t.href=t.innerText=i}return(0,n.fc)(t,(e=>{(0,a.Z)(e),Oi(t.href),Li({langPackKey:"LinkCopied"})})),t}({mePath:e}));const i=new yo({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{o.setRadio(fo.Everybody),o.radioSection.container.classList.toggle("hide",e!==fo.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",o=new yo({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[fo.Nobody],managers:this.managers});this.scrollable.container.insertBefore(o.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}function wo({emoji:e,div:t,width:i,height:n,managers:a=s.Z.managers}){return o=this,r=void 0,c=function*(){const s=yield a.appStickersManager.getAnimatedEmojiSticker(e);if(!s)throw t.classList.add("media-sticker-wrapper"),new Error("no sticker");return ta({doc:s,div:t,emoji:e,width:i,height:n,loop:!1,play:!0})},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(o,r||[])).next())}));var o,r,l,c}class So extends P{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new Br({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");wo({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 a=(0,M.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,n.fc)(a,(e=>{this.close()})),this.slider.sliceTabsUntilTab(Ir,this),s.append(a),i.append(s),this.scrollable.container.append(e.container)}}var Co=i(4489);function Lo(e){return!Je.IS_MOBILE_SAFARI||!e}class Io extends P{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 Br({captionOld:!0,noDelimiter:!0});(0,v.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");wo({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 a=this.codeInputField=new Co.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{c(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{l()})).catch((e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),(0,g.Z)(a.label,(0,v.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),(0,g.Z)(a.label,(0,v.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}c(!1)}))}}),o=(0,M.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=(0,M.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),l=()=>{this.slider.createTab(So).open()},c=e=>{(0,mi.Z)([a.input,o,r],e)};(0,n.fc)(o,(e=>{c(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab(Po,this),this.close()}),(()=>{c(!1)}))})),(0,n.fc)(r,(e=>{c(!0);const t=(0,be.y)(r);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),c(!1)}))})),s.append(a.container,o,r),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Lo(this.isFirst)&&this.codeInputField.input.focus()}}var Mo=i(2423);function Eo(e){return e?e.match(Mo.E):null}class Po extends P{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new Br({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");wo({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 o=this.inputField=new b.Z({name:"recovery-email",label:"RecoveryEmail",plainText:!0});o.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,a.Z)(e),d()})),o.input.addEventListener("input",(e=>{o.input.classList.remove("error")}));const r=(0,M.Z)("btn-primary btn-color-primary",{text:"Continue"}),l=(0,M.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),c=()=>{this.slider.createTab(So).open()},d=()=>{const e=o.value.trim(),t=Eo(e);if(!t||t[0].length!==e.length)return void o.input.classList.add("error");h(!0);const i=(0,be.y)(r);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{c()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(Io);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);h(!1),i.remove()}))};(0,n.fc)(r,d);const h=e=>{e?(r.setAttribute("disabled","true"),l.setAttribute("disabled","true")):(r.removeAttribute("disabled"),l.removeAttribute("disabled"))};(0,n.fc)(l,(e=>{new qi("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{h(!0),(0,be.y)(l),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{c()}),(e=>{h(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(o.container,r,l),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Lo(this.isFirst)&&this.inputField.input.focus()}}var ko=i(4425),To=i(6830),xo=i(3083);class _o extends P{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new Br({noDelimiter:!0}),t=document.createElement("div");wo({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 b.Z({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,a.Z)(e),s.value?c():d()}));const o=(e,t)=>{e&&(0,a.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void Ci(v.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab(Po);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},r=(0,M.Z)("btn-primary btn-color-primary",{text:"Continue"}),l=(0,M.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),c=e=>o(e,!0),d=e=>o(e,!1);(0,n.fc)(r,c),(0,n.fc)(l,d),i.append(s.container,r,l),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class Ao extends P{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 Br({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new To.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new xo.Z(i,157),o=(0,M.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,o),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(b.I.Neutral),"Enter"===e.key)return l()}));const r=()=>this.newPassword===i.value||(i.setError(),!1),l=e=>{if(e&&(0,a.Z)(e),!r())return;const t=this.slider.createTab(_o);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,n.fc)(o,l),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class Zo extends P{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 Br({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new To.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Zt.Z)(this.state.hint):void 0}),o=new ko.Z(s,157),r=(0,M.Z)("btn-primary btn-color-primary"),l=new v.ZP.IntlElement({key:"Continue"});r.append(l.element),i.append(s.container,r),t.content.append(o.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),l.key="Continue",l.update()),"Enter"===e.key)return h()}));const d=()=>!!s.value.length||(s.input.classList.add("error"),!1);let h;if(e)h=e=>{if(e&&(0,a.Z)(e),!d())return;const t=this.slider.createTab(Ao);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,c.Z)(s.label,(0,Zt.Z)(this.state.hint)):(0,g.Z)(s.label,(0,v.ag)("LoginPassword"))})));h=i=>{if(!d())return void(0,a.Z)(i);r.setAttribute("disabled","true"),l.key="PleaseWait",l.update();const n=(0,be.y)(r),c=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),o&&o.remove();const t=this.slider.createTab(Fo);t.state=this.state,t.plainPassword=c,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{r.removeAttribute("disabled"),s.input.classList.add("error"),e.type,l.key="PASSWORD_HASH_INVALID",l.update(),n.remove(),s.select(),t()}))},t()}return(0,n.fc)(r,h),o.load()}onOpenAfterTimeout(){Lo(this.isFirst)&&this.passwordInputField.input.focus()}}class Fo extends P{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new Br({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");wo({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,v.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,M.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,M.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),a=(0,M.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,n.fc)(t,(()=>{const e=this.slider.createTab(Zo);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,n.fc)(s,(()=>{new qi("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(Ir,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,n.fc)(a,(()=>{const e=this.slider.createTab(Po);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,a)}else{(0,v.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,M.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,n.fc)(s,(e=>{const t=this.slider.createTab(Zo);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class Do extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new yo({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class Ro extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new yo({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[fo.Nobody],managers:this.managers})}}class Bo extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new yo({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class No extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new yo({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[fo.Nobody],managers:this.managers})}}class Uo extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new yo({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 yo({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}class Oo extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new Ni({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:H(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const i=document.createElement("div");return i.classList.add("row-midtitle"),i.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(i,t.subtitle),t},t=this.authorizations.slice();{const a=new Br({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),o=(0,ge.Z)(t,(e=>e.pFlags.current)),r=e(o);if(a.content.append(r.container),t.length){const e=(0,M.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,n.fc)(e,(t=>{new qi("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,mi.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()})),a.content.append(e)}this.scrollable.append(a.container)}if(!t.length)return;const i=new Br({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&&Ci(v.ZP.format("RecentSessions.Error.FreshReset",!0))};let a;const o=()=>{const e=a.dataset.hash;new qi("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&a.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},l=this.menuElement=Ei([{icon:"stop",text:"Terminate",onClick:o}]);l.id="active-sessions-contextmenu",l.classList.add("contextmenu"),document.getElementById("page-chats").append(l),Fi(this.scrollable.container,(e=>{a=(0,r.Z)(e.target,"row"),a&&"0"!==a.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),xi(e,l),Ii.openBtnMenu(l))})),(0,n.fc)(this.scrollable.container,(e=>{a=(0,r.Z)(e.target,"row"),a&&"0"!==a.dataset.hash&&o()}))}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Ho extends P{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new Br({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=D({icon:"add",className:"is-visible"});this.content.append(t),(0,n.fc)(t,(e=>{new ms({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=gg.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const a=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=gg.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:48,append:t}),n=yield this.managers.appUsersManager.getUser(e);n.pFlags.bot?s.lastMessageSpan.append("@"+n.username):n.phone?s.lastMessageSpan.innerHTML=Es(n.phone):s.lastMessageSpan.append(n.username?"@"+n.username:ce(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)a(e,!0);let o;const r=this.menuElement=Ei([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=o.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);r.id="blocked-users-contextmenu",r.classList.add("contextmenu"),document.getElementById("page-chats").append(r),Fi(this.scrollable.container,(e=>{o=(0,l.Z)(e.target,dg),o&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),xi(e,r),Ii.openBtnMenu(r))}),this.listenerSetter),this.listenerSetter.add(s.Z)("peer_block",(e=>{const{peerId:t,blocked:s}=e,n=i.querySelector(`[data-peer-id="${t}"]`);s?n||a(t,!1):n&&n.remove()}));let c=!1;this.scrollable.onScrolledBottom=()=>{c||(c=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)a(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{c=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}function zo(e){return"input"+(e[0].toUpperCase()+e.slice(1))}class Go extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const e="Loading";{const t=new Br({noDelimiter:!0,caption:"SessionsInfo"});let i;const n=new Ni({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:e,clickable:()=>{const e=this.slider.createTab(Ho);e.peerIds=i,e.open()},listenerSetter:this.listenerSetter});let a;n.freezed=!0;const o={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:e,clickable:e=>{let t;a.pFlags.has_password?t=this.slider.createTab(Zo):a.email_unconfirmed_pattern?(t=this.slider.createTab(Io),t.email=a.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(Fo),t.state=a,t.open()},listenerSetter:this.listenerSetter},r=new Ni(o);r.freezed=!0;const l=this.activeSessionsRow=new Ni({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:e,clickable:()=>{const e=this.slider.createTab(Oo);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});l.freezed=!0,t.content.append(n.container,r.container,l.container),this.scrollable.append(t.container);const c=e=>{e?(0,g.Z)(n.subtitle,(0,v.ag)("PrivacySettingsController.UserCount",[e])):(0,g.Z)(n.subtitle,(0,v.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(s.Z)("peer_block",(()=>{d()}));const d=()=>{this.managers.appUsersManager.getBlocked().then((e=>{n.freezed=!1,c(e.count),i=e.peerIds}))};d(),this.managers.passwordManager.getState().then((e=>{a=e,(0,g.Z)(r.subtitle,(0,v.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),r.freezed=!1})),this.updateActiveSessions()}{const t=new Br({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});t.content.classList.add("privacy-navigation-container");const i={},n=i.inputPrivacyKeyPhoneNumber=new Ni({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(bo).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new Ni({titleLangKey:"LastSeenTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Do).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new Ni({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Ro).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new Ni({titleLangKey:"WhoCanCallMe",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Uo).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyForwards=new Ni({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:e,clickable:()=>{this.slider.createTab(Bo).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyChatInvite=new Ni({titleLangKey:"WhoCanAddMe",subtitleLangKey:e,clickable:()=>{this.slider.createTab(No).open()},listenerSetter:this.listenerSetter}),d=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=go(e),s=i.type===fo.Everybody?"PrivacySettingsController.Everbody":i.type===fo.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,v.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};t.content.append(n.container,a.container,o.container,r.container,l.container,c.container),this.scrollable.append(t.container);for(const e in i)d(e);s.Z.addEventListener("privacy_update",(e=>{d(zo(e.key._))}))}const t=[];{const e=new Br({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),i=new ji.Z({text:"ArchiveAndMute"}),n=new Ni({checkboxField:i,noCheckboxSubtitle:!0});let a,o;e.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{o=!0,void 0!==a&&this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:i.checked})}),{once:!0});const r=Promise.all([this.managers.apiManager.getAppConfig(),this.managers.appPrivacyManager.getGlobalPrivacySettings()]).then((([t,n])=>{if(o)return;const r=i=>{e.container.classList.toggle("hide",!i&&!t.autoarchive_setting_available)};this.listenerSetter.add(s.Z)("premium_toggle",r),r(s.Z.premium),a=n.archive_and_mute_new_noncontact_peers,i.setValueSilently(a)}));t.push(r),this.scrollable.append(e.container)}{const e=new Br({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});e.container.classList.add("hide");const i=new ji.Z({text:"PrivacyAndSecurity.SensitiveText"}),s=new Ni({checkboxField:i,noCheckboxSubtitle:!0});let n;e.content.append(s.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===n)return;const e=s.checkboxField.checked;e!==n&&this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e})}),{once:!0});const a=this.managers.apiManager.invokeApi("account.getContentSettings").then((t=>{t.pFlags.sensitive_can_change&&(n=t.pFlags.sensitive_enabled,i.setValueSilently(n),e.container.classList.remove("hide"))}));t.push(a),this.scrollable.append(e.container)}{const e=new Br({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};In(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,mi.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),Li({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),ft.Z)},i=(0,M.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 Br({name:"FilterChats"}),t=()=>{new qi("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,mi.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,M.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(t)}updateActiveSessions(){this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,v.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}}function Vo(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)`}class Wo{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=()=>{let e=this._scrollDelta/this._scrollTails;if(this._scrollDelta%=this._scrollTails,e=e>0?Math.floor(e):Math.ceil(e),e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}this._onWheelRAF=void 0},this.drawNextPositionAnimated=()=>{const e=this._frames,t=e.shift();t&&this.drawImageData(t);const i=e.length;return i||(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,pa.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();for(;e>0;)t.push(t.shift()),--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)}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(){var e;if(this._colors.length<2)return;const t=this._tail,i=this._tails;let s;const n=[];for(let a=0,o=this._incrementalCurve.length;ai&&void 0===s&&(s=a,r%=i),n.push(r)}[n.slice(0,s),void 0!==s?n.slice(s):[]].forEach(((e,t,s)=>{const n=e[e.length-1];if(void 0!==n&&n>i&&(e[e.length-1]=+n.toFixed(2)),this._tail=null!=n?n:0,!e.length)return;const a=this.getNextPositions(this._phase,i,e);t!==s.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=a.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,ht.jt)(this.drawNextPositionAnimated)}scrollAnimate(e){this._colors.length<2&&e||(e&&!this._addedScrollListener?(document.addEventListener("wheel",this.onWheel),this._addedScrollListener=!0):!e&&this._addedScrollListener&&(document.removeEventListener("wheel",this.onWheel),this._addedScrollListener=!1))}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 Wo;return i.init(t),{gradientRenderer:i,canvas:t}}}var $o=i(6714);class jo{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(jo.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 b.Z({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new b.Z({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=jo.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?b.I.Neutral:b.I.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?b.I.Neutral:b.I.Error),e&&this.setColor((0,pa.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){xt(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){xt(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,pa.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,pa.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,pa.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,pa.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(b.I.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(b.I.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,Me.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,Me.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,Me.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=(0,Me.Z)(a,0,100),c=100-l/2,d=100-(0,Me.Z)(o,0,100),h=(0,Me.Z)(d/100*c,0,100);this.saturation=l,this.lightness=h,i&&this.updatePicker()}}jo.BASE_CLASS="color-picker";class qo extends P{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,pa.Pi)(e),i=this.theme.background,n=Ko(t);i.id="2",i.intensity=0,i.slug="",i.color=e.toLowerCase(),i.highlightningColor=n,this.managers.appStateManager.pushToState("settings",s.Z.settings),_m.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=$o.Z.getTheme();const e=new Br({});this.colorPicker=new jo,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new Br({}),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,n.fc)(i,(e=>{const t=(0,r.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,mt.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,i=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],i=!!t&&!e.slug;i&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),i||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var Qo=i(236);function Yo(e){return new Promise((t=>{var i,s,n;const a=document.createElement("canvas"),o=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize);a.width=o.width*window.devicePixelRatio,a.height=o.height*window.devicePixelRatio,a.getContext("2d").drawImage(e.media,0,0,a.width,a.height),a.toBlob((e=>{t({blob:e,size:o})}),null!==(s=e.mimeType)&&void 0!==s?s:"image/jpeg",null!==(n=e.quality)&&void 0!==n?n:1)}))}var Jo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Xo extends P{constructor(){super(...arguments),this.tempId=0,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",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=>Jo(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield Ze(t,i,!1);const s="image/jpeg",{blob:n}=yield Yo({media:t,size:new ot.c(t.naturalWidth,t.naturalHeight),mimeType:s});e=new File([n],e.name.replace(/\.png$/,".jpg"),{type:s})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),s=u.Z.getNewDeferredForUpload(e.name,i),n=(0,Oe.Z)();n.addNotifyListener=s.addNotifyListener,n.cancel=s.cancel,s.then((e=>{this.clicked.delete(a),this.elementsByKey.delete(a),this.wallPapersByElement.set(r,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,r),this.setBackgroundDocument(e).then(n.resolve,n.reject)}),n.reject);const a=this.getWallPaperKey(t);n.catch((()=>{r.remove()}));const o=new Ue({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),r=this.addWallPaper(t,!1);this.clicked.add(a),o.attach(r,!1,n)}))))},this.onResetClick=()=>{const e=Qo.h.settings.themes.find((e=>e.name===this.theme.name));e&&(++this.tempId,this.theme.background=(0,Ji.Z)(e.background),this.managers.appStateManager.pushToState("settings",s.Z.settings),_m.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=(0,r.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void this.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const a=i.document,o=new Ue({cancelable:!0,tryAgainOnFail:!1}),l=()=>Jo(this,void 0,void 0,(function*(){const e=this.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(a)).url&&!this.theme.background.blur||o.attach(t,!0,e)}));o.construct(),(0,n.fc)(t,(e=>{o.preloader.parentElement?(o.onClick(e),o.detach()):l()}),{listenerSetter:this.listenerSetter}),l()},this.saveToCache=(e,t)=>{fetch(t).then((t=>{_m.cacheStorage.save("backgrounds/"+e,t)}))},this.setBackgroundDocument=e=>{const t=++this.tempId,i=()=>t===this.tempId,n=e.document,a=(0,Oe.Z)();let o;return n?(o=u.Z.downloadMediaURL({media:n,queueId:_m.chat.bubbles?_m.chat.bubbles.lazyLoadQueue.queueId:0}),a.addNotifyListener=o.addNotifyListener,a.cancel=o.cancel):o=Promise.resolve(),o.then((()=>Jo(this,void 0,void 0,(function*(){if(!i())return void a.resolve();const t=this.theme.background,o=n=>{let o;if(n&&!this.theme.background.color)o=function(e){const t=document.createElement("img");return new Promise((i=>{Ae(t,e,(()=>{i(function(e,t,i){const s=document.createElement("canvas"),n=t/i;return 1===n?(s.width=50,s.height=s.width/n):n>1?(s.height=50,s.width=s.height/n):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),Vo(s)}(t,t.naturalWidth,t.naturalHeight))}))}))}(n);else{const{canvas:t}=Wo.create(this.getColorsFromWallPaper(e));o=Promise.resolve(Vo(t))}o.then((o=>{var r,l,c;if(!i())return void a.resolve();const d=Ko(Array.from(o)),h=null!==(r=e.slug)&&void 0!==r?r:"";t.id=e.id,t.intensity=null!==(c=null===(l=e.settings)||void 0===l?void 0:l.intensity)&&void 0!==c?c:0,t.color=this.getColorsFromWallPaper(e),t.slug=h,t.highlightningColor=d,this.managers.appStateManager.pushToState("settings",s.Z.settings),h&&this.saveToCache(h,n),_m.applyCurrentTheme(h,n,!0).then(a.resolve)}))};if(!n)return void o();const r=yield this.managers.thumbsStorage.getCacheContext(n);t.blur?setTimeout((()=>{const{canvas:e,promise:t}=Ye(r.url,12,4);t.then((()=>{i()?o(e.toDataURL()):a.resolve()}))}),200):o(r.url)})))),a},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"))}}get theme(){return $o.Z.getTheme()}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=Nr(this.scrollable),i=(0,M.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),a=(0,M.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),o=(0,M.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,n.fc)(i,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,n.fc)(a,(()=>{this.slider.createTab(qo).open()}),{listenerSetter:this.listenerSetter}),(0,n.fc)(o,this.onResetClick,{listenerSetter:this.listenerSetter});const r=this.blurCheckboxField=new ji.Z({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(r.input)("change",(()=>Jo(this,void 0,void 0,(function*(){this.theme.background.blur=r.input.checked,yield this.managers.appStateManager.pushToState("settings",s.Z.settings),setTimeout((()=>{const e=t.querySelector(".active");if(!e)return;const i=this.wallPapersByElement.get(e);i.pFlags.pattern||"wallPaperNoFile"===i._||this.setBackgroundDocument(i)}),100)})))),e.append(i,a,o,r.label)}s.Z.addEventListener("background_change",this.setActive),this.managers.appDocsManager.getWallPapers().then((e=>{e.forEach((e=>{this.addWallPaper(e)}))}));const e=Nr(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),(0,n.fc)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallPaper(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((e=>"#"+e.toString(16))).join(","):""}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){const i=this.getColorsFromWallPaper(e),s="wallPaper"===e._;if(s&&e.pFlags.pattern&&!i)return;const n=!!e.pFlags.dark,a=s?e.document:void 0,o=document.createElement("div");o.classList.add("grid-item"),o.dataset.id=""+e.id;const r=this.getWallPaperKey(e);this.wallPapersByElement.set(o,e),this.elementsByKey.set(r,o);const l=document.createElement("div");let c,d;if(l.classList.add("grid-item-media"),s?(d=Le(a,200,200),c=dt({photo:a,message:null,container:l,withoutPreloader:!0,size:d,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&l.classList.add("is-pattern"),c.then((({loadPromises:e,images:t})=>Jo(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((t=>{var i;e.pFlags.pattern&&(n?(t.full.style.display="none",t.thumb&&(t.thumb.style.display="none")):(null===(i=e.settings)||void 0===i?void 0:i.intensity)&&(t.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),Te.Z.mutate((()=>{o.append(l)}))}))):o.append(l),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Wo.create(i);t.classList.add("background-colors-canvas"),n&&s?c.then((({loadPromises:i})=>{i.full.then((()=>Jo(this,void 0,void 0,(function*(){const i=yield this.managers.thumbsStorage.getCacheContext(a,d.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,l.append(t)}))))})):l.append(t)}return this.getWallPaperKeyFromTheme(this.theme)===r&&o.classList.add("active"),this.grid[t?"append":"prepend"](o),o}}var er=i(6761);var tr=i(3731);class ir extends P{init(){return this.header.classList.add("with-border"),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 Br,s=t.map((t=>{const i=new Vi({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new Ni({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),Oa({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=Ui(s,(e=>{this.managers.appReactionsManager.setDefaultReaction(e)}));i.content.append(n),this.scrollable.append(i.container)}))}}class sr{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 l=document.createElement("div");l.classList.add(o+"-name"),(0,v.$d)(l,e);const c=this.valueContainer=document.createElement("div");c.classList.add(o+"-value"),a&&(c.innerHTML=""+i),r.append(l,c),this.range=new _t({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(c.innerText=""+e)}}),this.container.append(r,this.range.container)}}class nr extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=Nr.bind(null,this.scrollable);{const t=e("Settings"),i=new sr("TextSize",1,s.Z.settings.messagesTextSize,12,20);i.onChange=e=>{s.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const a=(0,M.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});(0,n.fc)(a,(()=>{this.slider.createTab(Xo).open()}));const o=new ji.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0,listenerSetter:this.listenerSetter});t.append(i.container,a,o.label)}{const t=e("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new Ni({radioField:new Vi({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new Ni({radioField:new Vi({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,v.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[Je.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),t.append(i)}if(tr.Z){const t=e("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new Ni({radioField:new Vi({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new Ni({radioField:new Vi({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),t.append(i)}{const t=e("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 Ni({radioField:new Vi({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=ft.Z),function i(){e(),n=er.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))),t.append(i)}{const t=e("Emoji"),i=new ji.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0,listenerSetter:this.listenerSetter}),s=new ji.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0,listenerSetter:this.listenerSetter});t.append(i.label,s.label)}{const e=new Br({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new Ni({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(ir).open()},listenerSetter:this.listenerSetter}),i=()=>{Promise.resolve(this.managers.appReactionsManager.getQuickReaction()).then((e=>{Oa({row:t,doc:e.static_icon,size:"small"})}))};i(),this.listenerSetter.add(s.Z)("quick_reaction",i);const n=new ji.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0,listenerSetter:this.listenerSetter}),a=new ji.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0,listenerSetter:this.listenerSetter}),o={},r=e.generateContentElement(),l=new ye,c=(e,t="append")=>{const i=new Ni({title:(0,Zt.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new qn({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});o[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),Ua({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:l,width:48,height:48,autoplay:!0}),i.container.append(s),r[t](i.container)};this.managers.appStickersManager.getAllStickers().then((e=>{(0,ai.Z)(e);for(const t of e.sets)c(t)})),this.listenerSetter.add(s.Z)("stickers_installed",(e=>{const t=e;o[t.id]||c(t,"prepend")})),this.listenerSetter.add(s.Z)("stickers_deleted",(e=>{const t=e;o[t.id]&&(o[t.id].container.remove(),delete o[t.id])})),e.content.append(t.container,n.label,a.label),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}class ar extends P{init(){return e=this,t=void 0,a=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=Nr(this.scrollable,void 0,"Bio.Description"),i=document.createElement("div");i.classList.add("input-wrapper");const n=yield this.managers.apiManager.getAppConfig();this.firstNameInputField=new b.Z({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new b.Z({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new b.Z({label:"EditProfile.BioLabel",name:"bio",maxLength:s.Z.premium?n.about_length_limit_premium:n.about_length_limit_default}),i.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const a=document.createElement("div");a.classList.add("caption"),(0,v.XZ)({element:a,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new Ri({peerId:s.Z.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),t.append(this.editPeer.avatarEdit.container,i)}{const t=new Br({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new $i({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=t.caption;s.append((0,v.ag)("UsernameSettings.ChangeDescription")),s.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append((0,v.ag)("UsernameHelpLink",[a])),s.append(n),e.push(this.usernameInputField),t.content.append(i),this.scrollable.append(t.container)}(0,n.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[];e.push(this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).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});const t=yield this.managers.appUsersManager.getSelf(),i=yield this.managers.appProfileManager.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(i.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";const e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var or=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class rr extends P{constructor(){super(...arguments),this.renderResults=e=>or(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=gg.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:46}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const s=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,c.Z)(e,(0,Zt.Z)(i.title)),s.push(e)}})),(0,v.v_)(s,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=E("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,n.fc)(this.confirmBtn,(()=>or(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,Mn.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,Mn.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 e=e=>{this.limit=s.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(s.Z)("app_config",e),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>or(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!le.DZ.has(e.id))).map((e=>or(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((t=>{e(t)}))])}checkbox(e){const t=new ji.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new Br({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,M.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 a=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new ps({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(a);let o=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&o&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);return t&&setTimeout((()=>{t.checked=!1}),0),void Ci(v.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=r(e,i[e]?(0,v.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(a),o=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,n.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,i){return this.originalFilter=e,this.filter=(0,Ji.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,super.open()}}var lr=i(1544),cr=i(3066),dr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class hr extends P{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,v.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=E("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new qi("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{e&&this.close()})).finally((()=>{e.element.removeAttribute("disabled")}))},isDanger:!0}]}).show()}};this.menuBtn=mo({listenerSetter:this.listenerSetter},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new Br({}),i=document.createElement("div");i.classList.add("input-wrapper"),this.nameInputField=new b.Z({label:"FilterNameHint",maxLength:12}),i.append(this.nameInputField.container),t.content.append(i);const s=(e,t,i,s)=>{const n=new Br({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,M.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=s("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=s("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,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),o=this.excludePeerIds.container.querySelector(".folder-categories");(0,n.fc)(a.querySelector(".btn"),(()=>{this.slider.createTab(rr).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,n.fc)(o.querySelector(".btn"),(()=>{this.slider.createTab(rr).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,n.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(a.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=>{e&&this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?Ci("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):Ci("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 r="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=hi.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then((e=>(this.animation=e,hi.Z.waitForFirstFrame(e)))),...r])}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"),this.nameInputField.value="";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,lr.Z)((0,cr.Z)(e.title));for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>dr(this,void 0,void 0,(function*(){const i=this[t],s=gg.createChatList({ignoreClick:!0});let a=e[t];const o=e=>dr(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 ki(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const l=e=>dr(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);tl(20)),{listenerSetter:this.listenerSetter}),c.append((0,v.ag)("FilterShowMoreChats",[a.length])),e.append(c)}l(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,gs.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,Ji.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return 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"),super.open().then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):this.onCreateOpen()}))}}var ur=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class pr extends P{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,i,s){return ur(this,void 0,void 0,(function*(){let a,o="";const r=[];if("dialogFilterSuggested"===e._)a=e.filter,o=e.description;else{if(a=e,1===Object.keys(a.pFlags).length){const e=a.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&&r.push((0,v.ag)(t))}if(!r.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(a.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>ur(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&r.push((0,v.ag)("Chats",[t])),i&&r.push((0,v.ag)("Channels",[i])),s&&r.push((0,v.ag)("Groups",[s]))}}if(i)a.id!==le.J$&&(0,g.Z)(i.title,(0,Zt.Z)(a.title)),i.subtitle.textContent="",i.subtitle.append(...(0,v.v_)(r));else if(i=new Ni({title:a.id===le.J$?(0,v.ag)("FilterAllChats"):(0,Zt.Z)(a.title),subtitle:o,clickable:a.id!==le.J$}),r.length&&i.subtitle.append(...(0,v.v_)(r)),"dialogFilter"===e._){const e=a.id;this.filtersRendered[a.id]||a.id===le.J$||(0,n.fc)(i.container,(()=>ur(this,void 0,void 0,(function*(){this.slider.createTab(hr).open(yield this.managers.filtersStorage.getFilter(e))}))),{listenerSetter:this.listenerSetter}),this.filtersRendered[a.id]=i}const l=i.container;if(s){const e=a.localId;void 0!==e?Ln(l,l.parentElement||t,e):t&&t.append(l)}return l}))}init(){return ur(this,void 0,void 0,(function*(){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 e=document.createElement("div");e.classList.add("caption"),(0,v.XZ)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,M.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new Br({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new Br({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,n.fc)(this.createFolderBtn,(()=>ur(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab(hr).open():Ci("Sorry, you can't create more folders.")}))),{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return this.managers.filtersStorage.getDialogFilters().then((e=>ur(this,void 0,void 0,(function*(){for(const t of e)t.id!==le.Zi&&(yield this.renderFolder(t,this.foldersSection.content,void 0,!0));this.toggleAllChats(),t()})))),this.listenerSetter.add(s.Z)("filter_update",(e=>ur(this,void 0,void 0,(function*(){const i=this.filtersRendered[e.id];i?yield this.renderFolder(e,null,i):e.id!==le.Zi&&(yield this.renderFolder(e,this.foldersSection.content,void 0,!0)),t(),this.getSuggestedFilters()})))),this.listenerSetter.add(s.Z)("filter_delete",(e=>{const i=this.filtersRendered[e.id];i&&(this.getSuggestedFilters(),i.container.remove(),delete this.filtersRendered[e.id]),t()})),this.listenerSetter.add(s.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;Ln(i,i.parentElement,t+1)}))})),this.listenerSetter.add(s.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=hi.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then((e=>(this.animation=e,hi.Z.waitForFirstFrame(e)))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}toggleAllChats(){this.filtersRendered[le.J$].container.classList.toggle("hide",!s.Z.premium)}canCreateFolder(){return ur(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getAppConfig(),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!le.DZ.has(e.id))).length<(s.Z.premium?e.dialog_filters_limit_premium:e.dialog_filters_limit_default)}))}getSuggestedFilters(){return this.managers.filtersStorage.getSuggestedDialogsFilters().then((e=>ur(this,void 0,void 0,(function*(){this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t),i=(0,M.Z)("btn-primary btn-color-primary",{text:"Add"});e.append(i),this.suggestedSection.content.append(e),(0,n.fc)(i,(s=>ur(this,void 0,void 0,(function*(){if((0,a.Z)(s),!(yield this.canCreateFolder()))return void Ci("Sorry, you can't create more folders.");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((t=>{t&&e.remove()})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}var mr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class gr extends k{init(){this.header.classList.add("with-border"),this.container.classList.add("notifications-container","with-border"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new Br({name:e.name}),i=new Ni({checkboxField:new ji.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter}),n=new Ni({checkboxField:new ji.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter});t.content.append(i.container,n.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=()=>mr(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,n.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>mr(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,s=n.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&s===t.show_previews)return;const o=(0,Ji.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?le.rU:0,o.show_previews=s,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(s.Z)("notify_settings",(i=>{const s=zo(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 Br({name:"NotificationsOther"}),t=new Ni({checkboxField:new ji.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter}),i=new Ni({checkboxField:new ji.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter});Gi.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 vr extends P{init(){return e=this,t=void 0,s=function*(){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new Br({}),t=new Map,i=Promise.all([this.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),this.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"})]).then((([i,s])=>{const n=new Set,a=i.map((e=>e.lang_code)),o=(0,Hi.a)();i.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const i=new Ni({radioField:new Vi({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,i)}));const r=Ui([...t.values()],(e=>{v.ZP.getLangPack(e,a.includes(e))}));v.ZP.getCacheLangPack().then((e=>{const i=t.get(e.lang_code);i?i.radioField.setValueSilently(!0):console.error("no row",i,e)})),e.content.append(r)}));return this.scrollable.append(e.container),i},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}function fr(e,t,i){const s=new Br({name:t}),n="settings.autoDownload."+e+".",a=new ji.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",withRipple:!0,listenerSetter:i}),o=new ji.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",withRipple:!0,listenerSetter:i}),r=new ji.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",withRipple:!0,listenerSetter:i}),l=new ji.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",withRipple:!0,listenerSetter:i});return s.content.append(a.label,o.label,r.label,l.label),s}class yr extends k{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=fr("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class br extends k{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=(0,Ki.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=fr("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,n=20447232,a=s.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/n)),r=new v.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[Tt(a)]}),l=new sr("AutoDownloadMaxFileSize",.01,o,0,1,!1);l.onChange=t=>{const s=Math.pow(t,4)*n+i|0;r.compareAndUpdate({args:[Tt(s)]}),e(s)},l.valueContainer.append(r.element),t.content.append(l.container),this.scrollable.append(t.container)}}class wr extends k{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=fr("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const Sr={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class Cr extends k{init(){return e=this,t=void 0,a=function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new Br({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield Gi.Z.getState(),i=new ji.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,withRipple:!0}),a=()=>{(0,mi.Z)([h],(0,gs.Z)(t.settings.autoDownload,Qo.h.settings.autoDownload)&&(0,gs.Z)(t.settings.autoDownloadNew,Qo.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(l,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(d,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=new e(this.slider,!0);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},l=new Ni({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(yr)},listenerSetter:this.listenerSetter}),c=new Ni({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(wr)},listenerSetter:this.listenerSetter}),d=new Ni({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(br)},listenerSetter:this.listenerSetter}),h=(0,M.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,n.fc)(h,(()=>{In({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=s.Z.settings;e.autoDownloadNew=(0,Ji.Z)(Qo.h.settings.autoDownloadNew),e.autoDownload=(0,Ji.Z)(Qo.h.settings.autoDownload),this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=s.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[l,c,d].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(i.label,l.container,c.container,d.container,h),this.scrollable.append(e.container)}{const e=new Br({name:"AutoplayMedia"}),t=new ji.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0,listenerSetter:this.listenerSetter}),i=new ji.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0,listenerSetter:this.listenerSetter});e.content.append(t.label,i.label),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(s,n){function o(e){try{l(a.next(e))}catch(e){n(e)}}function r(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((a=a.apply(e,t||[])).next())}));var e,t,i,a}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?Sr[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(Tt(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,v.v_)(o.map((e=>(0,v.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,g.Z)(e.subtitle,(0,v.ag)(s,n))}}var Lr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Ir extends P{constructor(){super(...arguments),this.buttons={}}init(){return Lr(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=mo({listenerSetter:this.listenerSetter},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new qi("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=E("edit"),this.header.append(this.buttons.edit,e),this.profile=new Ys(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(s.Z.myId);const t=this.profile.fillProfileElements(),i=(0,M.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,n.fc)(i,(()=>{const e=document.createElement("canvas");A.Z.createPopup(Z.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const a=()=>Lr(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._))}));a(),this.listenerSetter.add(s.Z)("avatar_update",(e=>{s.Z.myId===e&&a()}));const o=document.createElement("div");o.classList.add("profile-buttons");const r=[["unmute","AccountSettings.Notifications",gr],["data","DataSettings",Cr],["lock","AccountSettings.PrivacyAndSecurity",Go],["settings","Telegram.GeneralSettingsViewController",nr],["folder","AccountSettings.Filters",pr]].map((([e,t,i])=>new Ni({titleLangKey:t,icon:e,clickable:()=>{this.slider.createTab(i).open()},listenerSetter:this.listenerSetter})));r.push(this.devicesRow=new Ni({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>Lr(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(Oo);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 Ni({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,v.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(vr).open()},listenerSetter:this.listenerSetter})),o.append(...r.map((e=>e.container)));const l=new Br;l.content.append(o),this.scrollable.append(this.profile.element,l.container),(0,n.fc)(this.buttons.edit,(()=>{this.slider.createTab(ar).open()}),{listenerSetter:this.listenerSetter}),hi.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 Mr extends P{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new F((e=>{this.uploadAvatar=e}));const e=new Br({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new b.Z({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new b.Z({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=D({icon:"arrow_next"}),(0,n.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)})),_m.setInnerPeer({peerId:e.toPeerId(!0)}),Hr.removeTabFromHistory(this),this.slider.createTab(Ts).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 Er=i(709);class Pr extends A.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,n.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,a.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&(Li({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)})),c.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new b.Z({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new b.Z({label:"LastName",name:"create-contact-lastname",maxLength:70}),a=new Er.Z({required:!0});e.push(i,s,a);const o=()=>{const e=i.value+" "+s.value;c.avatarElem.peerTitle=e,c.avatarElem.update()};this.listenerSetter.add(i.input)("input",o),this.listenerSetter.add(s.input)("input",o),a.validate=()=>!!a.value.match(/\d/);const r=yield this.managers.appUsersManager.getSelf(),l=(0,Ms.u)(r.phone);l.code&&(a.value="+"+l.code.country_code);const c=new Ri({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,c.avatarElem),this.container.append(t,a.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}class kr extends P{init(){this.container.id="contacts-container";const e=D({icon:"add",className:"is-visible"});this.content.append(e),(0,n.fc)(e,(()=>{A.Z.createPopup(Pr)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new w("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(s.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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,Ti.k)()}createList(){const e=new Va({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),gg.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!Je.IS_MOBILE&&Lo(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),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=as.height/72*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,g.Z)(this.scrollable.container,i.list)}))}open(){return this.openContacts(),super.open()}}class Tr extends P{init(){if(this.wasFilterId=gg.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!gg.sortedLists[Tr.filterId]){const e=gg.createChatList();gg.generateScrollable(e,{title:void 0,id:Tr.filterId,localId:le.Zi}).container.append(e),gg.setListClickListener(e,null,!0)}const e=gg.scrollables[Tr.filterId];return this.scrollable.container.replaceWith(e.container),this.scrollable=e,gg.setFilterIdAndChangeTab(Tr.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){gg.sortedLists[this.wasFilterId].clear()}onClose(){gg.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return gg.sortedLists[Tr.filterId].clear(),super.onCloseAfterTimeout()}}Tr.filterId=le.Zi;class xr extends P{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===s.Z.settings.distanceUnit?e>1609.34?(0,v.ag)("MilesAway",[Math.round(e/1609)]):(0,v.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,v.ag)("KMetersAway2",[e/1e3]):(0,v.ag)("MetersAway2",[e])}open(){const e=super.open();return e.then((()=>{this.retryBtn.classList.remove("is-visible"),navigator.geolocation.getCurrentPosition((e=>{this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy},console.log(this.latestLocationSaved),this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy).then((e=>{const t=e.updates[0].peers,i=t.sort(((e,t)=>e.distance-t.distance)),s=t.filter((e=>"peerChannel"==e.peer._)).length,n=t.filter((e=>"peerChannel"!=e.peer._)).length;null==i||i.forEach((e=>{const t=(0,es.Z)(e.peer),i=t.isUser()?this.peopleSection:this.chatsSection;this.locatedPeers.set(t,e),i.sortedList.add(t)})),this.errorCategory.classList.toggle("hide",!(!n&&!s)),this.errorCategory.innerHTML="No groups or channels found around you."}))}),(e=>{this.errorCategory.classList.remove("hide"),this.retryBtn.classList.add("is-visible"),this.retryBtn.addEventListener("click",this.open),e instanceof GeolocationPositionError?this.errorCategory.innerHTML="Location permission denied. Click below to retry.":this.errorCategory.innerHTML="An error has occurred. Please retry later clicking the button below."}))})),e}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,Ci("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,Ci("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 _r=i(4159),Ar=i(7487);function Zr(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]}var Fr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Dr="is-left-column-shown",Rr="sidebar-left-section";class Br{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(Rr+"-container");const s=this.innerContainer=document.createElement("div");if(s.classList.add(Rr),e.noShadow&&s.classList.add("no-shadow"),e.fakeGradientDelimiter)s.append(Ur()),s.classList.add("with-fake-delimiter");else if(e.noDelimiter)s.classList.add("no-delimiter");else{const e=document.createElement("hr");s.append(e)}const n=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",Rr+"-name"),(0,v.XZ)({element:t,key:e.name,args:e.nameArgs}),n.append(t)}i.append(s);const a=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(a){const t=this.caption=this.generateContentElement();t.classList.add(Rr+"-caption"),e.captionOld||i.append(t),!0!==a&&(0,v.XZ)({element:t,key:a,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(Rr+"-content"),this.innerContainer.append(e),e}}const Nr=(e,t,i)=>{const s=new Br({name:t,caption:i});return e.append(s.container),s.content},Ur=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e},Or=new class extends _{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new w("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(kr).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(Tr).open()},verify:()=>Fr(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(1,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(1))}))},o=new ji.Z({toggle:!0,checked:"night"===$o.Z.getTheme().name});o.input.addEventListener("change",(()=>Fr(this,void 0,void 0,(function*(){yield this.managers.appStateManager.setByKey("settings.theme",o.input.checked?"night":"day"),s.Z.dispatchEvent("theme_change")})))),s.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===$o.Z.getTheme().name)}));const r=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout((()=>{_m.setPeer({peerId:_m.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},tr.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(xr).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(Ir).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new ji.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=v.ZP.format("TelegramFeaturesUrl",!0);_m.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([Ar.Z.set({kz_version:"Z"}),Ar.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>_r.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Ar.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>_r.Z.isMainDomain}].filter(Boolean);this.toolsBtn=mo({},"bottom-right",r,(e=>Fr(this,void 0,void 0,(function*(){yield Promise.all(r.map((e=>Fr(this,void 0,void 0,(function*(){e.verify&&e.element.classList.toggle("hide",!(yield e.verify()))})))))})))),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const l=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(n.pf,(e=>{e.stopPropagation(),Ii.close()}));const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+_r.Z.suffix+" "+_r.Z.versionFull,c.append(d),l.classList.add("has-footer"),l.append(c),this.newBtnMenu=mo({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(Mr).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(Ts).open({type:"chat",skippable:!1,takeOut:e=>{this.createTab(de).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,we.Z)(this.updateBtn),this.updateBtn.append((0,v.ag)("Update")),(0,n.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",a.element.append(this.archivedCount),s.Z.addEventListener("folder_unread",(e=>{if(1===e.id){const t=e.unreadPeerIds.size;this.archivedCount.innerText=""+Zr(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const h={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};C.Z.pushItem(h),Gi.Z.getState().then((e=>{const t=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((e=>{e!==_r.Z.versionFull&&(this.hasUpdate=!0,clearInterval(t),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(ft.Z)}),18e5)}))}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new m.ZP(e),i=()=>{(0,n.tH)(this.backBtn)};this.searchGroups={contacts:new f("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new f("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new f("SearchMessages","messages"),people:new f(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new f("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new uo({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 a=[];let o="".toPeerId(),c=0,d=0;const h=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},u=document.createElement("div");u.classList.add("search-helper"),u.addEventListener("click",(e=>{const t=(0,r.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");c=+t,d=+s}else o=i.toPeerId();t.addEventListener("click",(()=>{v(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),h()})),s.nav.parentElement.append(u);const p=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new Wm;return s.classList.add("selector-user-avatar","tgico","avatar-30"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Ot({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,g.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},v=e=>{0===e.dataset.key.indexOf("date_")?c=d=0:o="".toPeerId(),e.remove(),(0,T.Z)(a,e),setTimeout((()=>{h(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{a.forEach((e=>{v(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:c,maxDate:d}),s.load(!0),u.innerHTML="",s.nav.classList.remove("hide"),!o&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.appMessagesManager.getConversations(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=>{u.append(p(e))})),s.nav.classList.toggle("hide",!!u.innerHTML))}))}if(!c&&e.trim()){const t=[];X(e,t),t.forEach((e=>{u.append(p("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!u.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,l.Z)(e.target,dg);if(!t)return;const i=(0,r.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 y=document.createElement("div");y.classList.add("search-group-scrollable"),y.append(this.searchGroups.people.list),this.searchGroups.people.container.append(y),new m.v7(y);let b,w=!0;const L=(0,S.v)(e.parentElement,"zoom-fade",150,(e=>{b&&clearTimeout(b),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),b=window.setTimeout((()=>{b=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}));L(0);const I="is-visible",M=()=>{this.toolsBtn.classList.remove(I),this.backBtn.classList.add(I),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";Je.IS_MOBILE_SAFARI||C.Z.findItemByType(e)||C.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",M),M(),(0,n.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(I),this.backBtn.classList.remove(I),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),C.Z.removeByType("global-search"),L(0)}));const P=E("close");this.searchGroups.recent.nameEl.append(P),P.addEventListener("click",(()=>{In({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}};R.GO.appSidebarLeft=Or;const Hr=Or;class zr{constructor(e,t,i){this.container=document.createElement("div"),this.container.classList.add("bubbles-group"),this.chat=e,this.groups=t,this.items=[],this.dateTimestamp=i,this.offset=0}createAvatar(e){if(this.avatarLoadPromise)return this.avatarLoadPromise;if("messageService"===e._)return;this.avatarContainer=document.createElement("div"),this.avatarContainer.classList.add("bubbles-group-avatar-container"),++this.offset;const t=e.fwd_from,i=e.fwdFromId,n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===i,a=this.chat.peerId,o=this.avatar=new Wm;this.avatar.classList.add("bubbles-group-avatar","user-avatar","avatar-40");const r=(t&&(a===s.Z.myId||a===le.hj)||n?i:e.fromId)||le.NM,l=this.avatar.updateWithOptions({lazyLoadQueue:this.chat.bubbles.lazyLoadQueue,peerId:r,peerTitle:!i&&t&&t.from_name?t.from_name:void 0});return this.avatarLoadPromise=Promise.all([l,r&&r.isUser()?this.chat.managers.appUsersManager.getUser(r.toUserId()):void 0]).then((([e,t])=>{var i;return(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.premium)&&o.classList.add("is-premium","tgico-star"),e})),this.avatarContainer.append(this.avatar),this.container.append(this.avatarContainer),this.avatarLoadPromise}get firstTimestamp(){return this.firstItem.timestamp}get firstMid(){return this.firstItem.mid}get firstItem(){return this.items[this.items.length-1]}get lastTimestamp(){return this.lastItem.timestamp}get lastMid(){return this.lastItem.mid}get lastItem(){return this.items[0]}updateClassNames(){const e=this.items,t=e.length;if(!t)return;const i=e[t-1].bubble;if(1===e.length)return void i.classList.add("is-group-first","is-group-last");i.classList.remove("is-group-last"),i.classList.add("is-group-first");for(let i=1,s=t-1;i{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||(Ln(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);Ln(this.container,e.container,gc+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 Gr{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){e.group.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t),a.unmountItem(t);const o=new Set;o.add(a);const[r,l]=n;if(r&&l&&this.canItemsBeGrouped(r,l)&&r.group!==l.group){const e=l.group;this.f(l.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}this.mountUnmountGroups(Array.from(o))}mountUnmountGroups(e){const[t,i]=function(e,t){const i=[],s=[];for(let t=0,a=e.length;t{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()}}class Vr extends A.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 b.Z({plainText:!0}),this.minutesInputField=new b.Z({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,n.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 v.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new v.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,v.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new v.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&&d.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new v.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 v.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{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive");const i="inline"===this.type?14:22,s=this.wrapStickerPromise=ta({div:this.stickerContainer,doc:null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon,width:i,height:i,static:!0,managers:this.managers}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===s&&(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("reaction-counter"));const e=Zr(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 na({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,es.Z)(e.peer_id))))))}setIsChosen(e=!!this.reactionCount.pFlags.chosen){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&Re(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){(0,Kr.Z)(this.managers.appReactionsManager.getReaction(this.reactionCount.reaction),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add("reaction-sticker-activate"),Promise.all([ta({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}).then((({render:e})=>e)),Yn({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers}).stickerPromise]).then((([e,t])=>{const s=()=>{(0,Be.T2)((()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")}))};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(s,1e3)})):s())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define("reaction-element",Wr);const $r=new Map;class jr extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[],this.managers=s.Z.managers}connectedCallback(){let e=$r.get(this.key);e||$r.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=$r.get(this.key);e.delete(this),e.size||$r.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i){void 0!==this.key&&this.disconnectedCallback(),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.isPlaceholder=i,this.type!==t&&(this.type=t,this.classList.add("reactions-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.isPlaceholder)}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;const s=this.managers.appReactionsManager.getAvailableReactions(),n=i?s instanceof Promise?t.results:t.results.filter((e=>this.managers.appReactionsManager.isReactionActive(e.reaction))):[];(0,Mn.Z)(this.sorted,((e,t,i)=>{const s=e.reactionCount.reaction;n.some((e=>e.reaction===s))||(i.splice(t,1),e.remove())}));const a=n.reduce(((e,t)=>e+t.count),0),o=t&&!!t.pFlags.can_see_list&&a<4;if(this.sorted=n.map(((e,i)=>{const s=this.sorted.findIndex((t=>t.reactionCount.reaction===e.reaction));let n=-1!==s&&this.sorted[s];n||(n=new Wr,n.init(this.type)),Ln(n,this,i);const a=t.recent_reactions?t.recent_reactions.filter((t=>t.reaction===e.reaction)):[];return n.reactionCount=Object.assign({},e),n.setCanRenderAvatars(o),n.render(this.isPlaceholder),n.renderCounter(),n.renderAvatars(a),n.setIsChosen(),n})),!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===_m.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>t.reactionCount.reaction===e.reaction));t&&t.fireAroundAnimation()}))}}customElements.define("reactions-element",jr);s.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(`replies-element[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class qr extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=s.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 na({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,es.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 v.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)?Zr(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("replies-element",qr);const Qr=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,v.$d)(e,"EditedMessage"),e},Yr=()=>(0,v.ag)("SponsoredMessage");var Jr;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r,l,d;const h=!!s.pFlags.sponsored,u=!("action"in s)&&!h;let p;const m=h?void 0:V(n);if(u){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=Zr(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,c.Z)(t,(0,Zt.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=Qr()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}"peerUser"===s.peer_id._&&(p=!0,d=e.reactionsMessage,l=new jr,l.init(d,"inline",!0),l.render(),a.unshift(l))}else h&&a.push(r=Yr());m&&a.push(m);let g=h?void 0:K(n);u&&(g+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${K(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${K(new Date(1e3*s.fwd_from.date))}`:""));const v=document.createElement("span");v.classList.add("time","tgico"),v.append(...a);const f=document.createElement("div");f.classList.add("inner","tgico"),g&&(f.title=g);let y=a;if(o&&(y[y.indexOf(o)]=Qr()),r&&(y[y.indexOf(r)]=Yr()),l){const e=y[y.indexOf(l)]=new jr;e.init(d,"inline"),e.render()}return y=y.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),m&&(y[y.length-1]=V(n)),f.append(...y),v.append(f),v},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 qr;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:n})=>{return a=this,o=void 0,l=function*(){const a=!i;a&&(i=t.querySelector(".bubble-content"));const o=a?i.querySelector(".reply"):null;if(!n.reply_to_mid)return o&&o.remove(),void t.classList.remove("is-reply");const r=n.reply_to.reply_to_peer_id?(0,es.Z)(n.reply_to.reply_to_peer_id):e.peerId,l=yield s.Z.managers.appMessagesManager.getMessageByPeer(r,n.reply_to_mid);let c,d;if(l){const e=l.fwdFromId;d=n.fwdFromId&&n.fwdFromId===e?n.fwdFromId:l.fromId||e,c=new Ot({peerId:d,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else s.Z.managers.appMessagesManager.fetchMessageReplyTo(n),e.bubbles.needUpdate.push({replyToPeerId:r,replyMid:n.reply_to_mid,mid:n.mid}),c=(0,v.ag)("Loading");const{container:h,fillPromise:u}=Ba(c,void 0,l,e.isAnyGroup?d:void 0);yield u,o?o.replaceWith(h):i.append(h),t.classList.add("is-reply")},new((r=void 0)||(r=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 r?n:new r((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,o||[])).next())}));var a,o,r,l}}(Jr||(Jr={}));var Xr=i(252);function el(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)}function tl(e){e.style.display="none",e.offsetLeft,e.style.display=""}R.GO.getElementByPoint=el;const il=2147483646;var sl,nl=i(993);class al extends A.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,A.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);_m.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&Li({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 Wm;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),dt({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):Hs(s,le.NM,!1,e.title);const n=document.createElement("div");n.classList.add("chat-title"),(0,c.Z)(n,(0,Zt.Z)(e.title));const a=e.pFlags.broadcast,o=(0,v.ag)(a?"Subscribers":"Members",[ls(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,v.$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{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((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"}(sl||(sl={}));class ol{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(En(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){Je.IS_SAFARI&&e&&tl(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;let n;if(this.scrollHeight=s,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)}}R.GO&&(R.GO.ScrollSaver=ol);class rl{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;i{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}var ul=i(2381);const pl=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 ml(e){return e.replace(/\D/g,"")}const gl={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])/},vl={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}},fl=pl(((e="")=>{const t=Object.keys(gl),i=ml(e);let s,n=0;return t.forEach((e=>{const t=gl[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function yl(e=""){return"diners14"===(t=fl(e))?"diners":t;var t}var bl=i(2398),wl=i(7298);function Sl(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const Cl="0".charCodeAt(0)-"0".charCodeAt(0),Ll=/[0-9]/g;function Il(e){return String.fromCharCode(e.charCodeAt(0)-Cl)}function Ml(e){return e.replace(Ll,Il)}function El(e,t){return{type:"optional",result:e,consumed:t}}function Pl(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function kl(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?El:Pl;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const Tl=kl(/1[0-2]|0?[1-9]|0/),xl={digit:function(e){return kl(/[0-9]/)(Ml(e))},capitalCharacter:function(e){const t=kl(/\w/)(e);return t.result?Pl(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=Tl(Ml(e)),i=ml(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Pl(t.result,e.length,!0):Pl(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=kl(e,!0)(t);return i.result?i:El("",0)}},_l=xl.digit,Al=xl.capitalCharacter,Zl=xl.formattingCharacter(" "),Fl=xl.optionalPattern(/\d\d/),Dl=[_l,_l,_l,_l,Zl,_l,_l,_l,_l,_l,_l,Zl,_l,_l,_l,_l,_l],Rl=[_l,_l,_l,_l,Zl,_l,_l,_l,_l,_l,_l,Zl,_l,_l,_l,_l],Bl=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"]),Nl=pl((e=>{const t=[];for(let i=0,s=0;i[xl.month,xl.formattingCharacter("/"),_l,_l,Fl],cardCvc:e=>Ul.cardCvcFromBrand(fl(e)),cardCvcFromBrand:pl((e=>{const t=vl[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Sl(i||s,_l);if(i&&i{switch(e){case"US":return Sl(5,_l);case"CA":return Je.IS_ANDROID?null:[Al,Al,Al,Zl,Al,Al,Al];default:const t=Sl(10,xl.optionalPattern(/\d/));return Bl.has(e)&&(t[0]=_l),t}}))},Ol=Ul;function Hl(e){return Ie(e.map((e=>e.length)),0)}const zl=new RegExp("‎","g");function Gl(e){return e?{type:"invalid",code:e}:null}function Vl(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=ml(e),i=fl(e);return{sanitized:t,brand:i,minLength:vl[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"===fl(e)?null:Gl("invalid"):i?null:Gl("incomplete")}(i,s,t.ignoreIncomplete)}function Kl(e,t={}){const i=e.replace(zl,"").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:Gl("incomplete"):Gl(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{$l.set(i.contentWindow,t)}),{once:!0}),i}window.addEventListener("message",(e=>{const t=$l.get(e.source);t&&t(JSON.parse(e.data))}));class ql extends A.Z{constructor(e){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.d()}d(){const e=jl(this.url,(e=>{"web_app_open_tg_link"===e.eventType&&(this.dispatchEvent("finish"),this.hide(),_m.openUrl("https://t.me"+e.eventData.path_full))}));this.body.append(e),this.show()}}class Ql extends b.Z{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 l=0,c=0,d=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===d&&c+1>=i.selectionStart&&(d=Hl(o)+(s?r.length:0)),null===h&&c+1>=i.selectionEnd&&(h=Hl(o)+(s?r.length:0)),c+=e)};for(;l=t.length)break;r.push(a),++l,u(d)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===d||t.length&&i.selectionStart===t.length?Hl(o):d,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?Hl(o):h},autocorrectComplete:l===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:l}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:l}}({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 l;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={}),l=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:Gl("incomplete")}(this.lastTransformed,0,t),null==l?void 0:l.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[l.code];return!i&&this.setState(b.I.Error,e),!1}return!i&&this.setState(b.I.Neutral),!0}}function Yl(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 Ql){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 Jl(e,t){let i,s;return(e||t)&&(e&&(i=new Wl.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new Ql({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return Ol.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Xl=new Set(["stripe","smartglocal"]);class ec extends A.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Xl.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Xl.has(e.native_provider))this.d();else{const t=jl(e.url,(t=>{if("payment_form_submit"!==t.eventType)return;const i=t.eventData,s={title:i.title,save:!1};this.dispatchEvent("finish",{token:i.credentials,card:s}),this.hide(),e.pFlags.can_save_credentials&&In({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{s.save=!0}),ft.Z)}));this.body.append(t),this.show()}}d(){const e=this.savedCard,t=new Br({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new Ql({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:Ol.cardNumber,validateMethod:Vl,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=oc(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),Ze(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(yl(e.value)),c.update()}});let r;i.need_cardholder_name&&(r=new b.Z({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const l=new Ql({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:Ol.cardExpiry,validateMethod:Kl}),c=new Ql({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",formatMethod:()=>Ol.cardCvc(o.value)}),d=[o,l,c,r].filter(Boolean);d.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=d[d.indexOf(e)-1];t&&(0,bl.Z)(t.input,!0)}};if(e instanceof Ql){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=d.indexOf(e),i=d.length;te.container))));const g=!!this.paymentForm.pFlags.can_save_credentials,v=new ji.Z({text:"PaymentCardSavePaymentInformation",checked:!!g}),f=new Ni({checkboxField:v,subtitleLangKey:g?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text",noCheckboxSubtitle:!0});g||f.container.classList.add("is-disabled"),(u||t).content.append(f.container),this.scrollable.append(...[t,u].filter(Boolean).map((e=>e.container)));const y=rc({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:l.value,expiryMonth:l.value.split("/")[0],expiryYear:l.value.split("/")[1],cvc:c.value,cardholderName:null==r?void 0:r.value,country:null==p?void 0:p.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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((n=n.apply(e,t||[])).next())}));var e,t,s,n}});Yl([o,r,l,c,p,m].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,l.value=e.expiryFull,c.value=e.cvc,r&&(r.value=e.cardholderName),p&&(p.value=e.country),m&&(m.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,bl.Z)(o.input)}}class tc extends A.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 Br({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new To.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(b.I.Neutral)};s.input.addEventListener("input",n);const a=rc({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{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,bl.Z)(s.input)}}class ic extends A.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,l,c,d,h,u;if(e.pFlags.shipping_address_requested){i=new Br({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new b.Z({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new b.Z({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new b.Z({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new b.Z({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=Jl(!0,!0);r=e.countryInputField,l=e.postcodeInputField,i.content.append(...[s,n,a,o,r,l].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){c=new Br({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=Eo(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(d=new b.Z({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new b.Z({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new Er.Z({required:!0,validate:i})),c.content.append(...[d,h,u].filter(Boolean).map((e=>e.container)))}const p=new ji.Z({text:"PaymentShippingSave",checked:!0}),m=new Ni({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo",noCheckboxSubtitle:!0});(c||i).content.append(m.container),this.scrollable.append(...[i,c].filter(Boolean).map((e=>e.container)));const g=rc({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,c=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:l.value},name:null==d?void 0:d.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:l,REQ_INFO_NAME_INVALID:d,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(c.next(e))}catch(e){n(e)}}function o(e){try{r(c.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((c=c.apply(e,t||[])).next())}));var e,t,i,c}});if(this.body.append(this.btnConfirmOnEnter=g),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),l.value=e.post_code),t.name&&d&&(d.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:v}=Yl([s,n,a,o,r,l,d,h,u].filter(Boolean),(e=>{g.disabled=!e}));let f;v(),this.show(),f=this.focus?{name:d,email:h,phone:u}[this.focus]:s,f&&(0,bl.Z)(f.input)}}class sc extends A.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 Br({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Ni({radioField:new Vi({text:e.title,name:"shipping-method",value:e.id}),subtitle:Ea(Ie(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=Ui(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=rc({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 nc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const ac=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function oc(e){if(ac.includes(e))return`assets/img/${e}.svg`}function rc(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new v.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),a=s.key,o=(0,M.Z)("btn-primary btn-color-primary payment-item-pay");return o.append(s.element),(0,n.fc)(o,(()=>nc(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,be.y)(o),n=(0,mi.Z)([o],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),n(),s.compareAndUpdate({key:a}),i.remove()}})))),o}class lc extends A.Z{constructor(e,t,i){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.tipButtonsMap=new Map,this.d()}d(){return nc(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let e=!1;const t=()=>{e||(e=!0,Le&&Le.hide(),this.hide())};let{paymentForm:i,message:a}=this;a&&this.listenerSetter.add(s.Z)("payment_sent",(({peerId:e,mid:i})=>{a.peerId===e&&a.mid===i&&t()}));const o=null==a?void 0:a.media,l=o?!!o.receipt_msg_id:"payments.paymentReceipt"===i._,d=o?o.pFlags.test:i.invoice.pFlags.test,h=o?o.photo:i.photo,u=o?o.title:i.title,p=o?o.description:i.description;(0,v.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),d&&this.title.append(" (Test)");const m="payment-item",f=document.createElement("div");f.classList.add(m);const y=m+"-details",b=document.createElement("div");let w;b.classList.add(y),h&&(w=document.createElement("div"),w.classList.add(y+"-photo","media-container-contain"),dt({photo:h,container:w,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(w));const S=y+"-lines",C=document.createElement("div");C.classList.add(S);const L=document.createElement("div");L.classList.add(S+"-title");const I=document.createElement("div");I.classList.add(S+"-description");const E=document.createElement("div");E.classList.add(S+"-bot-name"),C.append(L,I,E),(0,c.Z)(L,(0,Zt.Z)(u)),(0,c.Z)(I,(0,Zt.Z)(p));const P=new Ot;E.append(P.element),b.append(C),f.append(b),this.scrollable.append(f);const k=document.createElement("div");k.classList.add(m+"-preloader-container"),(0,be.y)(k,!0),this.scrollable.container.append(k);const T=this.inputInvoice;i||(i=l?yield this.managers.appPaymentsManager.getPaymentReceipt(a.peerId,o.receipt_msg_id):yield this.managers.appPaymentsManager.getPaymentForm(T),this.paymentForm=i);let x=i.saved_info||i.info;const _=i.saved_credentials;let[A,Z,F]=yield Promise.all([!l&&x&&this.managers.appPaymentsManager.validateRequestedInfo(T,x),_&&this.managers.passwordManager.getState(),js({peerId:i.provider_id.toPeerId()})]);console.log(i,A),yield P.update({peerId:i.bot_id.toPeerId()}),k.remove(),this.element.classList.remove("is-loading");const D=(e,t)=>Ea(e,B,t),{invoice:R}=i,B=R.currency,N=R.pFlags.recurring&&!l;yield P.update({peerId:i.bot_id.toPeerId()});const U=N?yield js({peerId:i.bot_id.toPeerId()}):void 0;k.remove(),this.element.classList.remove("is-loading");const O=()=>{const e=document.createElement("div");e.classList.add(H+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},H=m+"-prices",z=document.createElement("div");z.classList.add(H);const G=e=>e.map((e=>{const{amount:t,label:i}=e,s=O();s.left.textContent=i;const n=D(t);return s.right.textContent=n,s.label})),V=G(R.prices);let K=()=>0,W=0;const $=()=>{const e=D(Q+K()+W);q.right.textContent=e,j.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},j=new v.ZP.IntlElement,q=O();q.label.classList.add("is-total"),(0,v.$d)(q.left,"PaymentTransactionTotal");const Q=Ie(R.prices.map((({amount:e})=>+e)),0),Y=void 0!==R.max_tip_amount&&!l||!!i.tip_amount;if(Y){const e=m+"-tips",t=Ma[B];K=()=>+s().replace(/\D/g,"");const s=()=>d.value,a=()=>{const e=wt(s(),`500 16px ${yt}`);d.style.width=e+"px"},o=e=>{e=Math.min(+e,+R.max_tip_amount);const t=D(e,!0);d.value=t,document.activeElement===d&&(0,bl.Z)(d),b&&b();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),a(),$()},c=O();(0,v.$d)(c.left,l?"PaymentTip":"PaymentTipOptional");const d=document.createElement("input");d.type="tel",d.classList.add("input-clear",e+"-input"),c.right.append(d),l?c.label.classList.add("disable-hover"):c.label.style.cursor="text",c.label.addEventListener("mousedown",(e=>{(0,vi.Z)(e.target,d)||(0,bl.Z)(d)}));const h=d instanceof HTMLInputElement?1:2,u=()=>{f?--f:(f=h,(0,bl.Z)(d))},p=()=>{setTimeout((()=>{f=h,(0,bl.Z)(d),document.addEventListener("selectionchange",u)}),0)},g=()=>{d.addEventListener("focus",p,{once:!0}),document.removeEventListener("selectionchange",u)};let f;d.addEventListener("focusout",g),g(),d.addEventListener("input",(()=>{o(K())}));const y=[t.symbol,t.space_between?" ":""];let b;if(t.symbol_left||y.reverse(),c.right[t.symbol_left?"prepend":"append"](y.join("")),V.push(c.label),l)o(i.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=R.suggested_tip_amounts.map((e=>{const t=(0,M.Z)(i,{noRipple:!0});return t.textContent=D(e),this.tipButtonsMap.set(+e,t),t}));b=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,n.fc)(t,(e=>{const t=(0,r.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{b(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}o(s)})),o(0),t.append(...s),V.push(t)}}else $();V.push(q.label),z.append(...V),f.append(z);const J=(e,t)=>nc(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield Ze(i,oc(t));let s=e.media;s?(0,g.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i))})),X=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Ni(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ee=(e,t)=>{if(e.title.textContent=t,!t){const t=v.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,v.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},te=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=yl(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ae.title.classList.remove("tgico","tgico-card_outline"),J(ae,s||t.toLowerCase()),ee(ae,i)},ie=()=>{new ec(i,se).addEventListener("finish",(({token:e,card:t})=>{ne=e,se=t,te(t)}))};let se,ne;const ae=X({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:ie,icon:"card_outline"});ae.container.classList.add(m+"-method-row"),_?te(_):i.credentials_title&&te({title:i.credentials_title});const oe=X({title:F,subtitleLangKey:"PaymentCheckoutProvider"}),re=new Wm;let le,ce,de,he,ue,pe,me,ge;re.classList.add("avatar-32"),oe.createMedia("small").append(re),re.updateWithOptions({peerId:i.provider_id.toPeerId()});const ve=R.pFlags.shipping_address_requested?e=>{if(!e)return ue.subtitle.classList.add("hide"),void(0,g.Z)(ue.title,(0,v.ag)("PaymentShippingAddress"));const t=e.shipping_address;ee(le,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),ue.container.classList.toggle("hide",!A&&!l)}:void 0,fe=e=>{ve&&ve(e),ce&&ee(ce,e.name),de&&ee(de,e.email),he&&ee(he,e.phone&&"+"+(0,Ms.u)(e.phone).formatted)};if(l||(me=e=>{new ic(i,T,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{A=t,x=i.saved_info=e,fe(e)}))}),R.pFlags.shipping_address_requested){const e=e=>{const i=new ol(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return W=0,$(),i.restore(),void this.onContentUpdate();pe=e,ee(ue,e.title),W=Ie(e.prices.map((({amount:e})=>+e)),0),t=G(e.prices);let s=q.label;Y&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),$(),i.restore(),this.onContentUpdate()};let t;le=X({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&me.bind(null,void 0)}),ue=X({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(ge=()=>{new sc(i,A,pe).addEventListener("finish",(t=>{e(t)}))})}),ue.container.classList.add("hide");const s=i.shipping;s&&e(s)}R.pFlags.name_requested&&(ce=X({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&me.bind(null,"name")})),R.pFlags.email_requested&&(de=X({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&me.bind(null,"email")})),R.pFlags.phone_requested&&(he=X({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&me.bind(null,"phone")})),x&&fe(x);const ye=[ae,oe,le,ue,ce,de,he].filter(Boolean),we=N&&new ji.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,ii.Z)(R.recurring_terms_url),U]}),Se=N&&X({checkboxField:we,noCheckboxSubtitle:!0}),Ce=N?[document.createElement("hr"),Se.container]:[];let Le,Me;this.scrollable.append(...[document.createElement("hr"),...ye.map((e=>e.container)),...Ce].filter(Boolean));const Ee=()=>{Pe.disabled=!(!we||we.checked)};let Pe;Pe=rc(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const s=R.pFlags.name_requested&&!(null==x?void 0:x.name)?"name":R.pFlags.email_requested&&!(null==x?void 0:x.email)?"email":R.pFlags.phone_requested&&!(null==x?void 0:x.phone)?"phone":void 0;if(R.pFlags.shipping_address_requested){if(!A)return void me();if(!pe)return void ge()}else if(s)return void me(s);return se||Me?Promise.resolve().then((()=>nc(this,void 0,void 0,(function*(){const s=Me?{_:"inputPaymentCredentialsSaved",id:_.id,tmp_password:Me.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(ne.token?ne:{type:ne.type,id:ne.id})},pFlags:{save:se.save||void 0}};try{const n=yield this.managers.appPaymentsManager.sendPaymentForm(T,i.form_id,null==A?void 0:A.id,null==pe?void 0:pe.id,s,K());"payments.paymentResult"===n._?t():(Le=new ql(n.url),Le.addEventListener("finish",(()=>{Le=void 0,t()})),yield new Promise(((t,i)=>{Le.addEventListener("close",(()=>{if(Le=void 0,e)t();else{const e=new Error("payment not finished");e.handled=!0,i(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?(Li({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(Z=Me=void 0,(0,n.tH)(Pe),e.handled=!0),e}})))):_?void Promise.resolve(null!=Z?Z:this.managers.passwordManager.getState()).then((e=>{new tc(_.title,e).addEventListener("finish",(e=>{Z=void 0,Me=e,(0,n.tH)(Pe);const t=e.valid_until-(0,wl.Z)(!0)-5;setTimeout((()=>{Me===e&&(Me=void 0)}),1e3*t)}))})):void ie()},textEl:j}),Ee(),we&&we.input.addEventListener("change",Ee),this.body.append(this.btnConfirmOnEnter=Pe),this.onContentUpdate()}))}}var cc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const dc=new Set(["messageActionHistoryClear","messageActionChatCreate"]),hc=new Set;nl.Z&&hc.add("messageActionPhoneCall");const uc=void 0;let pc=uc,mc=0;const gc=3,vc=new Error("peer changed");function fc(e){return Math.max(...e)}class yc{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.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=(0,Ti.k)(),this.replyFollowHistory=[],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.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;e&&e.random_id&&(delete e.random_id,this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),e.random_id))}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,He.e9)().then((()=>{(0,Ne.Z)(t)&&(0,n.tH)(t)}))}},this.onBubblesMouseMove=e=>cc(this,void 0,void 0,(function*(){const t=(0,r.Z)(e.target,"bubble-content");if(t&&!this.chat.selection.isSelecting){const e=(0,r.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 o=yield this.chat.getMessage(+e.dataset.mid);o=yield this.managers.appMessagesManager.getGroupsFirstMessage(o);const r=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(o),(0,on.Z)(400)]).then((([e])=>{const t=e[0];t?ta({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:r,group:km,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,ai.Z)(e),e.addEventListener("firstFrame",(()=>{r()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,n.fc)(s,(e=>{(0,a.Z)(e),this.managers.appReactionsManager.sendReaction(o,t.reaction),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),ft.Z):s.remove()}))}}else this.unhoverPrevious()})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>cc(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,r.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,r.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==le.NM?this.chat.appImManager.setInnerPeer({peerId:t}):Ci(v.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,r.Z)(i,"bubble-content")){if(s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){A.Z.createPopup(Vr,new Date(+e),this.onDatePick).show();break}return}if(!gi.Z&&(0,r.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,a.Z)(e),gi.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,r.Z)(i,"grouped-item")||s)}const o=(0,r.Z)(i,"contact");if(o)return void this.chat.appImManager.setInnerPeer({peerId:o.dataset.peerId.toPeerId()});const c=(0,r.Z)(i,"bubble-call");if(c)return void this.chat.appImManager.callUser(this.peerId.toUserId(),c.dataset.type);if((0,r.Z)(i,"is-buy")){(0,a.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new lc(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const d=(0,l.Z)(i,"REACTION-ELEMENT");if(d){if((0,a.Z)(e),d.classList.contains("is-inactive"))return;const t=d.parentElement,i=t.getReactionCount(d),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}if((0,r.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===le.hj){const t=yield this.chat.getMessage(e),i=(0,es.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(i,n,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 h=(0,r.Z)(i,"is-via");if(h){const t=h.querySelector(".peer-title");if(i===t||(0,vi.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,a.Z)(e)}}const u=(0,r.Z)(i,"peer-title")||(0,l.Z)(i,"AVATAR-ELEMENT")||(0,is.Z)(i,"data-saved-from");if(u&&u!==s){i=u||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 lc(t,e)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==le.NM?this.chat.appImManager.setInnerPeer({peerId:t}):Ci(v.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 qn(i.stickerSetInput).show())}const p=(0,r.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")||p&&!p.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,r.Z)(i,"album-item")||(0,r.Z)(i,"document-container"),o=(t||s).querySelector(".preloader-container");if(o)return(0,n.tH)(o),void(0,a.Z)(e);(0,a.Z)(e);const l=+(t||s).dataset.mid,c=yield this.chat.getMessage(l);if(!c)return void this.log.warn("no message by messageId:",l);const d="webpage",h=s.classList.contains(d),u=p?e=>Rm.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),m=[],g=h?[l]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>cc(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,Se.Z)(t);return i&&u(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));g.forEach((e=>{let t;p?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(p)i.forEach((e=>{m.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,r.Z)(i,"media-container-aspecter"))return;const n=(0,r.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),m.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),m.sort(((e,t)=>e.mid-t.mid));const v=m.findIndex((e=>e.mid===l));return R.ZP&&this.log("open mediaViewer single with ids:",g,v,m),m[v]?void(new Rm).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:p?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!h,isScheduled:"scheduled"===this.chat.type}).openMedia(c,m[v].element,0,!0,m.slice(0,v),m.slice(v+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,l.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 ja({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,r.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.replyFollowHistory.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,es.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)=>{var i,s;if(this.isHeavyAnimationInProgress){if(this.sliceViewportDebounced&&this.sliceViewportDebounced.clearTimeout(),this.scrolledDown&&!e)return}else this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),this.sliceViewportDebounced&&this.sliceViewportDebounced(),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const n=null!==(i=null==t?void 0:t.distanceToEnd)&&void 0!==i?i:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&n>0||t)&&(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!==(s=null==t?void 0:t.duration)&&void 0!==s?s:0))),n<300&&(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.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 I.Z,this.constructBubbles(),this.bubbleGroups=new Gr(this.chat),this.preloader=new Ue({cancelable:!1}),this.lazyLoadQueue=new ye,this.lazyLoadQueue.queueId=++mc,this.listenerSetter.add(s.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>cc(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:n}=i,a=this.bubbles[n];if(!a)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[n]!==a)return;const o=this.bubbleGroups.getItemByBubble(a);if(!o)return;if(o.mid===n)return;if(t){const e=o.group,r=this.bubbleGroups.createItem(a,i),l=this.bubbleGroups.itemsArr.slice();(0,T.Z)(l,o);const c=this.bubbleGroups.findGroupSiblingByItem(r,l);if(e===(null==c?void 0:c.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&r.dateTimestamp===o.dateTimestamp||this.peerId===s.Z.myId&&t&&r.dateTimestamp===o.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(a,n)}this.bubbleGroups.removeAndUnmountBubble(a);const{groups:r}=this.groupBubbles([{bubble:a,message:i}]);this.bubbleGroups.mountUnmountGroups(r),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(s.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(s.Z)("message_sent",(e=>cc(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:n,mid:a,message:o}=e;if(this.chat.messagesStorageKey!==t)return;const l=this.bubbles,c=l[i];if(c){const e=l[i];l[a]=e,e.dataset.mid=""+a,delete l[i],(0,Be.T2)((()=>{const t=+e.dataset.mid;l[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===s.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(a)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=n.date-10&&this.deleteMessagesByIds([a]),!c)return;let d,h;const u=o.grouped_id;if(u){d=yield this.managers.appMessagesManager.getMessagesByAlbum(u);const e=d.map((({mid:e})=>e));if(!e.length||fc(e)!==a||l[a]!==c)return;if(l[a]!==c)return;h=Array.from(c.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else d=[o],h=[i];const p=Array.from(c.querySelectorAll("reactions-element"));p.length&&p.forEach((e=>{e.changeMessage(o)})),d.forEach(((e,t)=>{var i,s,a,o,l;if(!e)return;const d=h[t],p=e.mid,m=c.querySelector(`.document-container[data-mid="${p}"]`)||c;if("message"!==e._)return;if(e.replies){const t=c.querySelector("replies-element");t&&(t.message=e,t.init())}const g=null!==(i=e.media)&&void 0!==i?i:{},v=g.document,f=g.poll,y=g.webpage;if(v){const t=m.querySelector(`.document-container[data-mid="${d}"] .document`);if(t){const i=(0,r.Z)(t,"document-container");!(null===(o=null===(a=null===(s=n.media)||void 0===s?void 0:s.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=v.thumbs)||void 0===l?void 0:l.length)&&(0,He.e9)().then((()=>cc(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield ti({message:e});t.replaceWith(s),i&&s.querySelector(".document").append(i)})))),i&&(i.dataset.mid=""+p)}const i=m.querySelector(`audio-element[data-mid="${d}"], .document[data-doc-id="${d}"], .media-round[data-mid="${d}"]`);i&&(i instanceof Wt||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+v.id,i.doc=v))}else if(f){const t=m.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+f.id),t.setAttribute("message-id",""+p))}else y&&!m.querySelector(".web")&&(0,He.e9)().then((()=>{this.safeRenderMessage(e,!0,m),this.scrollToBubbleIfLast(m)}));if(u){const e=m.querySelector(`.grouped-item[data-mid="${d}"]`)||m;e&&(e.dataset.mid=""+p)}}))})))),this.listenerSetter.add(s.Z)("message_edit",(({storageKey:e,message:t})=>cc(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,He.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(s.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=fc(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=fc(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),this.listenerSetter.add(s.Z)("peer_title_edit",(e=>cc(this,void 0,void 0,(function*(){var t;if(e.isUser()){const i=this.getMiddleware(),s=yield this.managers.appUsersManager.getUser(e.toUserId());if(!i())return;const n=null===(t=null==s?void 0:s.pFlags)||void 0===t?void 0:t.premium,a=this.bubbleGroups.groups.filter((t=>{var i;return(null===(i=t.avatar)||void 0===i?void 0:i.peerId)===e}));a.forEach((e=>{e.avatar.classList.toggle("is-premium",n),e.avatar.classList.toggle("tgico-star",n)}))}})))),"scheduled"!==this.chat.type&&this.listenerSetter.add(s.Z)("messages_reactions",(e=>cc(this,void 0,void 0,(function*(){let t;const i=e.map((({message:e,changedResults:t})=>cc(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=$r.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(s.Z)("messages_downloaded",(({peerId:e,mids:t})=>cc(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,He.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,Mn.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})=>cc(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);Jr.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),xn({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter}),(0,n.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,l.Z)(e.target,"CODE");return t?((0,a.Z)(e),Oi(t.textContent),void Li({langPackKey:"TextCopied"})):void 0})),this.stickyIntersector=new an(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})),Je.IS_SAFARI||(this.sliceViewportDebounced=(0,Ki.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,He.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,i&&i()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),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 I.Z),R.ZP&&this.listenerSetter.add(e)("dblclick",(e=>cc(this,void 0,void 0,(function*(){const t=(0,r.Z)(e.target,"grouped-item")||(0,r.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),"pinned"!==this.chat.type&&"scheduled"!==this.chat.type)if(Je.IS_MOBILE){if(gi.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o=!1;Wa({element:e,verifyTouchTarget:e=>cc(this,void 0,void 0,(function*(){return!(this.chat.selection.isSelecting||!(yield this.chat.canSend())||(n=(0,r.Z)(e.target,"bubble"),n&&(Re(n,t,!0,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)),!n))})),onSwipe:(e,t)=>{o=e>=s,o&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(i,e));n.style.transform=`translateX(${r}px)`,Zi()},onReset:()=>{const e=n;Re(e,t,!1,250,(()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())})),(0,Be.T2)((()=>{if(e.style.transform="",o){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),o=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>cc(this,void 0,void 0,(function*(){if(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(s.Z)("history_append",(({storageKey:e,message:t})=>cc(this,void 0,void 0,(function*(){if(e===this.chat.messagesStorageKey&&(this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId(),s.Z.settings.animationsEnabled)){const e=this.chat.gradientRenderer;e&&e.toNextPosition()}})))),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(s.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,He.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(s.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(s.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(s.Z)("chat_update",(e=>cc(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e()))})))),this.listenerSetter.add(s.Z)("settings_updated",(({key:e})=>cc(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,no.Z)(this.bubbles,"desc").map((e=>cc(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(s.Z)("messages_views",(e=>{(0,Be.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=Zr(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}t&&t.restore()}))})),this.observer=new rl({root:this.scrollable.container}),this.listenerSetter.add(this.chat.appImManager)("chat_changing",(({to:e})=>{const t=e!==this.chat,i=()=>{this.observer.toggleObservingNew(t)};t?i():setTimeout((()=>{i()}),400)})),this.sendViewCountersDebounced=(0,Ki.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0)}get peerId(){return this.chat.peerId}createScrollSaver(e=!0){return new ol(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,l=this.scrollable.isScrolledDown;r===t||s&&l||(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},l=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})},c=this.resizeObserver=new ResizeObserver((e=>{if(s)return void l(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let c=r+a;const d=c%1;if(c-=d,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void l(!1);if(n+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.setScrollTopSilently(e)}l(!1),a=d,t=o}));c.observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(Ii)("toggle",this.unhoverPrevious),this.listenerSetter.add(Un.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){Re(e,"is-visible",t,200,t?void 0:()=>{e.remove()},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=dl.Z.getFocusPromise().then((()=>cc(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)ll(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),R.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())}))}))))}constructPinnedHelpers(){this.listenerSetter.add(s.Z)("peer_pinned_messages",(e=>{const{peerId:t,mids:i,pinned:s}=e;t===this.peerId&&i&&(s||this.deleteMessagesByIds(i))}))}constructScheduledHelpers(){const e=()=>cc(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(s.Z)("scheduled_new",(t=>{t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(s.Z)("scheduled_delete",(({peerId:t,mids:i})=>{t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}onGoDownClick(){return cc(this,void 0,void 0,(function*(){if(!this.replyFollowHistory.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.replyFollowHistory.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=as.height/2>e.top}else s&&(a=!1);a&&this.replyFollowHistory.splice(this.replyFollowHistory.indexOf(e),1)})),this.replyFollowHistory.sort(((e,t)=>t-e));const s=this.replyFollowHistory.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=el(this.scrollable.container,e,"center");return t&&(t=(0,r.Z)(t,"bubble")),t}getGroupedBubble(e){return cc(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 cc(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,no.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&&(e?(R.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)):(R.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 m.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),gi.Z}updateUnreadByDialog(){return cc(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===s.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"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}deleteMessagesByIds(e,t=!0,i){let s=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(s=!0,delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(t),this.observer&&(this.observer.unobserve(t,this.unreadedObserverCallback),this.unreaded.delete(t),this.observer.unobserve(t,this.viewsObserverCallback),this.viewsMids.delete(e),this.observer.unobserve(t,this.stickerEffectObserverCallback)),this.emptyPlaceholderBubble===t&&(this.emptyPlaceholderBubble=void 0))})),s&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),p.Z.checkAnimations(!1,km),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}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(ft.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return cc(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>cc(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){const t=null==e?void 0:e.reply_to;if(!t||(t.reply_to_top_id||t.reply_to_msg_id)!==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,r.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.group.firstItem===e&&(0,Cn.Z)(e.group.container)===(this.stickyIntersector?gc:1)&&(a=e.group.container.parentElement)}const o=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),l=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:o?({rect:e})=>{let t=as.height;return t-=this.container.offsetTop,t-=d.Z.isMobile||as.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{this.onScroll(!0,e)}});return i===ts.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),l}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return cc(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 cc(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,v.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===il)i=(0,v.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new v.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,v.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){const{date:t,dateTimestamp:i}=this.getDateForDateContainer(e);if(!this.dateMessages[i]){const s=this.createDateBubble(e,t),n=this.createDateBubble(e,t);n.classList.add("is-fake");const a=document.createElement("section");a.className="bubbles-date-group",a.append(s,n),this.dateMessages[i]={div:s,container:a,firstTimestamp:t.getTime()};const o=(0,no.Z)(this.dateMessages,"asc"),r=o.length;let l,c=0;for(;cthis.setPeerTempId===a,c=hl(l,vc);e||(yield c(this.chat.onChangePeer(c)));const d=this.chat.type;("scheduled"===d||this.chat.isRestricted)&&(i=0);const h=yield c(this.chat.getHistoryStorage()),u="pinned"===d?yield c(this.managers.appMessagesManager.getPinnedMessagesMaxId(t)):null!==(n=h.maxId)&&void 0!==n?n:0,m=void 0!==i;let v,f,y,b=0;if(!m)if(e||(f=this.chat.appImManager.getChatSavedPosition(this.chat)),f);else if(u){b=yield c(this.managers.appMessagesManager.getReadMaxIdIfUnread(t,this.chat.threadId));const s=yield c(this.managers.appMessagesManager.getDialogOnly(t));if(!b||e||s&&1===s.unread_count)i=u;else{const e=h.history.findSliceOffset(b);e&&e.slice.isEnd(Xr.D.Bottom)&&(y=e.slice[e.offset-25]||e.slice[0]||b),v=!m,i=b}}const w=i!==u;if(void 0===s&&(yield c(this.chat.isStartButtonNeeded()))&&(s=le.gZ),e){const e=yield c(this.getMountedBubble(i));if(e)return m?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",i,!1)):u&&!w&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",i,!0)),void 0!==s&&this.chat.input.setStartParam(s),null}else this.peerId&&(this.lazyLoadQueue.queueId=++mc,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.replyFollowHistory.length=0,this.passEntities={messageEntityBotCommand:(yield c(this.managers.appPeersManager.isAnyGroup(t)))||(yield c(this.managers.appUsersManager.isBot(t)))};R.ZP&&r("setPeer peerId:",t,h,i,u);const S=null!=y?y:w||"scheduled"===d||this.chat.isRestricted?0:u;let C=0;if(e){const e=this.getBubbleByPoint("bottom");e&&(C=+e.dataset.mid),C<=0&&(C=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const L=this.chatInner,I=this.emptyPlaceholderBubble;this.cleanup();const M=this.chatInner=document.createElement("div");e?(M.className=L.className,M.classList.remove("disable-hover","is-scrolling")):M.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const E=e||u&&w||m,P=C>0&&(!i||Cthis.performHistoryResult({history:f.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield c(this.getHistory1(i,!0,w,S)),this.setPeerCached=x.cached,r.warn("got history");const{promise:_,cached:A}=x;A||e||(yield c(this.chat.finishPeerChange(m,w,i,s)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),p.Z.lockGroup(km);const Z=c(_).then((()=>cc(this,void 0,void 0,(function*(){r.warn("promise fulfilled");const n=E?yield c(i?this.getMountedBubble(i):{bubble:this.getLastBubble()}):void 0;A&&!e&&(r.warn("finishing peer change"),yield c(this.chat.finishPeerChange(m,w,i,s)),r.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,g.Z)(a.container,M),I&&this.cleanupPlaceholders(I),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!m&&"chat"===this.chat.type&&this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(0),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),r.warn("mounted chat",this.chatInner===M,this.chatInner.parentElement,performance.now()-o),p.Z.unlockGroup(km),p.Z.checkAnimations(!1,km),this.lazyLoadQueue.unlock(),f)a.setScrollTopSilently(f.top);else if(E){let t;if(k)a.setScrollTopSilently(99999);else if(T){const e=this.setTopPadding();e.isPaddingNeeded&&(t=e.unsetPadding),a.setScrollTopSilently(0)}let s,o=v&&this.firstUnreadBubble||(null==n?void 0:n.bubble);if((null==o?void 0:o.parentElement)||(o=this.findNextMountedBubbleByMsgId(i,!1)||this.findNextMountedBubbleByMsgId(i,!0)),o){const t=this.getLastBubble(),i=v?"start":w||m||t!==o?"center":"end";s="end"===i&&t===o&&e?this.scrollToEnd():this.scrollToBubble(o,i,e?void 0:ts.f.Static),!v&&m&&this.highlightBubble(o)}t&&(s||Promise.resolve()).then((()=>{t()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const l=Promise.all([Z,(0,He.e9)()]);if(l.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",i,!w),Promise.all([this.setFetchReactionsInterval(l),this.setFetchHistoryInterval({afterSetPromise:l,lastMsgId:i,samePeer:e,savedPosition:f,topMessage:u})]).then((()=>{r("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&u&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===d){const e=yield c(this.managers.appMessagesManager.getDialogOnly(t));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(t,!0)}})))).catch((e=>{throw r.error("getHistory promise error:",e),l()||this.preloader.detach(),e}));return{cached:A,promise:Z}}))}setFetchReactionsInterval(e){return cc(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(yield this.managers.appPeersManager.isChannel(this.peerId)){const i=()=>cc(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,He.e9)(),(0,on.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return cc(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,a=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!a)return;if(yield i,!e())return;if(this.setLoaded("bottom",!1),this.scrollable.checkForTriggers(),!a)return;const o=()=>{this.fetchNewPromise=new Promise((i=>cc(this,void 0,void 0,(function*(){e()&&(yield this.managers.appMessagesManager.isFetchIntervalNeeded(t))?this.managers.appMessagesManager.getNewHistory(t,this.chat.threadId).then((t=>{if(!e()||!t)return void i();const{isBottomEnd:s}=t;this.scrollable.loadedAll.bottom&&this.scrollable.loadedAll.bottom!==s&&(this.setLoaded("bottom",s),this.onScroll()),setTimeout(o,3e4),i()})):i()})))).finally((()=>{this.fetchNewPromise=void 0}))};n?setTimeout(o,3e4):o()}))}onScrolledAllDown(){return cc(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 cc(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.managers.appPeersManager.isChannel(this.peerId),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.messagesQueue.push(e),this.setMessagesQueuePromise()}setMessagesQueuePromise(){if(!this.messagesQueue.length)return Promise.resolve();if(this.messagesQueuePromise)return this.messagesQueuePromise;const e=this.getMiddleware(),t=this.log.bindPrefix("queue"),i=hl(e,vc),s=()=>cc(this,void 0,void 0,(function*(){var e;t("start");const n=this.messagesQueue.slice();this.messagesQueue.length=0;const a=n.map((e=>{const i=performance.now();return e.then((e=>{t("render message time",performance.now()-i,e)})),e}));let o=yield i(Promise.all(a));const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));o=r(o),t("messages rendered");const l=null===(e=o[0])||void 0===e?void 0:e.reverse,{groups:c,avatarPromises:d}=this.groupBubbles(o.filter((e=>e.updatePosition))),h=o.reduce(((e,i)=>{const s=performance.now(),n=i.promises.slice(),a=n.map((e=>cc(this,void 0,void 0,(function*(){return yield e,performance.now()-s}))));return Promise.all(a).then((e=>{t.groupCollapsed("media message time",performance.now()-s,i,e),e.forEach(((e,i)=>{t("media message time",e,i,n[i])})),t.groupEnd()})),e.push(...i.promises),e}),[]);h.push(...d),t("media promises to call",h,o,this.isHeavyAnimationInProgress),yield i(Promise.all([...h,this.setUnreadDelimiter()])),yield i((0,Be.AD)()),t("media promises end"),o=r(o);const{restoreScroll:u,scrollSaver:p}=this.prepareToSaveScroll(l);this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(p&&p.replaceSaved(t,e),!o.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i.mounted=!1,c.includes(i.group)||c.push(i.group),this.bubblesToReplace.delete(e)}if(this.chat.selection.isSelecting&&o.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),o.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(c),this.updatePlaceholderPosition&&this.updatePlaceholderPosition(),u&&u(),this.messagesQueue.length)return t("have new messages to render"),s();t("end")}));t("setting pause");const n=this.messagesQueuePromise=i((0,on.Z)(0)).then(s).finally((()=>{this.messagesQueuePromise===n&&(this.messagesQueuePromise=null)}));return n}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.middleware.get(e)}safeRenderMessage(e,t,i,s=!0,n){return cc(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware();let o;try{this.renderingMessages.add(e.mid);const r=document.createElement("div");r.dataset.mid=""+e.mid,r.dataset.peerId=""+e.peerId,r.dataset.timestamp=""+e.date,i&&(this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(r,i),this.bubbleGroups.changeBubbleByBubble(i,r)),i=this.bubbles[e.mid]=r;let l=this.renderMessage(e,t,i);n&&(l=n(l,i));const c=l.then((e=>e&&a()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),o=yield c,!a())return;o||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return a()?(this.renderingMessages.delete(e.mid),o):void 0}))}renderMessage(e,t=!1,i){var o,l,h;return cc(this,void 0,void 0,(function*(){const u="message"===e._,p=u&&e.grouped_id;let m,g;const f=p?yield this.managers.appMessagesManager.getMessagesByAlbum(p):void 0,y="pinned"!==this.chat.type;if(p&&y){m=f.map((e=>e.mid));const t=fc(m);if(e.mid!==t)return}u&&(g=p?f[0]:e);const b=this.chat.isOurMessage(e),w=document.createElement("div");w.classList.add("message");const S=document.createElement("div");S.classList.add("bubble-content-wrapper");const C=document.createElement("div");C.classList.add("bubble-content"),i.classList.add("bubble"),S.append(C),i.append(S);const L=!b&&!e.pFlags.out&&(e.pFlags.unread||ll(e));L&&this.observer&&(this.observer.observe(i,this.unreadedObserverCallback),this.unreaded.set(i,e.mid));const I=[],M={bubble:i,promises:I,message:e,reverse:t};if(!("messageService"!==e._||e.action&&hc.has(e.action._))){const t=e.action;if(t){const e=t._;if(dc.has(e)||v.Hz.hasOwnProperty(e)&&!v.Hz[e])return}i.className="bubble service",C.innerHTML="";const s=document.createElement("div");if(s.classList.add("service-msg"),t){let i;if("messageActionChannelMigrateFrom"===t._){const e=new Ot;i=e.update({peerId:t.chat_id.toPeerId(!0)}),s.append((0,v.ag)("ChatMigration.From",[e.element]))}else if("messageActionChatMigrateTo"===t._){const e=new Ot;i=e.update({peerId:t.channel_id.toPeerId(!0)}),s.append((0,v.ag)("ChatMigration.To",[e.element]))}else s.append(yield _a(e))}return C.append(s),e.pFlags.is_single&&i.classList.add("is-group-last"),M}let E,P,k=u&&e.media;if(u)if((null==k?void 0:k.document)&&!["video","gif"].includes(k.document.type));else if(p&&y){const e=(0,ul.Z)(f);E=e.message,P=e.totalEntities}else"sticker"!==(null===(o=null==k?void 0:k.document)||void 0===o?void 0:o.type)&&(E=e.message,P=e.totalEntities);else"messageActionPhoneCall"===e.action._&&(k={_:"messageMediaCall",action:e.action});const T=(0,ii.Z)(E,{entities:P,passEntities:this.passEntities});let x=!0,_=!1,A=!0;if(P&&!k){const e=P.filter((e=>"messageEntityEmoji"===e._)),t=E.length;if(e.reduce(((e,t)=>e+t.length),0)===t&&e.length<=3&&P.length===e.length){if(s.Z.settings.emoji.big){const t=yield this.managers.appStickersManager.getAnimatedEmojiSticker(E);if(1===e.length&&!k&&t)k={_:"messageMediaDocument",document:t};else{const t=document.createElement("div");t.classList.add("attachment"),(0,c.Z)(t,T),i.classList.add("emoji-"+e.length+"x"),C.append(t)}i.classList.add("is-message-empty","emoji-big"),_=!0,x=!1,A=!1}i.classList.add("can-have-big-emoji")}}A&&(0,c.Z)(w,T);const Z=Jr.setTime({chatType:this.chat.type,message:e,reactionsMessage:g});if(w.append(Z),C.prepend(w),u&&e.views){if(i.classList.add("channel-post"),!(null===(l=e.fwd_from)||void 0===l?void 0:l.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),C.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const F=u&&e.reply_markup;if(F&&"replyInlineMarkup"===F._&&F.rows&&F.rows.length){const t=F.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach((t=>{const i=t.buttons;if(!i||!i.length)return;const o=document.createElement("div");o.classList.add("reply-markup-row"),i.forEach((t=>{let i,s=(0,ii.Z)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":i=ga((0,ii.Z)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]})).firstElementChild,i.classList.add("is-link");break;case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,n.fc)(i,(i=>{(0,a.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 ja({[this.peerId]:[]},(t=>{e(t)}),!0);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":i=document.createElement("button"),i.classList.add("is-buy"),"messageMediaInvoice"===(null==k?void 0:k._)&&k.receipt_msg_id&&(s=(0,v.ag)("Message.ReplyActionButtonShowReceipt"));break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp","tgico"),"string"==typeof s?i.insertAdjacentHTML("beforeend",s):i.append(s),(0,we.Z)(i),o.append(i)})),s.append(o)})),(0,n.fc)(s,(i=>{let s=i.target;if(s.classList.contains("reply-markup-button")||(s=(0,r.Z)(s,"reply-markup-button")),!s||s.classList.contains("is-link")||s.classList.contains("is-switch-inline")||s.classList.contains("is-buy"))return;(0,a.Z)(i);const n=(0,Cn.Z)(s),o=t[(0,Cn.Z)(s.parentElement)];if(!o.buttons||!o.buttons[n])return void this.log.warn("no such button",o,n,e);const l=o.buttons[n];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,l).then((e=>{"string"==typeof e.message&&e.message.length&&Ci((0,ii.Z)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),x=!1,i.classList.add("with-reply-markup"),S.append(s)}const D=e.pFlags.is_outgoing;if(b){(e.pFlags.unread||D)&&this.unreadOut.add(e.mid);let t="";t=D?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}D&&i.classList.add("is-outgoing");const R=u&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),B=!!R&&e.mid>0;B&&i.classList.add("with-replies");const N=u&&e.fwd_from,U=u&&e.fwdFromId,O=this.chat.isOutMessage(e);let H=C;const z=!(e.viaBotId||e.fromId!==s.Z.myId&&e.pFlags.out);if(k){let t=document.createElement("div");t.classList.add("attachment"),E||i.classList.add("is-message-empty");let n=!1;switch(k._){case"messageMediaPhoto":{const s=k.photo;if(E||(x=!1),z&&i.classList.add("hide-name"),i.classList.add("photo"),y&&p&&1!==m.length){i.classList.add("is-album","is-grouped"),Qt({messages:f,attachmentDiv:t,middleware:this.getMiddleware(),isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});break}const n=!Je.IS_ANDROID&&x&&!B&&!1;n&&i.classList.add("with-media-tail"),dt({photo:s,message:e,container:t,withTail:n,isOut:O,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,autoDownloadSize:this.chat.autoDownload.photo});break}case"messageMediaWebPage":{n=!0;const t=k.webpage;if("webPage"!==t._)break;i.classList.add("webpage");const s=document.createElement("div");s.classList.add("web");const a=document.createElement("div");let o,r;a.classList.add("quote");const l=t.photo;(l||t.document)&&(o=document.createElement("div"),o.classList.add("preview-resizer"),r=document.createElement("div"),r.classList.add("preview"),o.append(r));const h=document.createElement("div");h.classList.add("quote-text");const u=t.document;if(u)if("gif"===u.type||"video"===u.type||"round"===u.type){const t="round"===u.type?d.Z.active.round:d.Z.active.webpage;"round"===u.type?(i.classList.add("round"),r.classList.add("is-round")):i.classList.add("video"),qt({doc:u,container:r,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:O,group:km,loadPromises:I,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield ti({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:I,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}}});r.append(t),r.classList.add("preview-with-document"),h.classList.add("has-document")}let p;if(o&&h.append(o),t.site_name){const e=ga((0,ii.Z)(t.url)).firstElementChild;e.classList.add("webpage-name");const i=document.createElement("strong");(0,c.Z)(i,(0,Zt.Z)(t.site_name)),e.textContent="",e.append(i),h.append(e),p=e}const m=oo(t);if(m.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,c.Z)(t,m),e.append(t),h.append(e),p=e}const g=ao(t);if(g.textContent){const e=document.createElement("div");e.classList.add("text"),(0,c.Z)(e,g),h.append(e),p=e}if(a.append(h),l&&!u){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&p?(i.classList.add("is-square-photo"),s=!0,lt(l,r,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),dt({photo:l,message:e,container:r,boxWidth:s?0:d.Z.active.webpage.width,boxHeight:s?0:d.Z.active.webpage.height,isOut:O,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}s.append(a),w.insertBefore(s,Z);break}case"messageMediaDocument":{const s=k.document;if(s.sticker){i.classList.add("sticker"),x=!1,_=!0,s.animated&&i.classList.add("sticker-animated");const e=d.Z.active,n=i.classList.contains("emoji-big"),a=n?e.emojiSticker:s.animated?e.animatedSticker:e.staticSticker;lt(s,t,a.width,a.height),C.style.minWidth=t.style.width,C.style.minHeight=t.style.height,ta({doc:s,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:km,play:!0,loop:!0,emoji:n?E:void 0,withThumb:!0,loadPromises:I,isOut:O,noPremium:null===(h=null==k?void 0:k.pFlags)||void 0===h?void 0:h.nopremium}),(0,di.Z)(s)&&(L||D)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===s.type||"gif"===s.type||"round"===s.type){const n="round"===s.type;if(n&&(_=!0),!n&&E||(x=!1),z&&i.classList.add("hide-name"),i.classList.add(n?"round":"video"),y&&p&&1!==m.length)i.classList.add("is-album","is-grouped"),Qt({messages:f,attachmentDiv:t,middleware:this.getMiddleware(),isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});else{const a=!Je.IS_ANDROID&&!Je.IS_APPLE&&!n&&x&&!B&&!1;a&&i.classList.add("with-media-tail"),qt({doc:s,container:t,message:e,boxWidth:d.Z.active.regular.width,boxHeight:d.Z.active.regular.height,withTail:a,isOut:O,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:km,loadPromises:I,autoDownload:this.chat.autoDownload,searchContext:n?{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})}}else{const t=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l,useSearch:d,sizeType:h,managers:u}){return si(this,void 0,void 0,(function*(){let d;const p=e?yield n.getMidsByMid(t.mid):[t.mid],m=p.map(((e,t)=>si(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield ti({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:l,sizeType:h,managers:u}),m=document.createElement("div");m.classList.add("document-container"),m.dataset.mid=""+e,m.dataset.peerId=""+i.peerId;const g=document.createElement("div");if(g.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message");const t=(0,ii.Z)(i.message,{entities:i.totalEntities});(0,c.Z)(e,t),g.append(e)}if(p.length>1){const e=document.createElement("div");e.classList.add("document-selection"),m.append(e),m.classList.add("grouped-item"),0===t&&(d=g)}return g.append(s),m.append(g),m})))),g=yield Promise.all(m);return s.append(...g),p.length>1&&i.classList.add("is-multiple-documents","is-grouped"),d}))}({albumMustBeRenderedFull:y,message:e,bubble:i,messageDiv:w,chat:this.chat,loadPromises:I,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===s.type||"audio"===s.type?{peerId:this.peerId,inputFilter:{_:"voice"===s.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName"});t&&(H=t);const a=w.lastElementChild.querySelector(".document-message, .document, .audio");a&&a.append(Z),i.classList.remove("is-message-empty"),w.classList.add((["photo","pdf"].includes(s.type)?"document":s.type||"document")+"-message"),n=!0}break}case"messageMediaCall":{const e=k.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const s=e.pFlags.video?"video":"voice";t.dataset.type=s;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,v.$d)(a,O?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(Ia(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,v.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(a,o),n=!0,i.classList.remove("is-message-empty"),w.classList.add("call-message"),w.append(t);break}case"messageMediaContact":{const e=k,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,n=!0;const s=document.createElement("div");s.className="contact-details";const a=document.createElement("div");a.className="contact-name",a.append((0,Zt.Z)([e.first_name,e.last_name].filter(Boolean).join(" ")));const o=document.createElement("div");o.className="contact-number",o.textContent=e.phone_number?"+"+(0,Ms.u)(e.phone_number).formatted:"Unknown phone number",t.append(s),s.append(a,o);const r=new Wm;r.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),r.classList.add("contact-avatar","avatar-54"),t.prepend(r),i.classList.remove("is-message-empty"),w.classList.add("contact-message"),w.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=s.Z.managers){const i=new ua;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);w.prepend(t),w.classList.add("poll-message");break}case"messageMediaInvoice":{const e=k.pFlags.test,s=k.photo,n=document.createElement(s?"span":"div"),a=document.createDocumentFragment(),o=(0,v.ag)(k.receipt_msg_id?"PaymentReceipt":e?"PaymentTestInvoice":"PaymentInvoice");o.classList.add("text-uppercase");const r=" ‎",l=document.createElement("span");if(l.classList.add("text-bold"),l.textContent=Ea(k.total_amount,k.currency)+r,a.append(l,o),e&&k.receipt_msg_id){const e=document.createElement("span");e.classList.add("text-uppercase","pre-wrap"),e.append(r+"(Test)"),a.append(e)}if((0,c.Z)(n,a),s){const e=d.Z.active.invoice;dt({photo:s,container:t,withTail:!1,isOut:O,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,boxWidth:e.width,boxHeight:e.height}),i.classList.add("photo"),n.classList.add("video-time"),t.append(n)}else t=void 0;const h=document.createElement("div");h.classList.add("bubble-primary-color"),(0,c.Z)(h,(0,Zt.Z)(k.title));const u=(0,Zt.Z)(k.description);w.prepend(...[h,!s&&n,u].filter(Boolean)),i.classList.remove("is-message-empty"),i.classList.add("is-invoice");break}default:t=void 0,i.classList.remove("is-message-empty"),w.append((0,v.ag)(v.nK),Z),this.log.warn("unrecognized media type:",k._,e)}!n&&t&&C.append(t)}_&&i.classList.add("just-media");let G="";const V=e.fromId!==s.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(V||N||e.reply_to_mid){let t,n;const a=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===U,o=N&&!N.from_id;let r;if(e.viaBotId&&(n=document.createElement("span"),n.innerText="@"+(yield this.managers.appUsersManager.getUser(e.viaBotId)).username,n.classList.add("peer-title"),i.classList.add("must-have-name")),o?(t=document.createElement("span"),(0,c.Z)(t,(0,Zt.Z)(N.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new Ot({peerId:U||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&u&&(yield Jr.setReply({chat:this.chat,bubble:i,bubbleContainer:C,message:e})),U||N)if(this.peerId===s.Z.myId||a||i.classList.add("forwarded"),e.savedFrom&&(G=e.savedFrom,t.dataset.savedFrom=G),r=document.createElement("div"),t.dataset.peerId=""+U,this.peerId!==s.Z.myId&&this.peerId!==le.hj&&!a||_){const e=[t];_&&e.unshift(document.createElement("br")),r.append((0,v.ag)("ForwardedFrom",[e]))}else r.style.color=Rs(U,!1),r.append(t);else if(!e.viaBotId)if(!_&&V){r=document.createElement("div"),r.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&r.append(Bt(s.scam)),b||(r.style.color=Rs(e.fromId,!1)),r.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){r?r.append(" "):r=document.createElement("div");const e=document.createElement("span");e.append((0,v.ag)("ViaBot")," ",n),e.classList.add("is-via"),r.append(e)}r&&(r.classList.add("name"),H.append(r))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(G=`${this.chat.peerId}_${e.mid}`),R&&R.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),G&&("pinned"===this.chat.type||N.saved_from_msg_id)&&this.peerId!==le.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),C.append(e),i.dataset.savedFrom=G,i.classList.add("with-beside-button")}return i.classList.add(O?"is-out":"is-in"),B&&Jr.renderReplies({bubble:i,bubbleContainer:C,message:R,messageDiv:w,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue})&&(x=!0),u&&this.appendReactionsElementToBubble(i,e,g),x&&(i.classList.add("can-have-tail"),C.append(bc())),M}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser())return;if(!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new jr;if(n.init(i,"block"),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=Jr.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){return cc(this,void 0,void 0,(function*(){let i=e.history;i=i.slice(),this.needReflowScroll&&(tl(this.scrollable.container),this.needReflowScroll=!1);const s=yield Promise.all(i.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),n=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),s=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!s.isEnd(Xr.D.Bottom)||s.length&&!i.includes(s[0])||(t.bottom=!0),!n.isEnd(Xr.D.Top)||n.length&&!i.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i}=this.setPeerOptions;this.setPeerOptions=void 0,e&&!this.bubbles[i]&&e!==i||(t.bottom=!0)}t.top&&n.push(this.setLoaded("top",!0)),t.bottom&&n.push(this.setLoaded("bottom",!0))}yield Promise.all(n);const a=s.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(a),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional())}))}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 cc(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,no.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 l=r.slice(r.findIndex((e=>o>e))),c=i?[]:[o],d=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();R.ZP&&a("targeting mid:",o,n,e,l.map((e=>(0,ci.Z)(e))),d.map((e=>(0,ci.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,m=(e,t=0)=>{const i=(0,Oe.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 l=r.lastElementChild,c=[l],d=this.bubbleGroups.getItemByBubble(r);if(d&&d.group.avatar&&d.group.lastItem===d&&c.push(d.group.avatar),c.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===l&&(i.resolve(),l.removeEventListener("transitionend",e))};l.addEventListener("transitionend",e)}h.push(...c)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},g=m(l,p),v=m(c),f=m(d,p),y=[g.animationPromise,v.animationPromise,f.animationPromise],b=[g.lastMsDelay,v.lastMsDelay,f.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,Be.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(l.length||c.length||d.length)&&(w=Promise.all(y),(0,He.YW)(w,Math.max(...b)+200).then((()=>{(0,Be.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 cc(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let o,r;if(t.classList.add(i,i+"-"+e),"group"===e?o=(0,v.ag)("GroupEmptyTitle1"):"saved"===e?o=(0,v.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?o=(0,v.ag)("NoMessages"):"noScheduledMessages"===e?o=(0,v.ag)("NoScheduledMessages"):"restricted"===e&&(o=document.createElement("span"),o.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),o.classList.add("center",i+"-title"),s.push(o),"group"===e)s.push((0,v.ag)("GroupEmptyTitle2")),r=[(0,v.ag)("GroupDescription1"),(0,v.ag)("GroupDescription2"),(0,v.ag)("GroupDescription3"),(0,v.ag)("GroupDescription4")];else if("saved"===e)r=[(0,v.ag)("ChatYourSelfDescription1"),(0,v.ag)("ChatYourSelfDescription2"),(0,v.ag)("ChatYourSelfDescription3"),(0,v.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,v.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const o=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>cc(this,void 0,void 0,(function*(){if(!o())return;const i=[];return yield ta({doc:e,div:t,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:km,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,n.fc)(t,(e=>{(0,a.Z)(e),zn.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}r&&(s.push(...r.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?r.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&r.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){return cc(this,void 0,void 0,(function*(){const i=!!e.pFlags.sponsored,a=hl(this.getMiddleware());return this.safeRenderMessage(e,!i,void 0,i,(o=>cc(this,void 0,void 0,(function*(){const{bubble:r}=yield a(o);if(!r)return o;r.classList.add("is-group-last","is-group-first");const l=()=>{this.updatePlaceholderPosition===l&&(this.updatePlaceholderPosition=void 0),u[p](r)};i||(r.classList.add("bubble-first"),r.classList.remove("can-have-tail","is-in"));const c=[],d=yield a(this.managers.appPeersManager.isBot(this.peerId));let h,u=this.container,p="append";if(this.chat.isRestricted)h=this.renderEmptyPlaceholder("restricted",r,e,c);else{if(i){let t,i,s,a;r.classList.add("avoid-selection");const l=this.sponsoredMessage=e.sponsoredMessage,c=(0,es.Z)(l.from_id);l.channel_post?(t="OpenChannelPost",i=(0,cl.Z)(l.channel_post)):l.start_param||d?(t="Chat.Message.ViewBot",s=l.start_param):t=(yield this.managers.appPeersManager.isAnyGroup(c))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",a=l.chat_invite?()=>{new al(l.chat_invite_hash,l.chat_invite)}:l.chat_invite_hash?()=>{const e={_:sl.JOIN_CHAT,invite:l.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:c,lastMsgId:i,startParam:s})};const h=(0,M.Z)("btn-primary btn-primary-transparent bubble-view-button",{text:t});return this.observer.observe(h,this.viewsObserverCallback),a&&(0,n.fc)(h,a),r.querySelector(".bubble-content").prepend(h),o}if(d&&"message"===e._){const e=document.createElement("b");e.append((0,v.ag)("BotInfoTitle")),c.push(e,"\n\n"),u=this.chatInner,p="prepend"}else h=(yield a(this.managers.appPeersManager.isAnyGroup(this.peerId)))&&(yield a(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",r,e,c):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",r,e,c):s.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",r,e,c):this.peerId.isUser()&&!d&&(yield a(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",r,e,c):this.renderEmptyPlaceholder("noMessages",r,e,c)}h&&(yield h),c.length&&r.querySelector(".message, .service-msg").prepend(...c);const m=!!this.messagesQueueOnRenderAdditional,g=this.setPeerCached&&!m;if(g){const e=r.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(ft.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||g||(t=!0),m||t?(this.updatePlaceholderPosition=l,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,Be.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,l()}:this.updatePlaceholderPosition=l,!m&&t){yield a((0,He.e9)());const t=(0,no.Z)(this.bubbles);(0,T.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return this.emptyPlaceholderBubble=r,o}))))}))}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,cl.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return cc(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,ai.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return function({overflowElement:e,selector:t,extraSize:i}){const s=e.getBoundingClientRect(),n=Array.from(e.querySelectorAll(t)),a=[],o=[],r=[];let l=!1;for(const t of n){const i=t.getBoundingClientRect(),n=En(t,e,!1,i,s);let c;n?(l=!0,c=o):c=l?r:a,c.push({element:t,rect:i,visibleRect:n})}if(i&&o.length){const e=o[0].rect.top-i,t=o[o.length-1].rect.bottom+i;for(let t=a.length-1;t>=0;--t){const i=a[t];i.rect.top>=e&&(a.splice(t,1),o.unshift(i))}for(let e=0,i=r.length;e+e.dataset.mid));let o;!!i.length==!!s.length||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(Je.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return cc(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,i?!this.chat.isRestricted&&("bottom"===e&&(yield this.managers.appPeersManager.isBroadcast(this.peerId))&&this.toggleSponsoredMessage(t),"top"===e&&t&&(yield this.managers.appPeersManager.isBot(this.peerId)))?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return cc(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.bubbles[i]&&this.getSponsoredMessagePromise===s)),s=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>cc(this,void 0,void 0,(function*(){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])=>{e()&&(t("rendering",i),this.performHistoryResult({history:[i]},!1))}))})))).finally((()=>{this.getSponsoredMessagePromise=void 0}))}else t("clearing rendered",i),this.deleteMessagesByIds([i]),this.getSponsoredMessagePromise=void 0}))}renderBotPlaceholder(){return cc(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=>cc(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}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return cc(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||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,n=0,a=!1,o){return cc(this,void 0,void 0,(function*(){const r=this.peerId,l=yield this.managers.appPeersManager.isBroadcast(r),c=Math.min(30,as.height/40|0);let d=l?20:Object.keys(this.bubbles).length>0?Math.max(35,c):c;if(void 0!==pc){if(!pc)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--pc}let h,u=0;if(i&&(u=d,t||(d=0)),n&&!i)if("pinned"===this.chat.type)h=[n];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,m=yield this.requestHistory(e,d,u);const g=(null==h?void 0:h.length)&&!m.cached,v=this.isFirstLoad&&u&&!m.cached||g;g&&(p=m.result,m={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const f=e=>cc(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(r)}})),y=e=>(0,He.e9)().then((()=>f(e))).then((()=>(!g&&n&&e.history.unshift(n),this.performHistoryResult(e,t)))),b=e=>{const t=Promise.resolve(e).then((e=>{if(o&&!o())throw vc;if(!a)return y(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(m.cached){if(a)return this.scrollable.onScroll(),null;S=!0,w=y(yield m.result)}else S=!1,w=b(m.result);const C=g?b(p):w;if(v&&s.Z.settings.animationsEnabled){let i=g?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(n,h,g,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return a?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return cc(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?gc: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 bc(){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}class wc{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,n=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:n}=this;let a,o,r;const l=[],c=[],d=A.Z.MANAGERS,h=yield d.appPeersManager.canPinMessage(e),u=(s,a,o)=>{setTimeout((()=>{let s;s=i&&!t?h?d.appMessagesManager.unpinAllMessages(e):d.appMessagesManager.hidePinnedMessages(e):d.appMessagesManager.updatePinnedMessage(e,t,i,o,a),n&&s.then(n)}),300)};if(i){let i="UnpinMessage";t?(a="UnpinMessageAlertTitle",o="Chat.Confirm.Unpin"):h?(a="Popup.Unpin.AllTitle",o="Chat.UnpinAllMessagesConfirmation",r=[""+((yield d.appMessagesManager.getPinnedMessagesCount(e))||1)]):(a="Popup.Unpin.HideTitle",o="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),l.push({langKey:i,isDanger:!0,callback:u})}else{a="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(l.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield d.appChatsManager.isBroadcast(e.toChatId()))?o="PinMessageAlertChannel":(o="PinMessageAlert",c.push({text:"PinNotify",checked:!0}))):(o="PinMessageAlertChat",e===s.Z.myId?l.push({langKey:t,callback:u}):(l.push({langKey:t,callback:e=>u(0,!e.size)}),c.push({text:"PinAlsoFor",textArgs:[new Ot({peerId:e}).element],checked:!0})))}(0,A.x)(l),new qi("popup-delete-chat",{peerId:e,titleLangKey:a,descriptionLangKey:o,descriptionLangArgs:r,buttons:l,checkboxes:c}).show()},new((i=void 0)||(i=Promise))((function(s,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((n=n.apply(e,t||[])).next())}));var e,t,i,n}}function Sc(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}function Cc(e,t,i){return s.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return u.Z.downloadMedia({media:s}).then((n=>{return a=this,o=void 0,l=function*(){const a=d.Z.active.emojiSticker,o=(0,pi.tB)(e),r=yield hi.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:o},"none");r.addEventListener("firstFrame",(()=>{li(s,r.canvas,o),r.remove()}),{once:!0})},new((r=void 0)||(r=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 r?n:new r((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,o||[])).next())}));var a,o,r,l}))}))}class Lc extends qi{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&&Li({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");wo({div:n,emoji:Lc.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.append(n);const a=new b.Z({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}Lc.STICKER_EMOJI="👮‍♀️";class Ic extends qi{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,M.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const a=Cc(Lc.STICKER_EMOJI);(0,n.fc)(this.body,(n=>{const o=(0,r.Z)(n.target,"btn-primary"),l=s[(0,Cn.Z)(o)][1];a.then((()=>{this.hide(),new Lc(e,t,l,i)}))}),{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class Mc extends qi{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,v.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(v.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Ec=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Pc extends A.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return Ec(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message),t=yield this.managers.appMessagesManager.canViewMessageReadParticipants(e),i=new jr,s=Object.assign(Object.assign({},e),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},e.reactions),{pFlags:{},recent_reactions:[]})});s.reactions.results=s.reactions.results.map((e=>Object.assign(Object.assign({},e),{pFlags:{}}))),i.init(s,"block"),i.render(),i.classList.add("no-stripe"),i.classList.remove("has-no-reactions"),i.append(this.btnClose),this.header.append(i);const n=document.createElement("div");n.classList.add("tabs-container"),n.dataset.animation="tabs";const a=new Map;let o=!1;if(s.reactions.results.length){const e=this.createFakeReaction("reactions",s.reactions.results.reduce(((e,t)=>e+t.count),0));i.prepend(e),s.reactions.results.unshift(e.reactionCount),o=!0}let r=!1;if(t)try{const t=yield this.managers.appMessagesManager.getMessageReadParticipants(e.peerId,e.mid);if(!t.length)throw"";const n=this.createFakeReaction("checks",t.length);i.prepend(n),s.reactions.results.unshift(n.reactionCount),r=!0}catch(e){}s.reactions.results.forEach((t=>{const i=new m.ZP(void 0);i.container.classList.add("tabs-tab");const s=new Br({noShadow:!0,noDelimiter:!0}),o=gg.createChatList({dialogSize:72});gg.setListClickListener(o,(()=>{this.hide()}),void 0,!1,!0),s.content.append(o),i.container.append(s.container);const r="checks"!==t.reaction,l="checks"===t.reaction;let c;["checks","reactions"].includes(t.reaction)&&(t.reaction=void 0);const d=new Yi({scrollable:i,getPromise:()=>Ec(this,void 0,void 0,(function*(){const i=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(e,void 0,t.reaction,c,r,l);return c=i.nextOffset,yield Promise.all(i.combined.map((({peerId:e,reaction:t})=>Ec(this,void 0,void 0,(function*(){const{dom:i}=gg.addDialogNew({peerId:e,autonomous:!0,container:o,avatarSize:54,rippleEnabled:!1,meAsSaved:!1});if(t){const e=document.createElement("div");e.classList.add("reacted-list-reaction-icon"),ta({doc:(yield this.managers.appReactionsManager.getReactionCached(t)).static_icon,div:e,width:24,height:24}),i.listEl.append(e)}(0,g.Z)(i.lastMessageSpan,ce(yield this.managers.appUsersManager.getUser(e.toUserId())))}))))),!c}))});a.set(i.container,d),n.append(i.container)})),this.body.append(n);const l=(0,ue.X)(i,n,((e,t)=>{if(e===i.childElementCount-1)return!1;const s=i.children[e],n=l.prevId();-1!==n&&i.children[n].setIsChosen(!1),s.setIsChosen(!0),a.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new Wr;i.init("block"),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 kc="btn-menu-reactions-reaction",Tc=!Je.IS_SAFARI;class xc{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,r.Z)(e.target,kc);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 s=this.widthContainer=document.createElement("div");s.classList.add("btn-menu-reactions-container"),s.classList.add("btn-menu-reactions-container-"+t);const a=this.container=document.createElement("div");a.classList.add("btn-menu-reactions");const o=this.scrollable="vertical"===t?new m.ZP(void 0):new m.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()}`,p.Z.setOverrideIdleGroup(this.animationGroup,!0),gi.Z||a.addEventListener("mousemove",this.onMouseMove),(0,n.fc)(a,(e=>{const t=(0,r.Z)(e.target,kc);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),s.append(a),this.middleware=null!=i?i:(0,Ti.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,Kr.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!s.Z.premium||this.renderReaction(e)}));const n=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,Be.T2)(n):n()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),p.Z.setOverrideIdleGroup(this.animationGroup,!1),p.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return s.Z.settings.animationsEnabled&&!Je.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(kc);const i=document.createElement("div");i.classList.add(kc+"-scale");const s=document.createElement("div");let n;s.classList.add(kc+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(kc+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:e.reaction};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(gi.Z?1:1.25),l={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;ta(Object.assign({doc:e.appear_animation,div:s,play:!0},l)).then((({render:e})=>e)).then((e=>{(0,ai.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,ai.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),ft.Z)}))}),ft.Z);const i=ta(Object.assign({doc:e.select_animation,div:n},l)).then((({render:e})=>e)).then((e=>((0,ai.Z)(e),hi.Z.waitForFirstFrame(e)))).catch(ft.Z)}else delete l.needFadeIn,delete l.withThumb,ta(Object.assign({doc:e.static_icon,div:s},l));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=En(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=""}Tc&&(i.style.transform=n)}}var _c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Ac{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,r.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,r.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&&(()=>{_c(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Sc(),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"),this.chat.selection.isSelecting&&!i){if(a)return;const e=yield this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));t&&(n=t)}}this.isOverBubble=!!i;const o=(0,r.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=yield this.chat.getMessage(this.mid),this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0;const l=yield this.init();if(!l)return;s=l.element;const{cleanup:c,destroy:d,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:p}=l;let m=!1;if(u){const e="is-visible";if(m=u.container.classList.contains(e),m&&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,c(),setTimeout((()=>{d()}),300)})),m&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>_c(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,n.tH)(this.chat.selection.selectionSendNowBtn):new Ya(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=()=>_c(this,void 0,void 0,(function*(){if(Sc()){const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];Oi((yield Promise.all(e.map((e=>_c(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join(""))}else document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{Oi(this.target.href)},this.onCopyLinkClick=()=>_c(this,void 0,void 0,(function*(){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,ci.Z)(i);let o,r="https://t.me/";n?(r+=n+"/"+(e?(0,ci.Z)(e.fwd_from.channel_post):a),e&&(r+="?comment="+a),o="LinkCopied"):(r+="c/"+t.toChatId()+"/"+a,e&&(r+="?thread="+(0,ci.Z)(e.mid)),o="LinkCopiedPrivateInfo"),Ci(v.ZP.format(o,!0)),Oi(r)})),this.onPinClick=()=>{new wc(this.peerId,this.mid)},this.onUnpinClick=()=>{new wc(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>_c(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,n.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new ja({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,r.Z)(this.target,"grouped-item")||(0,r.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>_c(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,n.tH)(this.chat.selection.selectionDeleteBtn):new Qa(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new I.Z,this.attachListenerSetter=new I.Z,this.middleware=(0,Ti.k)()}attachTo(e){this.attachListenerSetter.removeAll(),gi.Z?(0,n.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,a.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):Fi(e,this.onContextMenu,this.attachListenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return _c(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):ki(e,(e=>_c(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||gi.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>_c(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,ai.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:()=>_c(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:()=>_c(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:()=>_c(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:()=>{Oi(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{Oi(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>_c(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:()=>_c(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:()=>_c(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:()=>{u.Z.downloadToDisc({media:this.message.media.document})},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let i=!!gi.Z;const s=!t.type||!["gif","video"].includes(t.type);return s&&(i||(i=!!(0,r.Z)(this.target,"document")||!!(0,r.Z)(this.target,"audio")||!!(0,r.Z)(this.target,"media-sticker-wrapper"))),s&&i}},{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:()=>_c(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!==le.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 Ic(this.peerId,[this.mid])},verify:()=>_c(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 Pc(this.message)}},verify:()=>_c(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},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>_c(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 Mc},verify:()=>!1,isSponsored:!0}]}init(){return _c(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=Ei(e,this.listenerSetter);t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>!e.icon));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 v.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,v.ag)("Chat.Context.ReactedFast",[a]):(0,v.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,v.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const l=22,c=3,d=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?d*Math.min(c,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 Ot({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,v.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,v.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=d*Math.min(c,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new na({avatarSize:l});e.render(t?t.map((e=>(0,es.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){a=Je.IS_APPLE||gi.Z?"horizontal":"vertical",n=this.reactionsMenu=new xc(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0,i=0;s="vertical"===a?{top:t,left:e}:{top:e,right:i,left:t}}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}}))}}var Zc=i(4329),Fc=i.n(Zc),Dc=i(9043);class Rc{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=Ei(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Fi(e.onContextElement,(t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,a.Z)(t),Ii.openBtnMenu(this.sendMenu))}),e.listenerSetter)}setPeerId(e){this.type=e===s.Z.myId?"reminder":"schedule"}}var Bc=i(3735),Nc=i(1293),Uc=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Oc extends A.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,l.Z)(t,"LABEL"),s=(0,Nc.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,l.Z)(t,"LABEL"),s=(0,Cn.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),v.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return Uc(this,void 0,void 0,(function*(){if(this.questionInputField=new b.Z({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 Rc({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,v.$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,v.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new ji.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new ji.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new ji.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("")),a.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),(0,v.$d)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),l=document.createElement("div");l.classList.add("poll-create-questions"),this.quizSolutionField=new b.Z({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()}));const c=document.createElement("div");c.classList.add("subtitle"),(0,v.$d)(c,"AddAnExplanationInfo"),l.append(this.quizSolutionField.container,c),a.push(r,o,l),a.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...a),(0,n.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new m.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,Bc.Z)(i,!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,Bc.Z)(this.quizSolutionField.input,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return Uc(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,Bc.Z)(this.quizSolutionField.input);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 b.Z({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Vi({text:"",name:"question"});s.main.append(i.container),(0,n.fc)(i.input,a.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,Cn.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const o=document.createElement("span");o.classList.add("btn-icon","tgico-close"),i.container.append(o),(0,n.fc)(o,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)}}function Hc(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),Yo({media:e,mediaSize:(0,ot.C)(t,i),boxSize:(0,ot.C)(320,240),quality:.9})}function zc(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{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),(0,bl.Z)(this.input)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s={};s.file=e;const n=document.createElement("div");n.classList.add("popup-item"),s.itemDiv=n;const a=i?this.attachMedia(s,n):this.attachDocument(s,n);return t.sendFileDetails.push(s),a},this.construct(i)}construct(e){return Gc(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!1};const t=yield this.managers.apiManager.getConfig();if(this.captionLengthMax=t.caption_length_max,(0,n.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new Rc({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)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new m.ZP(null);i.container.append(this.mediaContainer),this.inputField=new b.Z({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:this.captionLengthMax,withLinebreaks:!0}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",(()=>{this.files=[],Vc=void 0})),Vc=this}))}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new ji.Z({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",(()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()}))):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find((e=>o.Z.has(e.type)));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new ji.Z({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",(()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()}))):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!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.inputField.value;if(t.length>this.captionLengthMax)return void Ci(v.ZP.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat;s.forEach((e=>{e.itemDiv=void 0}));const{length:r}=s,l=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},l),{clearDraft:!0})),t=void 0);const s=Object.assign(Object.assign({},i),{sendFileDetails:e});this.managers.appMessagesManager.sendAlbum(a,s.sendFileDetails.map((e=>e.file)),Object.assign(Object.assign(Object.assign({},l),{caption:t,isMedia:n,clearDraft:!0}),s)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent()}attachMedia(e,t){return Gc(this,void 0,void 0,(function*(){t.classList.add("popup-item-media");const i=e.file;let s;if(i.type.startsWith("video/")){const n=ut(),a=document.createElement("source");a.src=e.objectURL=yield Gi.Z.invoke("createObjectURL",i),n.autoplay=!0,n.controls=!1,n.muted=!0,n.addEventListener("timeupdate",(()=>{n.pause()}),{once:!0}),s=(0,pt.Z)(n).then((()=>Gc(this,void 0,void 0,(function*(){e.width=n.videoWidth,e.height=n.videoHeight,e.duration=Math.floor(n.duration);const i=n.webkitAudioDecodedByteCount;void 0!==i&&(e.noSound=!i),t.append(n);const s=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{Hc(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(n);e.thumb=Object.assign({url:yield Gi.Z.invoke("createObjectURL",s.blob)},s)})))),n.append(a)}else{const n=new Image;s=new Promise((s=>{n.onload=()=>{e.width=n.naturalWidth,e.height=n.naturalHeight,t.append(n),"image/gif"===i.type?(e.noSound=!0,Promise.all([zc(n).then((t=>{e.duration=Math.ceil(t)})),Hc(n).then((t=>Gc(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield Gi.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{s()}))):s()}})),n.src=e.objectURL=yield Gi.Z.invoke("createObjectURL",i)}return s}))}attachDocument(e,t){return Gc(this,void 0,void 0,(function*(){t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");(s||n||i.size<2e7)&&(e.objectURL=yield Gi.Z.invoke("createObjectURL",i));const a={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let o;e.objectURL&&(o={url:e.objectURL,downloaded:i.size,type:"full"});const r=yield ti({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}},cacheContext:o});return new Promise((i=>{const n=()=>{t.append(r),i()};if(s){const t=new Image;t.src=e.objectURL,t.onload=()=>{e.width=t.naturalWidth,e.height=t.naturalHeight,n()},t.onerror=n}else n()}))}))}shouldCompress(e){return"media"===this.willAttach.type&&o.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),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,g.Z)(t,(0,v.ag)(s,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const i=(0,Ce.Z)(t.width,t.height,380,320);e.style.width=i.width+"px",e.style.height=i.height+"px"}this.mediaContainer.append(e)}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{i.innerHTML="",e.length&&(this.setTitle(),this.iterate((e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),ke({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:380,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e.itemDiv,e)}))})))})).then((()=>{this.onRender()}))}}const $c="keydown",jc="active",qc=["ArrowUp","ArrowDown"],Qc=["ArrowLeft","ArrowRight"];function Yc({list:e,type:t,onSelect:i,once:s,waitForKey:o}){let l=(null==o?void 0:o.length)?new Set(o):void 0;const c=new Set("xy"===t?qc.concat(Qc):"x"===t?Qc:qc);let d;const h=()=>d||e.querySelector(".active")||e.firstElementChild,u=(e,i)=>{if(d===e)return;let s=!1;d&&(s=!0,d.classList.remove(jc)),d=e,d&&(d.classList.add(jc),s&&v&&i&&(0,ts.Z)({container:v,element:d,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},p=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let m;m="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):p(t,"ArrowRight"===i):(e,t)=>p(e,"ArrowRight"===t||"ArrowDown"===t);let g=i=>{const s=i.key;if(c.has(s)){if((0,a.Z)(i),e.childElementCount>1){let e=h();e=m(e,s),u(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,a.Z)(i),b(h()))};const v=(0,r.Z)(e,"scrollable");e.classList.add("navigable-list");const f=t=>{const i=(0,vi.Z)(t.target,e);i&&u(i,!1)},y=t=>{(0,a.Z)(t);const i=(0,vi.Z)(t.target,e);i&&(u(i,!1),b(h()))},b=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&C()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{l(o.next(e))}catch(e){i(e)}}function r(e){try{l(o.throw(e))}catch(e){i(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}l((o=o.apply(t,n||[])).next())}));var t,n,a,o};let w=!1;const S=()=>{w||(w=!0,document.addEventListener($c,g,{capture:!0,passive:!1}),e.addEventListener("mousemove",f,{passive:!0}),(0,n.fc)(e,y))},C=()=>{w&&(w=!1,document.removeEventListener($c,g,{capture:!0}),e.removeEventListener("mousemove",f),(0,n.EN)(e,y))},L=()=>{l||u(e.firstElementChild,!1)};if(l){const e=g;g=t=>{l.has(t.key)&&((0,a.Z)(t),document.removeEventListener($c,g,{capture:!0}),g=e,document.addEventListener($c,g,{capture:!0,passive:!1}),l=void 0,L())}}else L();return S(),{attach:S,detach:C,resetTarget:L}}class Jc 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}=Yc({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,Je.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},C.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(C.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,x.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&&(C.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 n=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),Re(this.container,"is-visible",!e,s.Z.settings.animationsEnabled&&!i?300:0,(()=>{this.hidden&&this.dispatchEvent("hidden")}),n)}}class Xc extends Jc{constructor(e,t,i){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield zn.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.managers=i,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),s.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(d.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),s.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),Cc(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*d.Z.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},d.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new I.Z,xn({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 m.ZP(this.container),this.lazyLoadQueue=new ye,this.superStickerRenderer=new An(this.lazyLoadQueue,km,this.managers)}}const ed=()=>{const e=new Date;return e.setHours(0,0,0,0),e},td=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class id extends Vr{constructor(e,t,i){var s;if(super((s=e).getTime()>td().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:ed(),maxDate:td(),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,M.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,n.fc)(e,(()=>{t(il),this.hide()}))}}}var sd=i(6299),nd=i(9041),ad=i(6875);function od(e,t=!0){const i=[],s=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),i=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&i==t.endOffset){const s=i-1,n=e.childNodes;if(t.startContainer===e&&n[s]){a=n[s],o=0;for(let e=0;e{i.onEmojiSelected(mn(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 m.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=>{pn(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{l(o.next(e))}catch(e){t(e)}}function r(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}l((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class ld extends Jc{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(ld.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(ld.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new m.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=ld.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=ld.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 Wm;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,c.Z)(n,(0,Zt.Z)(e.name)):n.append(new Ot({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,c.Z)(s,(0,Zt.Z)(e.description)),i.append(s)}return i}}ld.BASE_CLASS="autocomplete-peer-helper",ld.BASE_CLASS_LIST_ELEMENT=ld.BASE_CLASS+"-list-element";var cd=i(5082);function dd(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new cd.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{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 hd extends ld{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${ld.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=dd(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class ud{constructor(){this.helpers=new Set,this.middleware=(0,Ti.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 pd=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class md extends ld{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="";e.username?s="@"+e.username:(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=>pd(this,void 0,void 0,(function*(){if(!n())return;const t=s.slice(1).toLowerCase(),i=e.map((e=>pd(this,void 0,void 0,(function*(){const i=yield this.managers.appUsersManager.getUser(e);if(!i.username||i.username.toLowerCase()!==t)return{peerId:e,description:i.username?"@"+i.username:void 0}}))));this.render((yield Promise.all(i)).filter(Boolean))})))),!0}}var gd=i(5494),vd=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class fd extends Bn{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,vi.Z)(t,this.element)||t===this.btnHover||((0,a.Z)(e),this.toggle(!1))},(0,x.Z)(this,e),this.element.classList.add(fd.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(s.Z)("history_reply_markup",(({peerId:e})=>vd(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,He.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>vd(this,void 0,void 0,(function*(){yield this.render(),gi.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,n.fc)(this.element,(e=>{const t=(0,r.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:n}=this;"keyboardButtonRequestPhone"===i?In({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(n,s.Z.myId)})):this.managers.appMessagesManager.sendText(n,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return vd(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 vd(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 vd(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.element.textContent="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(fd.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(fd.BASE_CLASS+"-button","btn"),(0,c.Z)(t,(0,Zt.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.element.append(e)}}))}checkAvailability(e){var t;return vd(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()}}fd.BASE_CLASS="reply-keyboard";var yd=i(7084),bd=i(515);const wd="INLINE-HELPER";class Sd extends Jc{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,bd.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,a=void 0,r=function*(){const s=this.controller.getMiddleware(),a=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==a._)throw"NOT_A_BOT";const o=this.managers.appInlineBotsManager.getInlineResults(e,a.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=""+a.id,i.dataset.queryId=""+t.query_id;const o=new bn(null,wd,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],l=!!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=l?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),l)t.classList.add("grid-item");else{n.classList.add("empty"),(0,c.Z)(n,(0,Zt.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,c.Z)(s,(0,Zt.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,c.Z)(a,(0,ii.Z)(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"),l&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>u.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,yd.Z)(e).then((e=>{Fe(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&l)(0,ai.Z)(i),"gif"===i.type?o.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=l?48:void 0;l&&t.classList.add("no-border-radius"),dt({photo:i,container:l?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void o.clear();i.classList.toggle("is-gallery",l),i.classList.toggle("super-stickers",l),this.container.classList.toggle("is-gallery",l);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,M.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,c.Z)(i,(0,Zt.Z)(t.switch_pm.text)),(0,n.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,a.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*d.Z.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},d.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:a,renderPromise:o}},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{l(r.next(e))}catch(e){t(e)}}function n(e){try{l(r.throw(e))}catch(e){t(e)}}function l(t){var s;t.done?e(t.value):(s=t.value,s instanceof o?s:new o((function(e){e(s)}))).then(i,n)}l((r=r.apply(s,a||[])).next())}));var s,a,o,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Ki.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(d.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 m.ZP(this.container),this.lazyLoadQueue=new ye,this.superStickerRenderer=new An(this.lazyLoadQueue,wd,this.managers)}}var Cd=i(8090);class Ld extends ld{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${ld.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,Kr.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=dd(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var Id=i(6241),Md=i(6535),Ed=i(2821);function Pd(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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}function kd(e){return e.then(Pd)}var Td=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class xd{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,Ti.k)(),this.listenerSetter=new I.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;const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;Re(this.closeBtn,"is-visible",e,300,void 0,s),i||Re(t,"is-visible",!e,300,void 0,s)};mo({noRipple:!0,listenerSetter:this.listenerSetter,container:this.container},"top-right",e,(()=>{i(!0)}),(()=>{i(!1)})),e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=this.container.firstElementChild,this.btnMenu.classList.add("scrollable","scrollable-y"),this.container.append(this.closeBtn)}updateButtons(e){return Td(this,void 0,void 0,(function*(){const t=e.map(((e,t)=>Td(this,void 0,void 0,(function*(){const i=document.createElement("div"),n=document.createElement("div");return n.classList.add("btn-menu-item-subtitle"),e.isUser()?n.append((0,v.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?n.append((0,v.ag)("VoiceChat.DiscussionGroup")):n.append(yield cs(e.toChatId())),i.append(new Ot({peerId:e}).element,n),{onClick:t?()=>Td(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),n=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,T.Z)(t,e),t.unshift(e),this.updateButtons(t)};s.Z.settings.animationsEnabled?setTimeout(n,250):n(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),i=yield Promise.all(t),n=Ei(i);i.forEach(((t,i)=>{const s=e[i],n=new Wm;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),Array.from(this.btnMenu.children).slice(1).forEach((e=>e.remove())),this.btnMenu.append(...Array.from(n.children))}))}updateAvatar(e,t){return Td(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 Wm;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),Re(a,"is-visible",!0,n,void 0,s),i&&Re(i,"is-visible",!1,n,(()=>{i.remove()}),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,es.Z)(e.default_send_as):void 0))})))}updateManual(e){return Td(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===c)),{container:n}=this,a=t.toChatId(),o=(yield kd(this.getDefaultSendAs())).result,r=e;o instanceof Promise&&(e=void 0);const l=r&&!e,c=this.updatingPromise=(0,Kr.Z)(o,(t=>Td(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(a).then((e=>{if(!i())return;const s=e.map((e=>(0,es.Z)(e)));this.sendAsPeerIds=s.slice(),(0,T.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const o=()=>{this.onReady(n,e),this.addedListener||(this.listenerSetter.add(s.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!l)return o;o()}))));return c.finally((()=>{this.updatingPromise===c&&(this.updatingPromise=void 0)})),l?void 0:c}))}update(e){return this.updateManual(e).then((e=>e&&e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}class _d extends b.Z{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.inputFake.innerHTML=this.input.innerHTML,this.onFakeInput()})),e.placeholder&&(0,v.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===t)return;const s=Math.round(50*Math.log(Math.abs(t-i)));this.input.style.transitionDuration=`${s}ms`,e&&(this.input.style.height=t?t+"px":"");const n="is-changing-height";Re(this.input,n,!0,s,(()=>{this.input.classList.remove(n)}))}setValueSilently(e,t){super.setValueSilently(e,t),this.inputFake.innerHTML=e,t||this.onFakeInput()}}var Ad=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Zd="Posting media content isn't allowed in this group.";class Fd{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,a.Z)(e),this.recordCanceled=!0,this.recorder.stop(),Dc.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=gi.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=gi.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>Ad(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,n=this.chat.bubbles.getMiddleware(),a=s.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new id(t,(t=>{n()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{n()&&(A.Z.getPopups(qn).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),a).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,a.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(document.getSelection().toString().trim().length&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,a.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}=od(this.messageInputField.input),a=(0,Ed.Z)(i,s,!0),o=(0,Id.Z)(s,(0,Md.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"})),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),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)=>{this.insertAtCaret(e,hn(e),t)},this.onBtnSendClick=e=>Ad(this,void 0,void 0,(function*(){if((0,a.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{if(this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend("send_media")))return void Ci(Zd);this.chatInput.classList.add("is-locked"),(0,ln.Z)(),this.recorder.start().then((()=>{this.releaseMediaPlayback=vt.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),Dc.Z.setKeepAlive(!0);const e=()=>{new qi("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,n.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,r.Z)(t.target,"chat-input")||(0,r.Z)(t.target,"popup-cancel-record")||((0,a.Z)(t),e())}),{capture:!0,passive:!1}),C.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),o=255*s.length,l=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/o+.36);this.recordRippleEl.style.transform=`scale(${t})`;const n=Date.now()-this.recordStartTime,a=n%1e3,r=gt(n/1e3)+","+("00"+Math.round(a/10)).slice(-2);this.recordTimeEl.innerText=r,(0,Be.T2)(l)};l()})).catch((e=>{switch(e.name){case"NotAllowedError":Ci("Please allow access to your microphone");break;case"NotReadableError":Ci(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),Ci(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>Ad(this,void 0,void 0,(function*(){if(e&&(0,a.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=(0,Ed.Z)(this.messageInputField.value,[]);if(e.message!==t)return void new qi("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,a.Z)(e),(0,r.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&gi.Z&&!e.container.classList.contains("active")&&Ii.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new I.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=bc();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=D({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,n.fc)(this.goDownBtn,(e=>{(0,a.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=E(""),this.replyElements.cancelBtn=E("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(r=!0,this.canToggleHideAuthor()),t=()=>{r=!1},i=this.forwardElements={};let r=!1;const l=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new ji.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new ji.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new ji.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new ji.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],c=i.container=Ei(l,this.listenerSetter),d=Array.from(c.children);if([{elements:d.slice(0,2),onChange:(e,t)=>{const s=!!+e;r&&(this.forwardWasDroppingAuthor=!s);const n=this.replyElements.container.querySelector(".reply-title");if(n){const e=n.firstElementChild,t=v.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:d.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=Bi(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),c.append(t)})),c.append(i.changePeer.element),gi.Z||(this.forwardHover=new Bn({element:c})),i.modifyArgs=l.slice(0,-1),this.replyElements.container.append(c),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.btnToggleEmoticons=E("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type){this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=D({icon:"mention",className:"bubbles-corner-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,n.fc)(this.goMentionBtn,(e=>{(0,a.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=E("scheduled btn-scheduled float hide",{noRipple:!0}),(0,n.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(s.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=E("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new fd({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 Ld(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const e=document.createElement("div");e.classList.add("new-message-bot-commands-icon-scale");const t=this.botCommandsIcon=document.createElement("div");t.classList.add("animated-menu-icon","animated-menu-close-icon"),e.append(t),this.botCommandsToggle.append(e),(0,n.fc)(this.botCommandsToggle,(e=>{(0,a.Z)(e),t.classList.contains("state-back")?(this.botCommands.toggle(!0),t.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),t.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{t.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{t.classList.remove("state-back")}))}this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...o.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:()=>{A.Z.createPopup(Oc,this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=mo({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),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 ud,this.stickersHelper=new Xc(this.rowsWrapper,this.autocompleteHelperController,this.managers),this.emojiHelper=new rd(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new hd(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new md(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new Sd(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=E("delete btn-circle z-depth-1 btn-record-cancel"),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=E("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new Rc({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!this.isInputEmpty()||!!Object.keys(this.forwarding).length}),this.btnSendContainer.append(this.sendMenu.sendMenu)),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),Vn.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(Vn)("open",this.onEmoticonsOpen),this.listenerSetter.add(Vn)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(s.Z)("settings_updated",(()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()})),this.listenerSetter.add(s.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat===e&&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)})),"scheduled"===this.chat.type?this.listenerSetter.add(s.Z)("scheduled_delete",(({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})):(this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(s.Z)("dialogs_multiupdate",(e=>{e.has(this.chat.peerId)&&(this.startParam===le.gZ?this.setStartParam():this.center(!0))})));try{this.recorder=new(Fc())({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&&(A.Z.createPopup(Wc,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,n.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,n.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&&(C.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"});Dc.Z.decode(e,!0).then((e=>{Dc.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,n.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,n.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Ki.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,M.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,v.ag)("BotStart")),(0,n.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,mi.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)}constructPinnedHelpers(){this.pinnedControlBtn=(0,M.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 wc(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))})),this.chatInput.classList.add("type-pinned")}_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 l=i.getBoundingClientRect(),c=this.fakeRowsWrapper.getBoundingClientRect(),d=c.width,h=l.width;if(d!==h){const e=h/d,t=(d-h)/2;if(a=l.left-c.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=12;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return Re(this.inputContainer,"is-centering",s,u),Re(this.rowsWrapperWrapper,"is-centering-to-control",!!(s&&e&&e.classList.contains("chat-input-control")),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:d,widthTo:h}}center(e=!1){return Ad(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(e=this.startParam){return Ad(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.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return Ad(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),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)}}))}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=(0,Bc.Z)(this.messageInputField.input);let i;(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,wl.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,i)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),Ja(),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 Ad(this,void 0,void 0,(function*(){if(!i&&!(0,Nc.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,Be.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e){const t=(0,Md.Z)(e.message),i=e.entities||[],s=(0,Id.Z)(i.slice(),t);return(0,lr.Z)((0,cr.Z)(e.message,{entities:s}))}(e);return(this.messageInputField.value!==s||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 xd(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 Ad(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:l}=this,c=this.sendAs,d=this.createSendAs(),[h,u,p,m,g,f,y,b,w]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),kd(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?kd(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,d?(d.setPeerId(this.chat.peerId),d.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),S=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),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&&y){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,Kr.Z)(y.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),l&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),l.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=f.result;(0,Kr.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}c&&c.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?this.updateMessageInput(m,S,w):this.pinnedControlBtn&&this.pinnedControlBtn.append((0,v.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this._center(g,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,Re(this.newMessageWrapper,"has-offset",t,i?0:300,void 0,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 Ad(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=this.chat;let i;return i=t?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==s.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",i}))}updateMessageInputPlaceholder(e){const t=v.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(!this.attachMenuButtons)return;const{peerId:e,threadId:t}=this.chat;return ki(this.attachMenuButtons,(i=>i.verify(e,t)))}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),this.attachMenuButtons&&this.attachMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!i.includes(e))})),e?(a.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.removeAttribute("contenteditable"),n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new _d({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.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),Cd.T&&(0,Cd.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,sd.Z)(e))(0,a.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,bl.Z)(this.messageInput)})),gi.Z&&(0,n.fc)(this.messageInput,(e=>{this.appImManager.selectTab(1),Vn.toggle(!1)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",(()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"var(--font-monospace)"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null),spoiler:()=>document.execCommand("fontName",!1,"spoiler")};if(!i[e])return!1;const s=i[e],n=this.prepareDocumentExecute(),a=[];a.push(document.execCommand("styleWithCSS",!1,"true"));const o=e=>{let t=!1;const i=window.getSelection();if(!i.isCollapsed){const s=i.getRangeAt(0),n=nd.o[e],a=s.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}return t};return"monospace"===e||"spoiler"===e?o(e)?a.push(this.resetCurrentFontFormatting()):(("monospace"===e||o("monospace"))&&a.push(this.resetCurrentFormatting()),a.push("function"==typeof s?s():document.execCommand(s,!1,null))):(o("monospace")&&a.push(this.resetCurrentFormatting()),a.push("function"==typeof s?s():document.execCommand(s,!1,null))),a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){const{value:s,caretPos:n,entities:a}=od(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),l=s.substr(o),c=i?r.match(Fd.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,u=(0,Md.Z)(s);(0,Id.Z)(a,u);const p=t?Math.max(t.length,e.length):e.length,m=[];t&&(m.push(t),t.offset=d);const g=c?p-c[2].length:p;a.forEach((e=>{e.offset>=d&&(e.offset+=g)})),(0,Id.Z)(a,m);{const e={_:"messageEntityCaret",offset:d+p,length:0};let t=0;for(let i=a.length;te.offset);++t);a.splice(t,0,e)}const v=(0,lr.Z)((0,cr.Z)(h,{entities:a}));this.messageInputField.setValueSilently(v);const f=this.messageInput.querySelector(".composer-sel");f&&(function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const i=document.createTextNode("");e.parentNode.insertBefore(i,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=i}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}(f),f.remove()),this.onMessageInput()}checkAutocomplete(e,t,i){return Ad(this,void 0,void 0,(function*(){if(void 0===e){const s=od(this.messageInputField.input,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,Ed.Z)(e,i,!0);i=(0,Id.Z)(i,(0,Md.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const n=e.match(Fd.AUTO_COMPLETE_REG_EXP);let a;if(n){const t=i[0];let o=n[2];const r=o[0];if(this.stickersHelper&&s.Z.settings.stickers.suggest&&(yield this.chat.canSend("send_stickers"))&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)a=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?(0,ci.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?le.NM:this.chat.peerId,e))&&(a=this.mentionsHelper)}else n[1]||"/"!==r?s.Z.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(a=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):(yield this.commandsHelper.checkQuery(o,this.chat.peerId))&&(a=this.commandsHelper)}a=this.checkInlineAutocomplete(e,a),this.autocompleteHelperController.hideOtherHelpers(a)}))}checkInlineAutocomplete(e,t){let i=!1;if(!t){const s=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(s){const n=s[1],a=e.slice(s[0].length);i=s[0].length===e.length,t=this.inlineHelper,this.btnPreloader?Re(this.btnPreloader,"show",!0,400):(this.btnPreloader=E("none btn-preloader float show disable-hover",{noRipple:!0}),(0,be.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{Re(this.btnPreloader,"show",!1,400)}))})).catch(ft.Z)}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Re(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&(Re(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,Ji.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new ja(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return Ad(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&Je.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,gd.Z)(e),this.messageInputField.setValueSilently(i),(0,gd.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);gi.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,Nc.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),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}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 i=this.messageInputField.value;(0,Md.Z)(i).filter((e=>"messageEntityEmoji"===e._)).forEach((e=>{const t=(0,pi.zu)(e.unicode);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,Bc.Z)(this.messageInputField.input);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new Qa(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,Ji.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()}));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,n=!1){var a;return Ad(this,void 0,void 0,(function*(){const o="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(o))?(Ci(Zd),!1):"scheduled"!==this.chat.type||t?!(!e||(0,di.Z)(e)&&!s.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,e,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{isMedia:!0,clearDraft:i||void 0,silent:n})),this.onMessageSent(i,!0),"sticker"===e.type&&(null===(a=Vn.stickersTab)||void 0===a||a.unshiftRecentSticker(e)),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,n))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,l.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return Ad(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,lr.Z)((0,cr.Z)(t.message,{entities:t.totalEntities}));const s=()=>Ad(this,void 0,void 0,(function*(){const n=yield Aa(t,void 0,[t.mid]);this.setTopInfo("edit",s,(0,v.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>Ad(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),n=new Set;let a=0,o=0;const r=i.map((t=>Ad(this,void 0,void 0,(function*(){const i=e[t],s=i.map((e=>Ad(this,void 0,void 0,(function*(){var i;const s=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=s.fwd_from)||void 0===i?void 0:i.from_name)||s.fromId||s.fwdFromId?n.add("P"+s.fromId):n.add("N"+s.fwd_from.from_name),s.media&&s.message&&++o}))));yield Promise.all(s),a+=i.length}))));yield Promise.all(r);const c=n.size>2,d=[...n].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===s.Z.myId?(0,v.ag)("Chat.Accessory.Forward.You"):new Ot({peerId:t,dialog:!1,onlyFirstName:c}).element}return c?e.split(" ")[0]:e})),{forwardElements:h}=this;(0,l.Z)(h.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const u=h.hideCaption.checkboxField.checked;o&&u?h.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?h.hideSender:h.showSender).checkboxField.setValueSilently(!0);const p=h.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",m=(0,v.ag)(p,[a]),g=document.createDocumentFragment();let f,y;if(d.length<3?g.append(...(0,v.v_)(d,!1)):g.append(d[0],(0,v.ag)("AndOther",[d.length-1])),1===i.length){const t=i[0],s=e[t];if(f=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),y=!!f.grouped_id,y){const e=yield this.managers.appMessagesManager.getMidsByMessage(f);(e.length!==a||e.find((e=>!s.includes(e))))&&(y=!1)}}const b=document.createDocumentFragment();if(y||1===a){const t=e[i[0]],s=yield Aa(f,void 0,t);b.append(g,": ",s)}else b.append((0,v.ag)("Chat.Accessory.Forward.From"),": ",g);const w=this.setTopInfo("forward",t,m,b);h.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=v.ZP.weakMap.get(s);n.args=[t<2?i.length:o],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(w,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return Ad(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 Ot({peerId:t.fromId,dialog:!1}).element:(s=(0,v.ag)("Loading"),this.managers.appMessagesManager.wrapSingleMessage(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.replyToMsgId=e};i()}))}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=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")&&(C.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";Re(this.chat.container,e,!0,150,(()=>{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,Be.T2)((()=>{i&&(0,bl.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,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=E(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:c}=Ba(i,s,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),"webpage"===e&&(c.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),Je.IS_MOBILE||C.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),c}}Fd.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;const Dd="pinned-container";class Rd{constructor(e){this.floating=!1,(0,x.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(Dd,"hide"),t.title.classList.add(Dd+"-title"),t.subtitle.classList.add(Dd+"-subtitle"),t.content.classList.add(Dd+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(Dd+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(Dd+"-wrapper"),(0,we.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(Dd+"-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,n.fc)(e,(e=>{(0,a.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||d.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()}}class Bd extends _t{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,a.Z)(e),vt.Z.muted=!vt.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=vt.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,Bd.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+Bd.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);vt.Z.muted=!1,vt.Z.volume=t}});const i="player-volume",s=this.btn=document.createElement("div");s.classList.add("btn-icon",i);const o=this.icon=document.createElement("span");o.classList.add(i+"__icon"),s.append(o,this.container),(0,n.fc)(o,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(vt.Z)("playbackParams",this.setVolume),this.setVolume()}}Bd.ICONS=["volume_off","volume_mute","volume_down","volume_up"];class Nd extends Rd{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new ma("pinned-audio",((e,t)=>{(0,g.Z)(this.divAndCaption.title,e),(0,g.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{vt.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 l="voice"!==e.type&&"round"!==e.type;if(l){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,Zt.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,Zt.Z)(t.performer):(0,v.ag)("AudioUnknownArtist")}else o=new Ot({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=G(t.date);this.fasterEl.classList.toggle("hide",l),this.repeatEl.classList.toggle("hide",!l),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=E("fast_rewind active",{noRipple:!0}),o=E("fast_forward active",{noRipple:!0}),r=(e,t)=>{(0,n.fc)(e,(e=>{(0,a.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};r(s,(()=>{vt.Z.previous()})),r(o,(()=>{vt.Z.next()})),this.toggleEl=E("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),r(this.toggleEl,(()=>{vt.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,o),this.volumeSelector=new Bd(this.listenerSetter,!0);const l=document.createElement("div");l.classList.add("progress-line-container"),l.append(this.volumeSelector.container);const c=document.createElement("div");c.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(c),this.volumeSelector.btn.append(l),this.repeatEl=E("audio_repeat",{noRipple:!0}),r(this.repeatEl,(()=>{const e=vt.Z.getPlaybackParams();e.round?e.loop?(vt.Z.round=!1,vt.Z.loop=!1):vt.Z.loop=!vt.Z.loop:vt.Z.round=!0}));const d=this.fasterEl=E("playback_2x",{noRipple:!0});r(d,(()=>{vt.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const h=document.createElement("div");h.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new At(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),h.append(this.progressLine.container),this.wrapper.insertBefore(h,this.wrapperUtils),this.topbar.listenerSetter.add(vt.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(vt.Z)("pause",this.onPause),this.topbar.listenerSetter.add(vt.Z)("stop",this.onStop),this.topbar.listenerSetter.add(vt.Z)("playbackParams",this.onPlaybackParams);const u=vt.Z.getPlayingDetails();u&&(this.onMediaPlay(u),this.onPlaybackParams(u.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}var Ud;!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"}(Ud||(Ud={}));const Od="pinned-message-border";class Hd{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=Ud.ONE:2===e?i=Ud.TWO:3===e?i=Ud.THREE:4===e?i=Ud.FOUR:e>3&&(i=Ud.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=Ud.ONE:2===e?i=Ud.TWO:3===e?i=Ud.THREE:4===e?i=Ud.FOUR:e>3&&(i=Ud.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-Ud.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?Ud.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add(Od),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=Od+"-wrapper-1",this.border.classList.remove(Od+"-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),l=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle(Od+"-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=Od+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}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(Od+"-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 zd=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Gd{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Gd.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=Gd.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)}),Gd.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)}}Gd.DURATION=200,Gd.BASE_CLASS="animated-super";class Vd{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Vd.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Vd.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Vd.BASE_CLASS+"-decimal-placeholder";const s=new Gd;return s.container.className=Vd.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()}))}),Gd.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Vd.EMPTY_INDEX,!0),t.animatedSuper.animate(Vd.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:Vd.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Vd.EMPTY_INDEX=-1,Vd.BASE_CLASS="animated-counter";class Kd{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 I.Z,this.log=(0,he.kg)("PM"),this.debug=!0,this.isStatic=!1;const o=new Ra("pinned-message");this.pinnedMessageContainer=new Rd({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:o,onClose:()=>zd(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new wc(this.chat.peerId,this.pinnedMid,!0):new wc(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new Hd,o.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Gd,o.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Gd,this.animatedMedia.container.classList.add("pinned-message-media-container"),o.content.prepend(this.animatedMedia.container),this.animatedCounter=new Vd(!0),o.title.append((0,v.ag)("PinnedMessage")," ",this.animatedCounter.container);const r=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(r),o.container.prepend(r),this.btnOpen=E("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,n.fc)(this.btnOpen,(e=>{(0,a.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.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(s.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Ki.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,mt.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic="discussion"===this.chat.type}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>Kd.LOAD_COUNT&&(!this.loadedBottom&&e<=Kd.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=Kd.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return zd(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:Kd.LOAD_COUNT,backLimit:Kd.LOAD_COUNT}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId).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 I.Z,function(e,t,i,s){if(gi.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 zd(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,He.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 zd(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 zd(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=[],l=yield Da({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(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)}))}}Kd.LOAD_COUNT=50,Kd.LOAD_OFFSET=5;var Wd=i(6818);const $d=[{time:3600,langKey:"ChatList.Mute.1Hour"},{time:14400,langKey:"ChatList.Mute.4Hours"},{time:28800,langKey:"ChatList.Mute.8Hours"},{time:86400,langKey:"ChatList.Mute.1Day"},{time:259200,langKey:"ChatList.Mute.3Days"},{time:-1,langKey:"ChatList.Mute.Forever"}];class jd extends qi{constructor(e){super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer(e,-1===i?le.rU:(0,wl.Z)(!0)+i)}}],body:!0});const t=$d.map((e=>new Ni({radioField:new Vi({langKey:e.langKey,name:"mute-time",value:""+e.time})})));let i;const s=Ui(t,(e=>{i=+e}));this.body.append(s),t[t.length-1].radioField.checked=!0,this.show()}}class qd{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)}}let Qd;function Yd(){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}function Jd(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}function Xd(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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}function eh(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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=eh;function th(){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?Xd:eh)(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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=th;var ih=i(6669);function sh(e){e.stop(),(0,ih.Z)(e,"ended")}class nh{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}}function ah(e){return e<<0}function oh(e){return e>>>0}function rh(e){return"screencast"===e?"video":e}function lh(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function ch(e,t="9",i){const s=lh(e);return`m=${rh(e)} ${t} ${s} ${i.join(" ")}`}class dh extends nh{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=oh(e.source);t+=n,i+=n;const a=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(oh);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(a)}})):a(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:r}=e,l=t.transport,c="application"===n,d=c?void 0:t[n],h="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${rh(n)} 0 ${lh(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const u=c?[{id:5e3}]:d["payload-types"],p=u.map((e=>e.id));s(ch(n,r,p),"c=IN IP4 0.0.0.0",`a=rtcp:${r} IN IP4 0.0.0.0`),l["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let m=o;if("sendrecv"===o||!i||h||c||(m="sendonly"===o?"recvonly":"sendonly"),s(`a=${m}`),this.addTransport(l),c)s(`a=sctpmap:${u[0].id} webrtc-datachannel 256`);else{const e=d["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),u.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"!==m&&"sendrecv"!==m||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:s,isAnswer:n}=e;this.addHeader(t.sessionId,s),Je.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((n?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,n);return this}static fromConference(e){return(new dh).addConference(e).finalize()}}class hh{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 uh{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);o.getByteFrequencyData(r);const l=function(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;t{const e=this.counter%3==0,t=e?this.items:this.items.filter((e=>"input"===e.type)),i=t.filter((e=>"audio"===e.kind)),s=i.slice(0,50).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),uh.ANALYSER_LISTENER.dispatchEvent("amplitude",{amplitudes:s,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,he.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,l=uh.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:""+ah(+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:r}=a;r||(r=a.createTransceiver(e.connection,n)),a.direction!==r.direction&&(r.direction=a.direction);const l=rh(t),c=o.findIndex((e=>e.kind===l)),d=-1!==c?o.splice(c,1)[0]:void 0,h=r.sender;h.track!==d&&h.replaceTrack(d).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{sh(e)}))}catch(e){this.log.error(e)}}}uh.ANALYSER_LISTENER=new L.Z;class ph extends L.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=th()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(ft.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&&Yd(),video:t&&{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:Jd(!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=uh.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const n="output"===i,{player:a,elements:o,streamManager:r}=this,l=t.kind,c="video"===l,d=c?s:l;let h=o.get(d);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),o.delete(d)}),{once:!0}),n&&r.addTrack(e,t,i);const u=c?e:r.outputStream;if(h)h.paused&&h.play().catch(ft.Z),h.srcObject=u;else{if(h=document.createElement(l),h.autoplay=!0,h.srcObject=u,h.volume=1,"undefined"!==h.sinkId){const{outputDeviceId:e}=this;e&&h.setSinkId(e)}c?(h.setAttribute("playsinline","true"),h.muted=!0):a.appendChild(h),o.set(d,h)}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=>{sh(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}class mh{constructor(e,t){this.mid=e,this.type=t,this.port="9"}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(rh(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 gh(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 vh{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,x.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new mh(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,T.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 dh.fromConference(Object.assign({conference:this},e))}}class fh{constructor(e){var t;(0,x.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,he.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,he.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,he.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 vh(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))}}var yh,bh,wh=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},Sh=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 Ch{constructor(e,t){yh.set(this,void 0),bh.set(this,void 0),wh(this,yh,e,"f"),wh(this,bh,t,"f")}get session(){return Sh(this,yh,"f")}get media(){return Sh(this,bh,"f")}get bundle(){const e=this.session.lines.find((e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));return e.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 Lh(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}yh=new WeakMap,bh=new WeakMap;var Ih,Mh,Eh,Ph=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},kh=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 Th{constructor(e,t){Ih.set(this,void 0),Mh.set(this,void 0),Eh.set(this,void 0),Ph(this,Ih,new Set,"f"),Ph(this,Mh,e,"f"),Ph(this,Eh,t,"f")}generate(){const e=kh(this,Mh,"f"),t=kh(this,Eh,"f"),i=kh(this,Ih,"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){kh(this,Ih,"f").add(e)}}Ih=new WeakMap,Mh=new WeakMap,Eh=new WeakMap;var xh,_h,Ah=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},Zh=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 Fh{constructor(e,t){xh.set(this,void 0),_h.set(this,void 0),Ah(this,xh,e,"f"),Ah(this,_h,t,"f")}get key(){return Zh(this,xh,"f")}get value(){return Zh(this,_h,"f")}}xh=new WeakMap,_h=new WeakMap;var Dh,Rh,Bh,Nh,Uh=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},Oh=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 Hh{constructor(e,t,i,s){Dh.set(this,void 0),Rh.set(this,void 0),Bh.set(this,void 0),Nh.set(this,void 0),Uh(this,Dh,e,"f"),Uh(this,Rh,t,"f"),Uh(this,Bh,i,"f"),Uh(this,Nh,s,"f")}get type(){return Oh(this,Dh,"f")}get port(){return Oh(this,Rh,"f")}get protocol(){return Oh(this,Bh,"f")}get ids(){return Oh(this,Nh,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}Dh=new WeakMap,Rh=new WeakMap,Bh=new WeakMap,Nh=new WeakMap;var zh,Gh,Vh,Kh,Wh=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 jh{constructor(e,t){if(zh.set(this,void 0),Gh.set(this,void 0),Vh.set(this,void 0),Kh.set(this,void 0),Wh(this,zh,e,"f"),"string"==typeof t){if(Wh(this,Gh,t,"f"),"m"===e){const e=t.split(" ");Wh(this,Vh,new Hh(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=Lh(t,":",1);t=e[0],Wh(this,Kh,1===e.length?new Fh(t,null):new Fh(t,e[1]),"f")}}else t instanceof Hh?(Wh(this,Vh,t,"f"),Wh(this,Gh,t.toString(),"f")):t instanceof Fh&&(Wh(this,Kh,t,"f"),Wh(this,Gh,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return $h(this,zh,"f")}get value(){return $h(this,Gh,"f")}get parsed(){return $h(this,Kh,"f")}get mediaLineParts(){return $h(this,Vh,"f")}toString(){return`${this.key}=${this.value}`}}zh=new WeakMap,Gh=new WeakMap,Vh=new WeakMap,Kh=new WeakMap;var qh,Qh,Yh,Jh,Xh,eu,tu=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},iu=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 su{constructor(e,t,i=":",s=!1){qh.set(this,void 0),Qh.set(this,void 0),Yh.set(this,void 0),Jh.set(this,void 0),Xh.set(this,void 0),eu.set(this,void 0),tu(this,qh,e,"f"),tu(this,Qh,t,"f"),tu(this,Yh,i,"f"),tu(this,Xh,s,"f"),tu(this,Jh,s?new Map:null,"f"),tu(this,eu,s?[]:null,"f")}get lines(){return iu(this,Qh,"f")}get value(){return iu(this,Xh,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!iu(this,Xh,"f")}get key(){return iu(this,qh,"f")}get keys(){return su.fill(this),iu(this,eu,"f")}forEach(e){su.fill(this),iu(this,Jh,"f").forEach(e)}get(e){return su.fill(this),iu(this,Jh,"f").get(e)||new su(e,[],":",!0)}static fill(e){if(null!==iu(e,Jh,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=Lh(i,iu(e,Yh,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=tu(e,Jh,su.makeAttributes(t),"f");tu(e,eu,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new su(i,e))})),t}}qh=new WeakMap,Qh=new WeakMap,Yh=new WeakMap,Jh=new WeakMap,Xh=new WeakMap,eu=new WeakMap;var nu,au,ou=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},ru=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 lu{constructor(e){nu.set(this,void 0),au.set(this,void 0),ou(this,nu,e,"f"),ou(this,au,new Map,"f"),lu.fillAttributes(this)}get(e){return ru(this,au,"f").get(e)||new su(e,[]," ",!0)}static fillAttributes(e){const t=new Map;ru(e,nu,"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)=>{ru(e,au,"f").set(i,new su(i,t," ",!1))}))}}nu=new WeakMap,au=new WeakMap;var cu,du,hu,uu,pu=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},mu=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 gu{constructor(e){cu.set(this,void 0),du.set(this,void 0),hu.set(this,void 0),uu.set(this,void 0),pu(this,cu,e,"f"),pu(this,du,e[0],"f"),pu(this,hu,pu(this,uu,null,"f"),"f")}get lines(){return mu(this,cu,"f")}get mediaLine(){return mu(this,du,"f")}get mediaLineParts(){return mu(this,du,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!mu(this,uu,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",pu(this,uu,t,"f")}return mu(this,uu,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return mu(this,hu,"f")||pu(this,hu,new lu(this.lines),"f"),mu(this,hu,"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}}cu=new WeakMap,du=new WeakMap,hu=new WeakMap,uu=new WeakMap;var vu,fu,yu=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},bu=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 wu{constructor(e){vu.set(this,void 0),fu.set(this,void 0),yu(this,vu,e,"f"),yu(this,fu,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return bu(this,vu,"f")}get sessionId(){return bu(this,fu,"f")}}function Su(e){function t(){i?n.push(new gu(s)):i=new wu(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=Cu(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new Ch(i,n)}function Cu(e){const t=Lh(e,"=",1);return new jh(t[0],t[1])}function Lu(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 s=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>ah(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[n,a]=i.fingerprint.split(" ",2),o=i.ssrc&&ah(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:a,setup:i.setup,hash:n},source:o,sourceGroups:s,mid:i.mid}}vu=new WeakMap,fu=new WeakMap;var Iu,Mu=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Eu extends fh{constructor(e){super(e),this.negotiateThrottled=(0,mt.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 Mu(this,void 0,void 0,(function*(){const{groupCall:n,description:a}=this,o=n.id,r=t.map((t=>{const i=function(e,t){const i=Lu(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})),l=r.find((e=>"audio"===e.media.mediaType)),c=r.find((e=>"video"===e.media.mediaType));let{source:d,params:h}=l||{};const u=c||l,p={audio:l,video:c};if(a.entries.forEach((e=>{if("sendonly"===e.direction){const t=p[e.type];if(!t)return;a.setEntrySource(e,t.sourceGroups||t.source),a.setEntryPeerId(e,s.Z.myId)}})),h!==u.params){const e=JSON.parse(u.params.data);d?e.ssrc=d:delete e.ssrc,h={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(o,h,i),g=JSON.parse(m.params.data);return g.audio=g.audio||n.connections.main.description.audio,a.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,Mn.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 Mu(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=Su(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=function(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 Th(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(Cu("a=ssrc-group:SIM "+o.join(" ")));const l=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(Cu("a=ssrc-group:FID "+e+" "+i)),l.forEach((t=>{a.push(Cu("a=ssrc:"+e+" "+t))})),l.forEach((e=>{a.push(Cu("a=ssrc:"+i+" "+e))})))})),e.media[s]=new gu(a)}})),!!t}(s)||n),(0,Mn.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,l=(r.ids,o.toString()),c=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(l!==ch(e.mediaType,void 0,c)){const o=Lu(s,e),l=Object.assign({},i);l.transport=(0,Ji.Z)(l.transport),l.transport.ufrag=o.ufrag,l.transport.pwd=o.pwd,l.transport.fingerprints=[o.fingerprint],l.transport.candidates=[];const c=new mh(o.mid,r.type);c.setPort(r.port),o.source&&c.setSource(o.sourceGroups||o.source),c.setDirection(e.direction);const d=Su((new dh).addSsrcEntry(c,l).finalize()).media[0];a[t]=d,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 l=[],c=a.bundle;(0,Mn.Z)(c,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),l.push(n))}));const d=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new mh(i,e.mediaType),s.setDirection("inactive")),s})),h={type:"answer",sdp:t.generateSdp({bundle:c,entries:d,isAnswer:!0})};l.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,h.sdp),yield e.setRemoteDescription(h),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()}}!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"}(Iu||(Iu={}));const Pu=Iu;var ku=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Tu extends ph{constructor(e){super(),(0,x.Z)(this,e),this.log||(this.log=(0,he.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,mt.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===Pu.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return Pu.CLOSED;if("connected"===e||Je.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?Pu.MUTED:Pu.UNMUTED:Pu.MUTED_BY_ADMIN}return Pu.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!==Pu.UNMUTED}get isClosing(){const{state:e}=this;return e===Pu.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,T.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,T.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return ku(this,void 0,void 0,(function*(){return le.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(le.NM)))}changeUserMuted(e,t){return ku(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return le.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 Eu(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 ku(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Xd(Jd()),i=new uh,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 ku(this,void 0,void 0,(function*(){const e={video:{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}};try{const t=yield eh(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 ku(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&(sh(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 ku(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&&s.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return ku(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const s=e.pFlags.self;if(s&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const n=t.muted;void 0!==n&&e.pFlags.self&&(n?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),s&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(i=this.connections.main.sources.video)&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:i.sourceGroups,audio_source:undefined}),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}var i;return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,es.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=_u(0,"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 l=o?[]:function(e){var t,i;return[_u(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&_u(0,"audio",e.video.audio_source),e.video&&_u(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&_u(0,"audio",e.presentation.audio_source),e.presentation&&_u(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,l);const c=new Set;r.forEach((e=>{const t=e.source;if(!l.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),c.add(e.type))}})),l.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),c.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"}),c.add(t.type))})),c.size&&(c.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}var xu=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function _u(e,t,i,s){return gh(t,i,s)}class Au extends L.Z{construct(e){this.managers=e,this.audioAsset=null!=Qd?Qd:Qd=new qd(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,he.kg)("GCC"),s.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))})),s.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 xu(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:Yd(),video:t&&{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}},s=new uh(100);try{const t=yield eh(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{l(a.next(e))}catch(e){t(e)}}function r(e){try{l(a.throw(e))}catch(e){t(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n)}))}joinGroupCallInternal(e,t,i,n,a=!1,o){return xu(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);const l="main";let{currentGroupCall:c}=this;if(!c||!a){c=new Tu({chatId:e,id:t,managers:this.managers}),c.fixSafariAudio(),c.addEventListener("state",(e=>{this.currentGroupCall===c&&e===Pu.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),s.Z.dispatchEvent("chat_update",c.chatId))})),c.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const d=c.createConnectionInstance({streamManager:i,type:l,options:{type:l,isMuted:n,joinVideo:o,rejoin:a}}),h=d.createPeerConnection();return h.addEventListener("negotiationneeded",(()=>{d.negotiate()})),h.addEventListener("track",(e=>{r("ontrack",e),c.onTrack(e)})),h.addEventListener("iceconnectionstatechange",(()=>{c.dispatchEvent("state",c.state);const{iceConnectionState:e}=h;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":c.hangUp();break;case"connected":c.joined||(c.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),d.createDescription(),d.createDataChannel(),d.appendStreamToConference(),this.setCurrentGroupCall(c),r("set currentGroupCall",t,c),this.startConnectingSound(),d.negotiate()}c.handleUpdateGroupCallParticipants=!1,c.updatingSdp=!1,r("update currentGroupCall",t,c)}))}}const Zu=new Au;R.GO&&(R.GO.groupCallController=Zu);const Fu=Zu;var Du=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Ru{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,a.Z)(e),(()=>{Du(this,void 0,void 0,(function*(){const e=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);t&&this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith((0,v.ag)(e));const i=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(i.map((e=>Du(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=>Du(this,void 0,void 0,(function*(){var t;if(!Wd.Z||this.peerId.isUser())return!1;const i=Fu.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.getChatTyped(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,Xi.Z)(n,"manage_call")})),this.verifyCallButton=e=>Du(this,void 0,void 0,(function*(){if(!nl.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 jd(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",d.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===d._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),Je.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{Je.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=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.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=""+e},this.setPeerStatusManual=(e=!1)=>Du(this,void 0,void 0,(function*(){if(!this.subtitle)return;const t=this.peerId;return this.chat.appImManager.setPeerStatus(t,this.subtitle,e,!1,(()=>t===this.peerId))})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{e&&e()})),this.listenerSetter=new I.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=E("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=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 Nd(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=mo({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,this.verifyButtons)),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(d.Z)("changeScreen",this.onChangeScreen),(0,n.fc)(this.container,(e=>{const t=(0,r.Z)(e.target,"pinned-container");if((0,ln.Z)(),t){if((0,a.Z)(e),(0,r.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=vt.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else d.Z.activeScreen===d._.medium&&document.body.classList.contains(Dr)?o():(0,l.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(tn)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const o=e=>{if(e&&(0,a.Z)(e),d.Z.activeScreen===d._.medium&&document.body.classList.contains(Dr))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);C.Z.back(e?"im":"chat")}};(0,n.fc)(this.btnBack,o,{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:()=>d.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>Du(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&s.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute(this.peerId)},verify:()=>Du(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&s.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId,!1))}))},{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:()=>Du(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),Gi.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>Du(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),Ci((0,v.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(ks)){const e=this.appSidebarRight.createTab(ks);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>Du(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 ms({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new qi("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new Ot({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:()=>Du(this,void 0,void 0,(function*(){return s.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"lock",text:"BlockUser",onClick:()=>{new qi("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new Ot({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&Li({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>Du(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!==s.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&&Li({langPackKey:"UserUnblocked"})}))},verify:()=>Du(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 ws(this.peerId)},verify:()=>Du(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=E("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,n.fc)(e,(e=>{(0,a.Z)(e),!i&&(0,ln.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new Wm;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 Kd(this,this.chat,this.managers),this.btnJoin=(0,M.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=E("phone"),this.btnGroupCall=E("videochat"),this.btnPinned=E("pinlist"),this.btnMute=E("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,(()=>Du(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,s.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(s.Z)("chat_update",(e=>Du(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(s.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(s.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(s.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(s.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.pinnedMessage&&this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();Gi.Z.getState().then((s=>{i()&&(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.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(s.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()}))}constructDiscussionHelpers(){this.pinnedMessage=new Kd(this,this.chat,this.managers)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),this.chatAudio&&this.chatAudio.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){return Du(this,void 0,void 0,(function*(){const e=this.peerId;let t;this.avatarElement&&(t=this.constructAvatar());const[i,s,n,a,o,r,l]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,t?t.updateWithOptions({peerId:e}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),Gi.Z.getState()]);return()=>{var a;if(this.btnMute&&this.btnMute.classList.toggle("hide",!i),this.btnJoin&&(s?((0,g.Z)(this.btnJoin,(0,v.ag)(i?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(a=null==n?void 0:n.pFlags)||void 0===a?void 0:a.left))):this.btnJoin.classList.add("hide")),t&&(this.avatarElement.replaceWith(t),this.avatarElement=t),this.setUtilsWidth(),this.verifyButtons(),this.pinnedMessage)if("chat"===this.chat.type){if(this.chat.wasAlreadyUsed){const e=new Kd(this,this.chat,this.managers);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}this.pinnedMessage.hidden=!!l.hiddenPinnedMessages[e]}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());o(),r&&r(),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return Du(this,void 0,void 0,(function*(){const t=this.peerId,i=()=>this.peerId===t;let n;if("pinned"===this.chat.type)n=void 0===e?(0,v.ag)("Loading"):(0,v.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!i())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,v.ag)(t===s.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const i=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,this.chat.threadId);if(i.cached){const t=yield i.result;e=t.count}else i.result.then((e=>this.setTitle(e.count)))}n=void 0===e?(0,v.ag)("Loading"):(0,v.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n]=yield Promise.all([js({peerId:t,dialog:!0,withIcons:!0})]),!i()))return;return()=>{(0,g.Z)(this.title,n)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return Du(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted(e,!1);(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"}))}}class Bu extends P{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new w("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=E("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new y(e,this.inputSearch,{messages:new f("Chat.Search.PrivateSearch","messages")})}open(e,t,i,s){const a=super.open();return 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,n.fc)(this.btnPickDate,(()=>{A.Z.createPopup(Vr,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),nn.toggleSidebar(!0)),a}}class Nu{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,a.Z)(e),A.Z.createPopup(Vr,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,l.Z)(e.target,dg);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,a.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,a.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,we.Z)(this.backBtn);const s=this.listenerSetter=new I.Z,o=(e,t)=>{(0,n.fc)(e,t,{listenerSetter:s})};o(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new w("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new f(!1,"messages",void 0,"",!1),o(this.searchGroup.list,this.onResultsClick),this.appSearch=new y(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,g.Z)(this.foundCountEl,this.inputSearch.value?(0,v.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"),o(this.footer,this.onFooterClick),(0,we.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"),o(this.dateBtn,this.onDateClick),o(this.upBtn,this.onUpClick),o(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),Je.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},C.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,C.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,Cn.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(t,i);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,g.Z)(this.foundCountEl,(0,v.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}class Uu{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,gs.Z)(t.options,e)));return t||(t=new Uu,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.img=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=Ze(t,e,!1).then((()=>t))}cleanup(e){this.canvases.delete(e),this.canvases.size||((0,T.Z)(Uu.INSTANCES,this),this.objectUrl&&URL.revokeObjectURL(this.objectUrl))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.img;let a=n.width,o=n.height,r=1480*e.dpr;+e.dataset.originalHeight!==s&&(r*=.875),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 l=e=>{for(let s=0;s0){let e=c;do{l(e-=o)}while(e>=0)}const d=s-1;for(let e=c+o;ei.resize(e,t))))}}Uu.INSTANCES=[];var Ou=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Hu extends L.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",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,he.kg)("CHAT",he.v9.Log|he.v9.Warn|he.v9.Debug|he.v9.Error),this.peerId=le.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){const i=$o.Z.getTheme();let n;if(i.background.color&&!i.background.slug&&!i.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=i.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const a=++this.backgroundTempId,o=this.gradientRenderer,r=this.patternRenderer,l=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const c=i.background.intensity&&i.background.intensity/100,d=!!c&&c<0;let h,u,p,m=null==n?void 0:n.firstElementChild;if(!n)if(n=document.createElement("div"),n.classList.add("chat-background-item"),e)if(c){n.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=Uu.getInstance({url:e,width:t.width,height:t.height,mask:d}),m=this.patternCanvas=h.createCanvas(),m.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),d&&n.classList.add("is-dark")}else i.background.slug&&n.classList.add("is-image");else i.background.color&&n.classList.add("is-color");const g=i.background.color;if(g){const{canvas:e,gradientRenderer:t}=Wo.create(g);p=this.gradientRenderer=t,u=this.gradientCanvas=e,u.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),s.Z.settings.animationsEnabled&&p.scrollAnimate(!0)}h&&(d?u:m).style.setProperty("--opacity-max",""+Math.abs(c));const v=new Promise((i=>{const s=()=>{if(this.backgroundTempId!==a)return h&&h.cleanup(m),void(p&&p.cleanup());const e=this.backgroundEl.lastElementChild;if(e===n)return void i();const s=[u,m].filter(Boolean);s.length&&n.append(...s),this.backgroundEl.append(n),Re(n,"is-visible",!0,t?0:200,e?()=>{r&&r.cleanup(l),o&&o.cleanup(),e.remove()}:null,2),i()};h?h.renderToCanvas(m).then((()=>{this.backgroundTempId===a&&s()})):e?Ae(n,e,s):s()}));return this.setBackgroundPromise=Promise.race([(0,on.Z)(500),v])}setType(e){this.type=e}init(){this.topbar=new Ru(this,nn,this.managers),this.bubbles=new yc(this,this.managers),this.input=new Fd(this,this.appImManager,this.managers),this.contextMenu=new Ac(this,this.managers),this.selection=new so(this,this.bubbles,this.input,this.managers),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),"scheduled"===this.type||gi.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)})),this.bubbles.listenerSetter.add(s.Z)("dialog_drop",(e=>{e.peerId===this.peerId&&this.appImManager.setPeer()}))}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.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()}onChangePeer(e){return Ou(this,void 0,void 0,(function*(){const{peerId:t}=this,i=nn.getTab(Bu);i&&i.close();const[s,n,a,o,r]=yield e(Promise.all([this.managers.appPeersManager.noForwards(t),this.managers.appPeersManager.isRestricted(t),this._isAnyGroup(t),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(t)]));this.noForwards=s,this.isRestricted=n,this.isAnyGroup=a,this.isMegagroup=r,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=nn.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(t,this.threadId),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e,t,i){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.peerId===e;if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=e||le.NM,this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`;if(!e)return nn.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer(!1,e),this.appImManager.dispatchEvent("peer_changed",e),nn.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(s,e,t,i),a=this.setPeerPromise=n.then((e=>e.promise)).catch(ft.Z).finally((()=>{this.setPeerPromise===a&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){(0,T.Z)(this.sharedMediaTabs,e),e.destroy()}setAutoDownloadMedia(){return Ou(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,a=function*(){let t,i=0,n=0,a=0;const o=s.Z.settings,r=s.Z.managers.appPeersManager;return!o.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield r.isContact(e))?"contacts":"private":(yield r.isBroadcast(e))?"channels":"groups",o.autoDownload.photo[t]&&(i=o.autoDownloadNew.photo_size_max),o.autoDownload.video[t]&&(n=o.autoDownloadNew.video_size_max),o.autoDownload.file[t]&&(a=o.autoDownloadNew.file_size_max)),{photo:i,video:n,file:a}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{l(a.next(e))}catch(e){s(e)}}function r(e){try{l(a.throw(e))}catch(e){s(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}l((a=a.apply(t,i||[])).next())}));var t,i,n,a}(this.peerId)}))}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,i,s){return Ou(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;n.loadSidebarMedia(!0);const a=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s)]),[o]=yield Promise.all([a,n.fillProfileElements()]);i()&&(o.forEach((e=>{e()})),nn.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",t))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return Ou(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:Xr.Z.fromJSON(e.historySerialized)})))}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return Ou(this,void 0,void 0,(function*(){return e===s.Z.myId||e===le.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(d.Z.isMobile)this.search?this.search.setQuery(e):this.search=new Nu(this.topbar,this,e);else{let t=nn.getTab(Bu);t||(t=nn.createTab(Bu)),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,sendSilent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===s.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===s.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}}var zu=i(6637);class Gu{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,gi.Z){if(e&&(0,a.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=E(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,a.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,n.fc)(i,(e=>{(0,a.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=E("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,v.$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,ro.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,a.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=E("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"),o=document.createElement("span"),r=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),o.classList.add("markup-tooltip-delimiter"),r.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(r,this.linkApplyButton),t.append(this.linkBackButton,o,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,a.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,zu.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,ro.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,C.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=function(){const e=[],t=window.getSelection();for(let i=0;i!!e))}(),t=[...new Set(e.map((e=>e.parentNode)))],i=new Set;return t.forEach((e=>{for(const t in nd.o){const s=nd.o[t];e.closest(s.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&i.add(this.buttons[t])}})),[...i]}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=En(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,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=(0,Me.Z)(e.left,l,c)}else{const e=s.left+(s.width-o.width)/2;d=(0,Me.Z)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Sc())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"),Je.IS_MOBILE||C.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){gi.Z&&!Je.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,a.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(Sc(i))this.hide();else if(gi.Z)if(Je.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()})))}}function Vu(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function Ku(e,t,i,s,n,a,o,r){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-a)),a>0&&l.push("A"+Vu(a,a,0,0,1,e+i,t+a)),l.push("V"+(t+s-o)),o>0&&l.push("A"+Vu(o,o,0,0,1,e+i-o,t+s)),l.push("H"+(e+r)),r>0&&l.push("A"+Vu(r,r,0,0,1,e+0,t+s-r)),l.push("V"+(t+n)),n>0&&l.push("A"+Vu(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}R.GO.generatePathData=Ku;class Wu{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,v.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,v.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=Ku(5,5,e.width-t,e.height-t,t,t,t,t);this.path.setAttributeNS(null,"d",i)}}var $u=i(7922);function ju(e){e.forEach((e=>e.classList.add("no-transition"))),(0,Be.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var qu=i(490),Qu=i(5228);class Yu{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 l=n.getContext("2d");l.beginPath(),l.moveTo(i,s),l.lineTo(e,s);const{radius:c,radiusNext:d,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(c[n]*(1-i)+d[n]*i))*r+o*(1-r);l.lineTo(e,s)}else{const a=this.progress[n-1],u=c[n-1]*(1-a)+d[n-1]*a,p=this.progress[n],m=(i-e)/h*(n-1),g=(i-e)/h*n,v=m+(g-m)/2,f=(t-u)*r+o*(1-r),y=(t-(c[n]*(1-p)+d[n]*p))*r+o*(1-r);l.bezierCurveTo(v,f,v,y,g,y),n===h&&l.lineTo(i,s)}a(l),l.fill(),l.closePath()}}}class Ju{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=Ju.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===Pu.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===Pu.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===Pu.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===Pu.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class Xu{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:l,currentState:c,previousState:d,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let m=Date.now()-this.lastUpdateTime;m>20&&(m=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*m,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:g,amplitude2:v,progressToState:f}=this,y=6*v*n,b=6*v*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*g)*n,i.minRadius=0,i.maxRadius=(3+9*g)*n,s.minRadius=0,s.maxRadius=(3+9*g)*n,t.update(g,.3),i.update(g,.7),s.update(g,.7);for(let e=0;e<2;e++){if(0===e&&!d)continue;let n=1,h=null;0===e?(n=1-f,h=d):(n=d?f:1,c.update(l-o,r-a,m,g),h=c);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},v=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};i.draw(a,o-y,r,l,p,u,o,1),s.draw(a,o-b,r,l,p,u,o,1),t.draw(a,o,r,l,p,v,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([[Pu.UNMUTED,new Ju(Pu.UNMUTED)],[Pu.MUTED,new Ju(Pu.MUTED)],[Pu.MUTED_BY_ADMIN,new Ju(Pu.MUTED_BY_ADMIN)],[Pu.CONNECTING,new Ju(Pu.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(Pu.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 Yu(3),this.lbd1=new Yu(7),this.lbd2=new Yu(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}}const ep=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)}},tp=ep;class ip{constructor(e,t){this.item=e,(0,x.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class sp{constructor(e,t){this.icon=e,this.autoplay=!1,(0,x.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=hi.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=>hi.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 ip(this,e)}getPart(e){return e instanceof ip?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 np{constructor(e){(0,x.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(ft.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new sp(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 n=e.getPart(t);e.player.playPart({from:s.Z.settings.animationsEnabled&&!this.skipAnimation?n.startFrame:n.endFrame,to:n.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 ap extends np{constructor(e){super({width:e.width,height:e.height}),(0,x.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(ft.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 op extends ap{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=Zp;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 rp=i(6733);class lp extends ap{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=Ap;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=Ap;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=tp.getProperty("gc-"+i+"-text-color");return(0,pa.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=np.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=Ap;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const cp="group-call-participant-status";class dp{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(cp+"-container")}setState(e,t){const i=Ap,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(cp+"-icon",cp+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,v.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,v.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,v.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,c.Z)(this.container,(0,Zt.Z)(t.about));n=(0,v.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(cp,a),o.append(...s,n),(0,g.Z)(this.container,o)}}var hp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class up extends za{constructor(e){super({getIndex:e=>hp(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=>hp(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=Fp(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{Ln(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=gg.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});t.listEl.classList.add("group-call-participant");const i=new lp(!0),s=new dp(["presentation","video"]);return(0,g.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:Be.T2}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=gg.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}class pp extends L.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,x.Z)(this,e);const{listenerSetter:t,element:i}=this;gi.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,r.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,r.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)}}function mp(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,ht.jt)((()=>(s(),t.isConnected))),s(),t}const gp="group-call-participant-video";class vp{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add(gp+"-container"),this.info=document.createElement("div"),this.info.classList.add(gp+"-info"),this.left=document.createElement("div"),this.left.classList.add(gp+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(gp+"-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(gp+"-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,v.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new Ot({peerId:(0,es.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new lp(!1),this.groupCallParticipantStatus=new dp([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add(gp,"call-video"),i.paused&&i.play();const n=mp(i);n.classList.add(gp+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=Fp(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class fp extends pp{constructor(e){super(),(0,x.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(s.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,n.fc)(this.container,(e=>{const t=(0,r.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,es.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 vp(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{l(n.next(e))}catch(e){a(e)}}function r(e){try{l(n.throw(e))}catch(e){a(e)}}function l(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}l((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var yp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class bp{constructor(e){this.onOpenProfileClick=()=>{const e=A.Z.getPopups(Bp)[0];e&&e.hide(),_m.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:()=>yp(this,void 0,void 0,(function*(){In({peerId:this.targetPeerId,title:new Ot({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new Ot({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),ft.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=Ei(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Fi(e.onContextElement,(e=>yp(this,void 0,void 0,(function*(){const t=(0,r.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,a.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 ki(this.buttons,(e=>yp(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),xi(e.touches?e.touches[0]:e,this.element,"right"),Ii.openBtnMenu(this.element))}))),t),t.add(s.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,es.Z)(t.peer);this.targetPeerId===e&&Ii.close()}}));let i=document.body;(0,rp.Ms)(document.body,(()=>{const e=(0,rp.rB)();i=e?A.Z.getPopups(Bp)[0].getContainer():document.body,e||Ii.close()}),t)}}class wp{constructor(e){(0,x.Z)(this,e);const t="group-call-participants",i=new m.ZP(void 0);i.container.classList.add(t+"-scrollable");const n=this.container=document.createElement("div");n.classList.add(t);const a=this.sortedList=new up(this.instance),{instance:o,listenerSetter:r}=this;this.contextMenu=new bp(Object.assign(Object.assign({},e),{onContextElement:a.list,listenerSetter:r,instance:o})),this.groupCallParticipantsVideo=new fp(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(a.list),n.append(i.container),e.appendTo.append(n),r.add(s.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Yi({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(o)}updateParticipant(e){const t=(0,es.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 yp(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class Sp{constructor(e){this.appendTo=e,this.descriptionIntl=new v.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===Pu.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 Cp{constructor(e){this.appendTo=e,this.peerTitle=new Ot({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,c.Z)(i,(0,Zt.Z)(s.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var Lp=i(2820);function Ip(e,t,i){const s=e+"-button",a=document.createElement("div");a.classList.add(s,"call-button","rp-overflow"),i.icon&&a.classList.add("tgico-"+i.icon),i.noRipple||(0,we.Z)(a),i.isDanger&&a.classList.add(s+"-red"),i.isConfirm&&a.classList.add(s+"-green"),i.callback&&(0,n.fc)(a,i.callback,{listenerSetter:t});let o=a;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,v.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(a,t),o=e}return o}const Mp="movable-element",Ep="movable-element-resize-handler";class Pp extends L.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,x.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(Mp),this.addResizeHandlers(),this.setSwipeHandler(),d.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(Mp),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){d.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(Ep,Ep+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new Ks({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,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")?as.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")?as.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,r.Z)(t,Ep);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=as.height/2-this.height/2,this.left=as.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Me.Z)(this.width,this.minWidth,as.width),this.height=(0,Me.Z)(this.height,this.minHeight,as.height)}fixPosition(){this.top=(0,Me.Z)(this.top,0,as.height-this.height),this.left=(0,Me.Z)(this.left,0,as.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 kp,Tp=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 xp{constructor(e){kp.set(this,void 0),(0,x.Z)(this,e),this.toggleMovable(!gi.Z),this.listenerSetter.add(d.Z)("changeScreen",((e,t)=>{t!==d._.mobile&&e!==d._.mobile||this.toggleMovable(!gi.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,kp,"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=Tp(this,kp,new Pp(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(),Tp(this,kp,void 0,"f")}}}function _p(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>_p(e,t,!i)}kp=new WeakMap;var Ap,Zp;function Fp(e){const t=Ap;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"}(Ap||(Ap={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(Zp||(Zp={}));let Dp={width:420,height:640};const Rp="group-call";class Bp extends A.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,rp.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=_p.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 qi("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{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,rp.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,s=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!==s&&(p.Z.checkAnimations(e),$o.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,rp.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(Rp,"night");const e=this.instance=Fu.groupCall,{listenerSetter:t}=this;if(!Je.IS_APPLE_MOBILE){const e=this.btnFullScreen=E("fullscreen"),i=this.btnFullScreen2=E("fullscreen group-call-cfs"),s=this.btnExitFullScreen=E("smallscreen");(0,n.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,n.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,n.fc)(s,(()=>{(0,rp.C8)()}),{listenerSetter:t}),(0,rp.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=E("adduser");const i=this.btnShowColumn=E("rightpanel group-call-only-big");(0,n.fc)(i,this.toggleRightColumn,{listenerSetter:t});const a=document.createElement("div");a.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),a.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,a,this.btnFullScreen,i].filter(Boolean));const l=this.header.cloneNode(!1),c=a.cloneNode(!1),d=this.title.cloneNode(!1);c.append(d);const h=E("rightpanel");l.append(...[h,c,this.btnFullScreen2].filter(Boolean)),(0,n.fc)(h,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(l);const u=new m.ZP(void 0);u.container.classList.add("group-call-big-video-container"),this.container.append(u.container),this.groupCallTitle=new Cp(this.title),this.groupCallDescription=new Sp(o),this.groupCallBodyHeaderDescription=new Sp(d),this.constructButtons(),this.groupCallParticipantsVideo=new fp({appendTo:u.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new wp({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new xp({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,r.Z)(t,"chatlist")||(0,r.Z)(t,"group-call-button")||(0,r.Z)(t,"btn-icon")||(0,r.Z)(t,"group-call-participants-video-container")||(0,rp.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:Dp}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(s.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;Dp=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("group-call-buttons");const t=Ip.bind(null,Rp,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",!Lp.Z);const n=t({noRipple:!0,callback:(0,mt.Z)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new op;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!Lp.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===Pu.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,rp.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=Zp;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===Zp.HAND?"hand":i===Zp.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 Np;!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"}(Np||(Np={}));const Up=Np;class Op{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===Up.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=gt(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case Up.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case Up.REQUESTING:s="Call.StatusRequesting";break;case Up.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case Up.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,v.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===Up.CONNECTED),(0,g.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class Hp extends ap{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 zp="call",Gp={width:400,height:580};let Vp=Object.assign({},Gp);class Kp extends A.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,rp.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,rp.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,s=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!==s&&(p.Z.checkAnimations(e),$o.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(zp,"night");const s=document.createElement("div");s.classList.add("call-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new Wm;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),s.append(o);const l=new Ot({peerId:a}).element;l.classList.add("call-title");const c=document.createElement("div");c.classList.add("call-subtitle"),this.description=new Op(c);const d=this.emojisSubtitle=document.createElement("div");d.classList.add("call-emojis"),t.append(s,l,c),Je.IS_MOBILE?this.header.append(d):(this.btnFullScreen=E("fullscreen"),this.btnExitFullScreen=E("smallscreen hide"),(0,n.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,n.fc)(this.btnExitFullScreen,(()=>(0,rp.C8)()),{listenerSetter:i}),(0,rp.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(d)),this.partyStates=document.createElement("div"),this.partyStates.classList.add("call-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add("call-party-state");const h=(0,v.ag)("VoipUserMicrophoneIsOff",[new Ot({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);h.classList.add("call-party-state-text");const u=new Hp(!1,!0);u.setState(!1,!1),this.partyMutedState.append(u.container,h),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=Ip.bind(null,zp,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new xp({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,r.Z)(t,"call-button")||(0,r.Z)(t,"btn-icon")||(0,rp.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Vp:Object.assign({},Gp)});const m=this.movablePanel.movable;m&&this.listenerSetter.add(m)("resize",(()=>{this.resizeVideoContainers()}));const g=this.controlsHover=new pp;g.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),g.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Vp=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add("call-buttons","is-first");const t=_p.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)}});Lp.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new v.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Hp(!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("call-buttons","is-second"),this.declineI18nElement=new v.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=document.createElement("div");t.classList.add("call-video-container"),e.classList.add("call-video"),e.paused&&e.play(),(0,n.fc)(t,(()=>{if(!t.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=t.style.cssText,t.classList.remove("small"),t.style.cssText="",this.resizeVideoContainers()}));const i=mp(e);return i.classList.add("call-video-blur"),t.append(i,e),t}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===Up.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,rp.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===Up.PENDING;this.declineI18nElement.compareAndUpdate({key:t===Up.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 l=e.getMediaState("output");Re(this.partyMutedState,"is-visible",!!(null==l?void 0:l.muted),300);const c=this.videoContainers,d=Object.assign({},c);["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,pt.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=c[t];a&&s&&!o&&(o=c[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete c[t])}));{const e=c.input,t=c.output;Object.keys(d).length!==Object.keys(c).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(c).length),!this.emojisSubtitle.textContent&&t{(0,g.Z)(this.emojisSubtitle,(0,Zt.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,rp.rB)()?65535:a?i.height:i.width),l=a?t.videoWidth/t.videoHeight:1,c=a?1:t.videoHeight/t.videoWidth;e.style.width=r*l+"px",e.style.height=r*c+"px",e.style.maxWidth=o*l+"px",e.style.maxHeight=o*c+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}function Wp(e){const t=Lu(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=Lu(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 l=new Map,c=e=>{let t=l.get(e);return t||l.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=c(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;c(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=c(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(l.values())}return i}class $p extends fh{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=Wp(Su(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}));var e,t,i,s}}let jp;var qp=i(4484),Qp=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Yp=45e3;class Jp extends L.Z{construct(e){this.managers=e,this.log=(0,he.kg)("CC"),nl.Z&&(this.audioAsset=null!=jp?jp:jp=new qd(["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=[],s.Z.addEventListener("call_update",(e=>Qp(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(Up.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(Yp,"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 Gi.Z.invokeCrypto("sha256",t);if(!(0,qp.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}}})))),s.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 vm(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===Up.CLOSED?(this.instances.delete(t.id),(0,T.Z)(this.sortedInstances,t)):(0,Ha.Z)(this.sortedInstances,t,"sortIndex"),e===Up.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===Up.EXCHANGING_KEYS||e===Up.CONNECTING&&s?t.setHangUpTimeout(Yp,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===Up.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===Up.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===Up.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===Up.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 Qp(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(Up.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:le.NM,date:(0,wl.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>Qp(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(Up.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(Yp,"phoneCallDiscardReasonHangup")}))}))}}const Xp=new Jp;R.GO&&(R.GO.callsController=Xp);const em=Xp;var tm=i(4903);const im="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var sm=i(3692),nm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class am{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,tm.Z)(...e),im.digest("SHA-256",(0,sm.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return nm(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 nm(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 nm(this,void 0,void 0,(function*(){const t=yield im.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield im[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,l=yield this.prepareAesKeyIv(n,a,s),c=yield this.aesProcessCtr(o,r,l,!1),d=yield this.concatSHA256([n.subarray(88+s,88+s+32),c]);if(this.constTimeIsDifferent(d.subarray(8),a,16))return;const h=new DataView(c.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),c.slice(4))}))}}class om{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 nh;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 l="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",hm(c)),s&&r.add(`a=msid:${l} audio${s}`),r.add("a=rtcp-mux",um(a),pm(i,s,n,l));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",hm(c)),s&&r.add(`a=msid:${l} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",um(a),pm(i,s,n,l))}}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 nh;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 l="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",hm(c)),s&&r.add(`a=msid:${l} audio${s}`),r.add("a=rtcp-mux",um(a),pm(i,s,n,l));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",hm(c)),s&&r.add(`a=msid:${l} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",um(a),pm(i,s,n,l))}}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 rm{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 l="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+=hm(c),r+="\na=rtcp-mux",r+=um(a),r+=pm(i,s,n,l);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+=hm(c),r+="\na=rtcp-mux\na=rtcp-rsize",r+=um(a),r+=pm(i,s,n,l)}}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 l="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+=hm(h),r+="\na=rtcp-mux",r+=um(c),r+=pm(i,n,a,l);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${c.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=hm(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=um(c),r+=pm(i,n,a,l)}}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 lm{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 l="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+=hm(c),s&&(r+=`\na=msid:${l} audio${s}`),r+="\na=rtcp-mux",r+=um(a),r+=pm(i,s,n,l);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+=hm(c),s&&(r+=`\na=msid:${l} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=um(a),r+=pm(i,s,n,l)}}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 l="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+=hm(c),s&&(r+=`\na=msid:${l} audio${s}`),r+="\na=rtcp-mux",r+=um(a),r+=pm(i,s,n,l);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+=hm(c),s&&(r+=`\na=msid:${l} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=um(a),r+=pm(i,s,n,l)}}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 cm(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function dm(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function hm(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),c){const e=[];Object.getOwnPropertyNames(c).forEach((t=>{e.push(`${t}=${c[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function pm(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 mm{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:l,type:c,relAddress:d,generation:h,tcpType:u,networkId:p,networkCost:m,username:g}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return cm()?rm.generateOffer(e):dm()?lm.generateOffer(e):om.generateOffer(e)}static generateAnswer(e){return cm()?rm.generateAnswer(e):dm()?lm.generateAnswer(e):om.generateAnswer(e)}}var gm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class vm extends ph{constructor(e){super(),this.log=(0,he.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,x.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",Up[e]),e===Up.CLOSED&&this.cleanup()}));const t=this.streamManager=new uh(100);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,Ki.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?Up.CLOSED:"connected"===e||Je.IS_SAFARI&&"completed"===e?Up.CONNECTED:Up.CONNECTING}return Up.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(Up.CLOSED-e+1);return t+=2147483647e3-(e===Up.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 gm(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 gm(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return gm(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 gm(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&&(sh(s),t.appendToConference(i))}))}toggleVideoSharing(){return gm(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===Up.CLOSING||e===Up.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=er.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 gm(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(Up.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=>gm(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=>gm(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 $p({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===Up.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 am(e,t),this.decryptor=new am(!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 gm(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,...l]=e.split(" "),c={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,pi.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return gm(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=Wp(Su(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 gm(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(Up.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 gm(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))})));[gh("audio",+e.audio.ssrc),e.video?gh("video",s(e.video.ssrcGroups)):void 0,e.screencast?gh("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 mh(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=mm.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 gm(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 gm(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 gm(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"),em.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}class fm{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new I.Z;t.add(em)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(em)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(Fu)("instance",(e=>{this.updateInstance(e)})),t.add(s.Z)("group_call_update",(e=>{const t=Fu.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(uh.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 I.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof Tu?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof Tu)));const i=this.instance.isMuted,s=e instanceof Tu?e.state:function(e,t){switch(e){case Up.CLOSING:case Up.CLOSED:return Pu.CLOSED;case Up.CONNECTED:return t?Pu.MUTED:Pu.UNMUTED;default:return Pu.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===Pu.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),Re(document.body,"is-calling",!a,250,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 Tu)return this.groupCallTitle.update(e);(0,g.Z)(this.center,new Ot({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const i=document.createElement("div");i.classList.add("topbar-call-left");const s=this.groupCallMicrophoneIconMini=new Hp,o=E();o.append(s.container),i.append(o);const r=(0,mt.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,n.fc)(o,(e=>{(0,a.Z)(e),r()}),{listenerSetter:e});const l=this.center=document.createElement("div");l.classList.add("topbar-call-center"),this.groupCallTitle=new Cp(l),this.groupCallDescription=new Sp(i),this.callDescription=new Op(i);const c=document.createElement("div");c.classList.add("topbar-call-right");const d=E("endcall_filled");c.append(d),(0,n.fc)(d,(e=>{(0,a.Z)(e);const{instance:t}=this;t&&(t instanceof Tu?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,n.fc)(t,(()=>{if(this.instance instanceof Tu){if(A.Z.getPopups(Bp).length)return;(new Bp).show()}else if(this.instance instanceof vm){if(A.Z.getPopups(Kp).find((e=>e.getCallInstance()===this.instance)))return;new Kp(this.instance).show()}}),{listenerSetter:e}),t.append(i,l,c);const h=this.weave=new Xu,u=h.render("topbar-call-weave");t.prepend(u),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var ym=i(6009),bm=i(6702),wm=i(1722),Sm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const Cm=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=Qn.Z,this.faviconEl=document.head.querySelector('link[rel="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&&bm.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?bm.default.subscribe():bm.default.unsubscribe())}bm.default.setSettings(this.settings)})),Gi.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,Oe.Z)(),qu.Z.addEventListener("deactivated",(()=>{this.stop()})),qu.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),dl.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),s.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),s.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&s.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),bm.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):bm.default.subscribe()})),bm.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),bm.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),s.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),bm.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((()=>Sm(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))||_m.setInnerPeer({peerId:t,lastMsgId:(0,cl.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return Sm(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},r=yield this.managers.appPeersManager.getPeerString(n);let l;if(s.show_previews){if("message"===e._&&e.fwd_from&&t>1)l=v.ZP.format("Notifications.Forwarded",!0,[t]);else if(l=yield Aa(e,void 0,void 0,!0),i){const e="Notification.Contact.Reacted",t=[(0,dn.Z)(i.reaction),l];l=v.ZP.format(e,!0,t)}}else l=v.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const c=i?(0,es.Z)(i.peer_id):e.fromId;o.title=yield(0,Rt.Z)(n,!0,void 0,void 0,this.managers),a&&c!==e.peerId&&(o.title=(yield(0,Rt.Z)(c,!0,void 0,void 0,this.managers))+" @ "+o.title),o.title=(0,Xt.Z)(o.title),o.onclick=()=>{_m.setInnerPeer({peerId:n,lastMsgId:e.mid})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const d=yield this.managers.appPeersManager.getPeerPhoto(n);d?this.managers.appAvatarsManager.loadAvatar(n,d,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=dl.Z.isIdle){if(Je.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=v.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 ${yt}`,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="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}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,wl.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 bm.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),wm.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,Je.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,wl.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,bm.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),s.Z.addEventListener("settings_updated",this.updateLocalSettings),bm.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,gs.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}))}};R.GO&&(R.GO.uiNotificationsManager=Cm);const Lm=Cm;var Im=i(5936),Mm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};function Em(e,t=!1){return Mm(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>Mm(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>Mm(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{const t=location.hash;e||C.Z.replaceState();const i=t.split("?"),s=this.parseUriParams(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr){const{onclick:e}=(0,Pa.Z)(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else{"#/im"!==i[0]&&(s.p=i[0].slice(1));{const e=s.p,t=void 0!==s.post?(0,cl.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=()=>{document.documentElement.style.setProperty("--messages-text-size",s.Z.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!s.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",s.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Ki.Z)((()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),s.Z.settings.animationsEnabled?250:0,!1,!0),hi.Z.setLoop(s.Z.settings.stickers.loop),p.Z.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();v.ZP.setTimeFormat(s.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>Pm(this,void 0,void 0,(function*(){const i=Kc();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,a.Z)(e)}const s=yield Em(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(o.Z.has(s[0].type)?"media":"document"),A.Z.createPopup(Wc,this.chat,s,e.willAttachType)}}))}get myId(){return s.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(v.ZP.lastRequestedLangCode),vt.Z.construct(e),Lm.construct(e),this.log=(0,he.kg)("IM",he.v9.Log|he.v9.Warn|he.v9.Debug|he.v9.Error),this.backgroundPromises={},Qo.h.settings.themes.forEach((e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg"+(Je.IS_FIREFOX?"?1":"");this.backgroundPromises[e.background.slug]=Promise.resolve(t)}})),this.selectTab(0),dl.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(d.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),C.Z.onHashChange=this.onHashChange,this.setSettings(),s.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};s.Z.addEventListener("premium_toggle",i),i(s.Z.premium),(0,He.ZP)((()=>{p.Z.setOnlyOnePlayableGroup("lock"),p.Z.checkAnimations(!0)}),(()=>{p.Z.setOnlyOnePlayableGroup(),p.Z.checkAnimations(!1)})),Je.IS_FIREFOX&&Gi.Z.oldVersion&&-1===(0,ym.Z)(Gi.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),d.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(Dr)&&document.body.classList.contains(tn)&&nn.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),d.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();Uu.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),s.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),s.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),s.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||Un.Z.isOverlayActive||d.Z.activeScreen===d._.mobile&&1!==this.tabId)return;const a=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==a?void 0:a.action)||void 0===i?void 0:i._)){const t=a.action,i=s.bubbles.bubbles[(0,cl.Z)(a.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&i.classList.contains("sticker")&&En(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,n.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const o=e=>{const t="version"===e,i=new A.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,v.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,v.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{wm.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),qu.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};qu.Z.addEventListener("deactivated",o),qu.Z.deactivatedReason&&o(qu.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),s.Z.addEventListener("service_notification",(e=>{In({button:{langKey:"OK",isCancel:!0},description:(0,ii.Z)(e.message)})})),s.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>Pm(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;Li({langPackKey:"PaymentInfoHint",langPackArguments:[Ea(n.total_amount,n.currency),(0,Zt.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,r.Z)(e.target,"spoiler"),i=(0,r.Z)(t,"message")||t.parentElement,s="is-spoiler-visible",o=i.classList.contains(s);o||((0,a.Z)(e),"click"!==n.pf&&window.addEventListener("click",a.Z,{capture:!0,once:!0}));const l=o?0:2;l&&i.classList.add("will-change");const c=i.dataset.spoilerTimeout;null!==c&&(clearTimeout(+c),delete i.dataset.spoilerTimeout),Re(i,s,!0,200,(()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{Re(i,s,!1,200,(()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}))}),5e3)}),l)},s.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?Li({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||Li({langPackKey:"RemovedFromRecent"})})),Gi.Z.addEventListener("notificationBuild",(e=>{(this.chat.peerId!==e.message.peerId||dl.Z.isIdle)&&Lm.buildNotification(e)})),this.addEventListener("peer_changed",(e=>Pm(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),Gi.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),$u.Z.setToCache("chatPositions",{}),(nl.Z||Wd.Z)&&(this.topbarCall=new fm(e)),nl.Z&&(em.addEventListener("instance",(({instance:e})=>{const t=new Kp(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(em.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=em.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),em.addEventListener("incompatible",(e=>{Li({langPackKey:"VoipPeerIncompatible",langPackArguments:[new Ot({peerId:e.toPeerId()}).element]})}))),qu.Z.activateInstance();const l=()=>{Qu.default.setAuthorized(!0)};setInterval(l,U),l(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new qi("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:sl.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"invoice",callback:({pathnameParams:e})=>{const t={_:sl.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:sl.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),Wd.Z&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(sl.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>Pm(this,void 0,void 0,(function*(){let i;i=Mo.kO.test(e[0])?{_:sl.USER_PHONE_NUMBER,phone:e[0].slice(1)}:"c"===e[0]?{_:sl.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:sl.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(i)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;e.phone?t=this.makeLink(sl.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(t=this.makeLink(sl.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(sl.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(sl.STICKER_SET,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(sl.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(sl.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener()}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(s.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===d._.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;if(Un.Z.isOverlayActive||e.has(s))return;const n=t.target,o=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===n.tagName){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(o.input.editMsgId||!o.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(o.peerId,o.threadId).then((e=>{e&&(o.input.initMessageEditing(e.mid),(0,a.Z)(t))}))}else if("ArrowDown"===s)return}else(0,a.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,gg.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==o?void 0:o.input)||void 0===i?void 0:i.messageInput)&&t.target!==o.input.messageInput&&"INPUT"!==n.tagName&&!n.hasAttribute("contenteditable")&&!gi.Z&&(!d.Z.isMobile||1===this.tabId)&&!o.selection.isSelecting&&!o.input.recording){o.input.messageInput.focus(),(0,bl.Z)(o.input.messageInput);const e=new KeyboardEvent(t.type,t);o.input.messageInput.dispatchEvent(e)}}}))}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return Pm(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case sl.MESSAGE:{const t=e.post?(0,cl.Z)(+e.post):void 0,i=e.comment?(0,cl.Z)(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start});break}case sl.PRIVATE_POST:{const t=e.channel.toChatId(),i=t.toPeerId(!0);if((yield this.managers.appChatsManager.getChat(t)).deleted)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw Li({langPackKey:"LinkNotFound"}),e}const s=(0,cl.Z)(+e.post),n=e.thread?(0,cl.Z)(+e.thread):void 0;n?this.openThread(i,s,n):this.setInnerPeer({peerId:i,lastMsgId:s,threadId:n});break}case sl.STICKER_SET:new qn({id:e.set}).show();break;case sl.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new al(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&Ci((0,v.ag)("InviteExpired"))}));break;case sl.VOICE_CHAT:Wd.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case sl.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&&Li({langPackKey:"Alert.UserDoesntExists"})}));break;case sl.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new lc(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,Pa.Z)(e),s=document.createElement("a");s.href=t,window[i](s)}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{(0,a.Z)(null);const i=t.href;let s,n;e.noPathnameParams||(s=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(i));const o=e.callback({pathnameParams:s,uriParams:n},t);return void 0===o&&o}}parseUriParams(e,t=e.split("?")){const i={};return t[1]?(t[1].split("&").forEach((e=>{i[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),i):i}openUsername(e){const{userName:t,lastMsgId:i,threadId:s,commentId:n,startParam:a}=e;return this.managers.appUsersManager.resolveUsername(t).then((e=>{const t="user"===e._,o=e.id.toPeerId(!t);return s?this.openThread(o,i,s):n?this.openComment(o,i,n):this.setInnerPeer({peerId:o,lastMsgId:i,startParam:a})}),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?Li({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&Li({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e,t,i){return this.managers.appMessagesManager.wrapSingleMessage(e,i).then((s=>(s?this.managers.appMessagesManager.generateThreadServiceStartMessage(s):t=void 0,this.setInnerPeer({peerId:e,lastMsgId:t,threadId:i,type:"discussion"}))))}openComment(e,t,i){return this.managers.appMessagesManager.getDiscussionMessage(e,t).then((e=>this.openThread(e.peerId,i,e.mid)))}callUser(e,t){return Pm(this,void 0,void 0,(function*(){em.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?In({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[new Ot({peerId:e.toPeerId()}).element],button:{langKey:"OK",isCancel:!0}}):(yield this.discardCurrentCall(e.toPeerId()),em.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return Fu.groupCall&&Fu.groupCall!==t?this.discardGroupCallConfirmation(e):em.currentCall&&em.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Pm(this,void 0,void 0,(function*(){const t=em.currentCall;t&&(yield In({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[new Ot({peerId:t.interlocutorUserId.toPeerId(!1)}).element,new Ot({peerId:e}).element],button:{langKey:"OK"}}),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Pm(this,void 0,void 0,(function*(){const t=Fu.groupCall;t&&(yield In({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new Ot({peerId:t.chatId.toPeerId(!0)}).element,new Ot({peerId:e}).element],button:{langKey:"OK"}}),Fu.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Pm(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 Li({langPackKey:"VoiceChat.Chat.Ended"});yield In({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{Pm(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)}Fu.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=$o.Z.getTheme();if(t.background.slug){const i=Qo.h.settings.themes.find((e=>e.name===t.name));return this.getBackground(t.background.slug).then((t=>this.setBackground(t,e)),(()=>(t.background=(0,Ji.Z)(i.background),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&&s.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=$u.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,no.Z)(t.bubbles,"desc").filter((e=>!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}$u.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=$u.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),$o.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&ju([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),s.Z.settings.animationsEnabled&&!1!==t&&(0,He.YW)((0,on.Z)(400),400);const i=(0,Cn.Z)(this.prevTab);(0,Cn.Z)(e)>i&&C.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,ln.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),gi.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Gu(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(a,c)=>Pm(this,void 0,void 0,(function*(){if(c===i)return;const d=a.dataTransfer.types,h=d.contains?d.contains("Files"):d.indexOf("Files")>=0,u=Kc(),p=yield Em(a,!0);if(!h||!(yield this.canDrag())&&!u)return void(n=0);const m=u?l:r,g=u?t:e;if(c&&!g.length){const e=h&&!p.length,t=p.filter((e=>o.Z.has(e))).length;this.log("drag files",p),u?(u.appendDrops(m),(p.length||e)&&g.push(new Wu(m,{header:"Preview.Dragging.AddItems",headerArgs:[p.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((p.length||e)&&g.push(new Wu(m,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&g.push(new Wu(m,{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(m))}Re(m,"is-visible",c,200,(()=>{c||(g.forEach((e=>{e.destroy()})),g.length=0)})),c?g.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",c),i=c}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,a.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const r=document.createElement("div");r.classList.add("drops-container");const l=r.cloneNode(!0)}canDrag(){return Pm(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||Un.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return Pm(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}C.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&ju([Hr.sidebarEl,this.columnEl,nn.sidebarEl]),document.body.classList.toggle(Dr,0===e);const n=this.tabId;-1!==n&&this.overrideHash(e>0?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.log("selectTab",e,n);let a=s.Z.settings.animationsEnabled?(0,Be.d1)():Promise.resolve();if(-1!==n&&n!==e&&s.Z.settings.animationsEnabled&&!1!==t&&d.Z.activeScreen!==d._.large){const e=100+(d.Z.isMobile?250:200);a=(0,on.Z)(e),(0,He.YW)(a,e)}this.tabId=e,(0,ln.Z)(),d.Z.isMobile&&2===n&&e<2&&document.body.classList.remove(tn),-1!==n&&e>n&&(e<2||!C.Z.findItemByType("im"))&&C.Z.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}});const o=window.onImTabChange;return o&&o(e),a}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new Hu(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 a=this.chat;this.dispatchEvent("chat_changing",{from:n,to:a});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(a.container,i),t){this.dispatchEvent("peer_changed",a.peerId);const e=nn.getTab(Bu);e&&e.close(),nn.replaceSharedMediaTab(a.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return Pm(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=le.NM);const{peerId:s,lastMsgId:n}=e,a=this.chat,o=this.chats.indexOf(a);if(s){if(o>0&&a.peerId&&a.peerId!==s){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(o>0)return void this.spliceChats(o,void 0,t);if(d.Z.activeScreen===d._.medium)return void this.selectTab(+!this.tabId,t)}if(s===a.peerId&&d.Z.activeScreen<=d._.medium&&document.body.classList.contains(Dr))return this.selectTab(1,t),!1;if(s||d.Z.activeScreen!==d._.mobile){const i=yield a.setPeer(s,n,e.startParam),o=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([o,a.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(1,t)}),0)}))}return s?void 0:(this.selectTab(0,t),!1)}))}setInnerPeer(e){var t;const{peerId:i}=e;if(i===le.NM||!i)return;e.threadId&&(e.type="discussion");const s=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex((e=>e.peerId===i&&e.type===s));if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const a=this.chat;let o=a;return a.inited&&(o=this.createNewChat()),s&&(o.setType(s),e.threadId&&(o.threadId=e.threadId)),this.dispatchEvent("chat_changing",{from:a,to:o}),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){return Pm(this,void 0,void 0,(function*(){const i=e.isUser();if(i&&(yield this.managers.appUsersManager.isBot(e)))return;const s=yield this.managers.appProfileManager.getPeerTypings(e);if(!(null==s?void 0:s.length))return;const n=s[0],a={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"}},o=i?a.private:s.length>1?a.multi:a.chat;let r=n.action;if(s.length>1){const e={};s.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;let c,d;if(e.isAnyChat()){const e=new Ot;c=e.update({peerId:n.userId.toPeerId(!1),onlyFirstName:!0}),d=[e.element,s.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let h=t.firstElementChild;if(h?h.dataset.action!==r._&&h.replaceWith(this.getTypingElement(r)):(h=this.getTypingElement(r),t.prepend(h)),"sendMessageEmojiInteractionSeen"===r._){d?d.pop():d=[];const e=(0,Ca.Z)((0,Zt.Z)(r.emoticon));d.push(e)}const u=(0,v.ag)(l,d);return u.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(u):t.append(u),t}))}getChatStatus(e){return Pm(this,void 0,void 0,(function*(){const t=yield this.getPeerTyping(e.toPeerId(!0));if(t)return{cached:!0,result:Promise.resolve(t)};const i=yield this.managers.acknowledged.appProfileManager.getChatFull(e),s=Promise.resolve(i.result).then((t=>Pm(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 cs(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,v.v_)([a,(0,v.ag)("OnlineCount",[ls(o)])],!1)),a=e}return a}))));return{cached:i.cached,result:s}}))}getUserStatus(e,t){var i;return Pm(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=ce(n);if(!n.pFlags.bot){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){return Pm(this,void 0,void 0,(function*(){if(!e)return;let i;return i=e.isAnyChat()?this.getChatStatus(e.toChatId()):this.getUserStatus(e.toUserId(),t),i}))}setPeerStatus(e,t,i,s,n,a){return Pm(this,void 0,void 0,(function*(){if(!i){const i=t.querySelector(".peer-typing-container");if(i&&(yield this.getPeerTyping(e,i)))return}const o=yield this.getPeerStatus(e,a);if(!n())return;const r=()=>Pm(this,void 0,void 0,(function*(){const e=o&&(yield o.result);if(n())return()=>(0,g.Z)(t,e||l)})),l=s?"‎":"";return!o||o.cached?yield r():i?()=>(t.textContent=l,r().then((e=>e&&e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}}const xm=new Tm;R.GO&&(R.GO.appImManager=xm);const _m=xm;class Am extends pp{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 I.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 At(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:o}=this;t.classList.add(s);const r=this.buildControls();let l;if(t.insertAdjacentHTML("beforeend",r),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),r=t.querySelector("#time-elapsed");l=t.querySelector("#time-duration"),l.textContent=gt(0|i.duration);const c=new Bd(o),d=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),d.insertBefore(c.btn,r.parentElement),Array.from(e).forEach((e=>{(0,n.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,n.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,Ki.Z)(e,t,!1,!0);o.add(i)("enterpictureinpicture",(()=>{s(!0),o.add(i)("leavepictureinpicture",(()=>{const e=o.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{o.remove(e)}),t)}),{once:!0})})),o.add(i)("leavepictureinpicture",(()=>{s(!1)}))}gi.Z||((0,n.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),o.add(document)("keydown",(e=>{if(Un.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let o=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)vt.Z.muted=!vt.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?o=!1:"ArrowLeft"===s?vt.Z.seekBackward({action:"seekbackward"}):vt.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=vt.Z.playbackRate,i=Am.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{gi.Z||this.toggleFullScreen()})),(0,n.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,rp.Ms)(t,this.onFullScreen.bind(this,s),o),o.add(i)("timeupdate",(()=>{r.textContent=gt(0|i.currentTime)})),o.add(i)("play",(()=>{t.classList.add("played"),gi.Z||o.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),o.add(i)("pause",(()=>{this.showControls(!1)})),o.add(vt.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}o.add(i)("play",(()=>{t.classList.add("is-playing")})),o.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?l.textContent=gt(Math.round(i.duration||e)):(0,pt.Z)(i).then((()=>{l.textContent=gt(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 ${!Je.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=Am.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{vt.Z.playbackRate=e}}))),t=Ei(e);t.classList.add("top-left"),po(this.playbackRateButton,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,void 0,this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;Am.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=Am.PLAYBACK_RATES.indexOf(vt.Z.playbackRate);-1===t&&(t=Am.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+Am.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(Je.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,rp.rB)()?(0,rp.C8)():(0,rp.Dj)(e)}onFullScreen(e){const t=(0,rp.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}}Am.PLAYBACK_RATES=[.5,1,1.5,2],Am.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var Zm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Fm extends L.Z{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,a.Z)(e),gi.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,r.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(Un.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,a.Z)(e)},this.onKeyUp=e=>{Un.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(Un.Z.overlaysActive>1||(0,r.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,a.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=s.Z.managers,this.log=(0,he.kg)("AMV"),this.preloader=new Ue,this.preloaderStreamable=new Ue({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new ve.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add("media-viewer");const o=this.topbar=document.createElement("div");o.classList.add("media-viewer-topbar","media-viewer-appear");const l=document.createElement("div");l.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=E("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const c=document.createElement("div");this.author.avatarEl=new Wm,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),c.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,c);const d=document.createElement("div");d.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=E(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=E("zoomout",{noRipple:!0}),(0,n.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=E("zoomin",{noRipple:!0}),(0,n.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new _t({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("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),l.append(this.buttons["mobile-close"],this.author.container),o.append(l,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-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()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){(0,n.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,n.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,a.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,n.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)},gi.Z&&new Ks({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,rp.rB)())return Math.abs(e)/as.width>.2||e>125?(e<0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/as.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!(0,r.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 Ks({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=mo({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&(0,a.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&C.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){Un.Z.isOverlayActive=e,p.Z.checkAnimations(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),gi.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return Zm(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,l=s.Z.settings.animationsEnabled?o?350:200:0;let c,d;e&&(e instanceof Wm||e.classList.contains("grid-item")?(c=e,d=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(c=(0,r.Z)(e,"attachment"),d=c.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(c=(0,r.Z)(e,"profile-avatars-container"),d=c.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==d.left&&(e=c=d=void 0))),e||(e=this.content.media),d||(c=e.parentElement,d=e.getBoundingClientRect());let h=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=En(c,(0,r.Z)(c,"scrollable"),!0);!t||i&&2!==i.overflow.vertical&&2!==i.overflow.horizontal?!i||1!==i.overflow.vertical&&1!==i.overflow.horizontal||(h=!0):(c=(e=this.content.media).parentElement,d=e.getBoundingClientRect())}const u=this.content.media.getBoundingClientRect();let p,m,g,v="";if(o?(p=1===i?as.width:-u.width,m=u.top):(p=d.left,m=d.top),v+=`translate3d(${p}px,${m}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){g=n.firstElementChild;const e=g.querySelector(".ckin__player");if(e){const t=e.firstElementChild;g.append(t),e.remove()}g.style.cssText||(n.classList.remove("active"),this.setFullAspect(g,u,d),n.offsetLeft,n.classList.add("active"))}else g=document.createElement("div"),g.classList.add("media-viewer-aspecter"),n.prepend(g);g.style.cssText=`width: ${d.width}px; height: ${d.height}px; transform: scale3d(${u.width/d.width}, ${u.height/d.height}, 1);`}n.style.width=u.width+"px",n.style.height=u.height+"px";const f=d.width/u.width,y=d.height/u.height;o||(v+=`scale3d(${f},${y},1) `);let b=window.getComputedStyle(c).getPropertyValue("border-radius");const w=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=w.map((e=>parseInt(e)/f+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=as.width/2-d.width/2,t=as.height/2-d.height/2,i=d.left-e,s=d.top-t;this.moversContainer.style.transform=`matrix(${f}, 0, 0, ${y}, ${i}, ${s})`}else n.style.transform=v;let S;h&&(n.style.opacity="0");const C=e.classList.contains("is-out"),L=this.setMoverAnimationPromise=(0,Oe.Z)(),I={onAnimationEnd:L},M=setTimeout((()=>{L.isFulfilled||L.isRejected||L.resolve()}),1e3);if(L.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===L&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(S=n.querySelector("path"),S&&this.sizeTailPath(S,u,f,l,!1,C,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)}),l/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",L.resolve()}),l),n.classList.remove("opening"),I;{let t,i;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}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=ut(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=u,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,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/f:2/f}, ${a}) scale(${+n/f}, ${+o/y})`)),l.setAttributeNS(null,"transform",t),S=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=C?Ku(0,0,s-9/f,a,...i):Ku(9/f,0,s-9/f,a,...i),S.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+u.width),c.setAttributeNS(null,"height",""+u.height),n.prepend(o)}g&&(g.style.borderRadius=b,t&&g.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),g||(t.style.width=u.width+"px",t.style.height=u.height+"px"),i&&(yield Ze(t,i))),n.style.display="",(0,Be.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,Be.d1)(),n.style.transform=`translate3d(${u.left}px,${u.top}px,0) scale3d(1,1,1)`,h&&(n.style.opacity=""),g&&this.setFullAspect(g,u,d),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),g&&(n.querySelector("video"),n.classList.remove("active"),g.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,L.resolve()}),l),S&&this.sizeTailPath(S,u,f,l,!0,C,b),I}))}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:l,height:c}=t;s/=2;const d=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=d.map((e=>e*o));let p;p=a?Ku(0,0,l-9/i*o,c,...u):Ku(9/i*o,0,l,c,...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,r.Z)(e,"document")){if((0,r.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()}}Ae(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=js({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,Zt.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||le.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,g.Z)(this.author.date,G(t)),(0,g.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,n,o=!1,r=[],l=[],c){return Zm(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const h=this.setAuthorInfo(i,t),p="document"===e._,m=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(r,l,o),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=!n||n===g;v&&(n=g),this.target={element:n};const f=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield h,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),Je.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},C.Z.pushItem(this.navigationItem)));const y=this.content.mover,b=as.width;let w=0;const S=as.height;S<1e6&&!d.Z.isMobile&&(w=120);const L=S-120-w;let I=Promise.resolve();const M=lt(e,g,b,L,!d.Z.isMobile,void 0,!!(p&&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=at(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const E=!(!p||!e.supportsStreaming),P=E?this.preloaderStreamable:this.preloader,k=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let T;if(m){const t=c&&"gif"!==e.type,i=ut({pip:t}),o=()=>this.setMoverToTarget(n,!1,s).then((({onAnimationEnd:s})=>{const o=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!==f&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),Je.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),o.append(i);const l=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),d=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([l,s]).then((()=>{this.tempId===f&&((this.videoPlayer=new Am({video:i,play:!0,streamable:E,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?C.Z.removeItem(this.navigationItem):C.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,vt.Z.setPictureInPicture(i)):this.releaseSingleMedia=vt.Z.setSingleMedia(i,c))},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(E){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{console.log("ppp 2"),P.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,a.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>Zm(this,void 0,void 0,(function*(){const a=E?Promise.resolve():u.Z.downloadMediaURL({media:e});return E||s.then((()=>Zm(this,void 0,void 0,(function*(){(yield k()).url||(console.log("ppp 4"),P.attach(y,!0,a))})))),Promise.all([a,s]).then((()=>Zm(this,void 0,void 0,(function*(){if(this.tempId!==f)return void this.log.warn("media viewer changed video");const e=(yield k()).url;i.addEventListener("error",(()=>{4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),P&&P.detach()}),{once:!0}),n instanceof SVGSVGElement?o.firstElementChild.lastElementChild.append(i):Ae(i,e),t&&(this.releaseSingleMedia=vt.Z.setSingleMedia(i,c),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(n,e,"video"),d()})))),a}))})}));T=I.then(o)}else{const t=()=>this.setMoverToTarget(n,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>Zm(this,void 0,void 0,(function*(){const i=p?u.Z.downloadMediaURL({media:e}):u.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>Zm(this,void 0,void 0,(function*(){(yield k()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>Zm(this,void 0,void 0,(function*(){var e;if(this.tempId!==f)return void this.log.warn("media viewer changed photo");const t=(yield k()).url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(y,t,"img"),d.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"),Ae(e,t,(()=>{this.updateMediaSource(n,t,"img"),s&&(0,Be.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));T=I.then(t)}return this.setMoverPromise=T.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}var Dm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Rm extends Fm{constructor(){let e;super(new h.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,Se.Z)(e);if(n&&(!t||Rm.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>Dm(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>Dm(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 Qa(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new ja({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>Dm(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((()=>Dm(this,void 0,void 0,(function*(){if(d.Z.isMobile){const e=nn.getTab(en);e&&e.close()}_m.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>Dm(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,Se.Z)(i);s&&u.Z.downloadToDisc({media:s,queueId:_m.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption","message");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{d.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new m.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,n.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()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),(0,n.fc)(this.buttons.forward,this.onForwardClick),(0,n.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,l.Z)(t.target,"A"),s=(0,r.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,a.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,ii.Z)(t,{entities:e.totalEntities})),(0,c.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 Dm(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,l=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,c=(0,Se.Z)(e),d="messageService"===e._||!this.managers.appMessagesManager.canForward(e);[this.buttons.forward,this.btnMenuForward.element].forEach((e=>{e.classList.toggle("hide",d)})),this.wholeDiv.classList.toggle("no-forwards",d);const h=d;[this.buttons.download,this.btnMenuDownload.element].forEach((e=>{e.classList.toggle("hide",h)}));const u=this.managers.appMessagesManager.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach((e=>{e.classList.toggle("hide",!u)})),this.setCaption(e);const p=o._openMedia.call(this,c,e.date,l,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,p}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||o.Z.has(e.mime_type)}}class Bm extends As.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 Nm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};class Um extends Fm{constructor(e){super(new Bm({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=()=>Nm(this,void 0,void 0,(function*(){u.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:_m.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 Nm(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 Om=i(5880),Hm=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{l(s.next(e))}catch(e){a(e)}}function r(e){try{l(s.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}l((s=s.apply(e,t||[])).next())}))};const zm=e=>{Array.from(document.querySelectorAll('avatar-element[data-peer-id="'+e+'"]')).forEach((e=>{e.update()}))};function Gm(e,t,i,n,a,o){return Hm(this,void 0,void 0,(function*(){let r=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!r)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!==r.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,r)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new Rm).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,o?i(o):void 0)}}if(r){!(0,Om.Z)(n)&&n&&(r=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new Um(t).openMedia(r.id,l(),void 0,a?e(a):void 0,o?e(o):void 0)}}))}s.Z.addEventListener("avatar_update",zm),s.Z.addEventListener("peer_title_edit",(e=>Hm(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e))||zm(e)}))));const Vm=new Map,Km=new Set;class Wm extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}disconnectedCallback(){const e=Vm.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||Vm.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>Hm(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield Gm(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){const t=this.peerId;this.updateOptions(e);const i=this.peerId;if(t!==i){if(this.peerId=i,this.dataset.peerId=""+i,t){const e=Vm.get(t);e&&(e.delete(this),e.size||Vm.delete(t))}return this.update()}}r(e=!1){const t=Hs(this,this.peerId,this.isDialog,this.peerTitle,e,this.isBig);return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!Km.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=Vm.get(this.peerId);return e||(e=new Set,Vm.set(this.peerId,e)),e.add(this),this.lazyLoadQueue.push({div:this,load:()=>(Km.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}Km.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=Vm.get(this.peerId);if(t){t.delete(this);const e=Array.from(t);Vm.delete(this.peerId);for(let t=0,i=e.length;t$m(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.selectedId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.onPinClick=()=>{this.managers.appMessagesManager.toggleDialogPin(this.selectedId,this.filterId).catch((e=>$m(this,void 0,void 0,(function*(){if("PINNED_DIALOGS_TOO_MUCH"===e.type)if(this.filterId>=1)Li({langPackKey:"PinFolderLimitReached"});else{const e=yield this.managers.apiManager.getConfig();new qi("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{Hr.createTab(pr).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[(0,v.ag)("Chats",[e.pinned_dialogs_count_max])]}).show()}}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute(this.selectedId,!1)},this.onMuteClick=()=>{new jd(this.selectedId)},this.onUnreadClick=()=>$m(this,void 0,void 0,(function*(){const e=this.selectedId,t=yield this.managers.appMessagesManager.getDialogOnly(e);t&&(t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message),this.managers.appMessagesManager.markDialogUnread(e,!0)):this.managers.appMessagesManager.markDialogUnread(e))})),this.onDeleteClick=()=>{new ws(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,l.Z)(e.target,dg)}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.filterId=gg.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=yield this.managers.appMessagesManager.getDialogOnly(this.selectedId),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)}))))),this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,v.ag)(yield this.managers.appPeersManager.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),xi(e,this.element),Ii.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>$m(this,void 0,void 0,(function*(){return!(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.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.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.selectedId!==s.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>$m(this,void 0,void 0,(function*(){return this.selectedId!==s.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==s.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==s.Z.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=Ei(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var qm,Qm=i(9174);class Ym{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{Promise.all([Ar.Z.get("dc"),s.Z.managers.rootScope.getConnectionStatus()]).then((([e,t])=>{e||(e=_r.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const i=t["NET-"+e],s=i&&i.status===Qm.Q.Connected;this.connecting&&s&&this.managers.apiUpdatesManager.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=i&&i.status===Qm.Q.TimedOut,this.connecting=!s,this.retryAt=i&&i.retryAt,R.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,g.Z)(this.statusEl,(0,v.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(qu.Z.deactivatedReason)return;const e=Ym.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.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");R.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{Re(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,R.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,he.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,M.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new Ue({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),s.Z.addEventListener("connection_status_change",(e=>{console.log(e),this.setConnectionStatus()})),s.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,R.ZP&&this.log("updating",this.updating),this.setState())})),s.Z.addEventListener("state_synchronized",(e=>{R.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,R.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,Ym.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,v.ag)(e)),(0,n.fc)(i,(e=>{(0,a.Z)(e),t()})),i}}function Jm(e,t,i,s){return e>=s?t+i:-i/2*(Math.cos(Math.PI*e/s)-1)+t}function Xm(e,t,i,s,n,a,o,r){const l=e.canvas.dpr;if(l&&(t*=l,i*=l,s*=l,n*=l),"number"==typeof a)l&&(a*=l),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]?l?a[t]*l: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()}Ym.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(qm||(qm={}));const eg=window.devicePixelRatio,tg=20*eg,ig=2.5*eg,sg=2*eg,ng=1*eg;var ag=i(3385),og=i(2554);class rg{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,Me.Z)(this.lightSource,0,1),e=(0,Me.Z)(this.lightSource-this.lightSpread,0,1),t=(0,Me.Z)(this.lightSource+this.lightSpread,0,1);const a=tp.getProperty("background-color-true"),o=tp.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 lg{constructor(){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 rg,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=54,this.marginVertical=9,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=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(),s.Z.settings.animationsEnabled||this.remove())}remove(){this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.onRemove&&(this.onRemove(),this.onRemove=void 0),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0))}updateCanvasSize(e=this.getRectFrom.getBoundingClientRect()){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:n,availableLength:a}=this;if(!i)return;if(!s.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let l=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){l=!1;continue}const s=Jm(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${s})`,t.fill(),s<1&&(l=!1)}t.globalCompositeOperation="source-over",l&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,n=this.createPattern();t.settings({canvas:e,fillStyle:n});const a=()=>this.tempId===i;this.renderFrame(),(0,ht.jt)((()=>!!a()&&(s.Z.settings.animationsEnabled&&this.renderFrame(),a()))),s.Z.addEventListener("theme_change",this.onThemeChange),d.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,s.Z.removeEventListener("theme_change",this.onThemeChange),d.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=tp.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=(this.avatarSize+2*this.marginVertical)*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=hl((()=>e[t]===s));return{deferred:s,middleware:n}}class ug extends za{constructor(e,t,i,s){super({getIndex:t=>e.dialogsStorage.getDialogIndex(t.id,this.indexKey),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;Ln(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const i=t?[]:void 0,{dom:s}=mg.addListDialog({peerId:e.id,loadPromises:i,isBatch:t});return e.dom=s,(null==i?void 0:i.length)&&(e.loadPromises=i,Promise.all(i).finally((()=>{delete e.loadPromises}))),e},updateElementWith:Be.TR}),this.managers=e,this.list=t,this.indexKey=i,this.onListLengthChange=s}clear(){this.list.textContent="",super.clear()}}class pg{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=(0,he.kg)("DIALOGS",he.v9.Log|he.v9.Error|he.v9.Warn|he.v9.Debug),this.placeholders={},this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>(this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()),this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==le.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 Br({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 Va({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=as.height/60|0;ki(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=>cg(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=>cg(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isContact(e))&&!(yield this.managers.appMessagesManager.getDialogOnly(e))})),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&(0,Be.TR)((()=>{const e=performance.now(),t=this.scroll.scrollTop,i=this.chatList.firstElementChild,s=this.scroll.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)})),this.setOffsets(),this.scroll.scrollTop=d.offsetTop-u,this.log("slice time",performance.now()-e)}))}),200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>(this.scroll.loadedAll[e]&&this.loadContacts&&this.loadContacts(),this.log("onChatsScroll",e),this.loadDialogs(e));const e=this.managers=(0,og.Z)();this.contextMenu=new jm(e),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,Ki.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),gi.Z&&$a({element:this.folders.container,onSwipe:e=>{const t=n.prevId();n(e>0?t+1:t-1)}}),this.allChatsIntlElement=new v.ZP.IntlElement({key:"FilterAllChatsShort"}),s.Z.addEventListener("premium_toggle",(e=>cg(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||n((0,Cn.Z)(this.filtersRendered[le.J$].menu),!1)})))),s.Z.addEventListener("state_cleared",(()=>{const e=le.DZ.has(this.filterId);Gi.Z.getState().then((t=>cg(this,void 0,void 0,(function*(){this.loadedDialogsAtLeastOnce=!1,e&&(this.sortedList.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(le.J$,le.J$),this.addFilter({id:le.J$,title:"",localId:le.J$});const i=new m.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const n=this.selectTab=(0,ue.X)(this.folders.menu,this.folders.container,((e,t)=>cg(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||le.J$,!le.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const s=this.filterId;if(Je.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{n(0),this.filtersNavigationItem=void 0}},C.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(C.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),s===e)return;this.sortedLists[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==s?a:void 0}))),(()=>{for(const e in this.sortedLists)if(+e!==this.filterId){this.sortedLists[e].clear();const t=this.placeholders[e];t&&t.remove()}}),void 0,i);Gi.Z.getState().then((e=>(vt.Z.setPlaybackParams(e.playbackParams),vt.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),d.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new Ym(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{hi.Z.loadLottieWorkers()}),200),A.Z.MANAGERS=s.Z.managers=e,u.Z.construct(e),Hr.construct(e),nn.construct(e),Fu.construct(e),em.construct(e),_m.construct(e),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId]}get chatList(){return this.sortedList.list}setFilterId(e,t){this.filterId=e,this.indexKey=(0,ag.Z)(le.DZ.has(e)?e:t)}setFilterIdAndChangeTab(e){return cg(this,void 0,void 0,(function*(){return this.filterId=e,this.indexKey=yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.onTabChange()}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),Re(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove(i)},t&&!s?2:0)}initListeners(){s.Z.addEventListener("user_update",(e=>cg(this,void 0,void 0,(function*(){var t;const i=e.toPeerId(),n=this.getDialogDom(i);if(n&&i!==s.Z.myId&&!(yield this.managers.appUsersManager.isBot(e))){const i="userStatusOnline"===(null===(t=(yield this.managers.appUsersManager.getUser(e)).status)||void 0===t?void 0:t._);this.setOnlineStatus(n.avatarEl,i)}})))),s.Z.addEventListener("chat_update",(e=>cg(this,void 0,void 0,(function*(){const t=e.toPeerId(!0),i=yield this.managers.appMessagesManager.getDialogOnly(t);i&&this.processDialogForCallStatus(i)})))),s.Z.addEventListener("folder_unread",(e=>{this.setFilterUnreadCount(e.id)})),s.Z.addEventListener("contacts_update",(e=>{this.processContact&&this.processContact(e.toPeerId())})),s.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&(this.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e),this.setFiltersUnreadCount())})),s.Z.addEventListener("dialogs_multiupdate",(e=>{for(const[t,i]of e)this.updateDialog(i),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(i)})),s.Z.addEventListener("dialog_drop",(({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)})),s.Z.addEventListener("dialog_unread",(({dialog:e})=>{e&&(this.setUnreadMessagesN({dialog:e}),this.validateDialogForFilter(e))})),s.Z.addEventListener("dialog_notify_settings",(e=>{this.validateDialogForFilter(e),this.setUnreadMessagesN({dialog:e})})),s.Z.addEventListener("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{t?this.sortedList.delete(i):this.updateDialog(e),this.processContact&&this.processContact(i)})),_m.addEventListener("peer_changed",(e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((e=>{this.setDialogActive(e,!0)}))})),s.Z.addEventListener("filter_update",(e=>cg(this,void 0,void 0,(function*(){if(le.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),s.Z.addEventListener("filter_order",(e=>cg(this,void 0,void 0,(function*(){e=e.slice(),(0,T.Z)(e,le.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>cg(this,void 0,void 0,(function*(){return{indexKey:yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),filter:yield this.managers.filtersStorage.getFilter(e)}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.sortedLists[e].indexKey=n,Ln(o.menu,t,a.localId),Ln(o.container,this.folders.container,a.localId)})),this.indexKey=yield this.managers.dialogsStorage.getDialogIndexKeyByFilterId(this.filterId)})))),s.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>cg(this,void 0,void 0,(function*(){const i=yield this.managers.appMessagesManager.getDialogOnly(e);i&&(t.length?this.setTyping(i):this.unsetTyping(i))}))))}setDialogActive(e,t){const i=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==i?void 0:i.callIcon)&&i.callIcon.setActive(t)}onStateLoaded(e){return cg(this,void 0,void 0,(function*(){const t=e.filtersArr,i=t.length>le.DZ.size,s=e=>{for(const t of e)this.addFilter(t)};let n;i?s(t):n=this.managers.filtersStorage.getDialogFilters().then(s);const a=this.onChatsScroll();yield a,this.loadDialogsRenderPromise=void 0,n&&(yield n),this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),i&&this.showFiltersPromise&&(yield this.showFiltersPromise),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield a).renderPromise.catch(ft.Z),this.managers.appMessagesManager.fillConversations()}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,hs.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessageN({dialog:e,dom:t,setUnread:!0}),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;return cg(this,void 0,void 0,(function*(){if(e===le.J$)return;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),i.innerText=n?""+n:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}validateListForFilter(){return cg(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>cg(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(e.id)}))))}))}validateDialogForFilter(e){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e.peerId))}testDialogForFilter(e){return!(!e||(le.DZ.has(this.filterId)?this.filterId!==e.folder_id:void 0===(0,hs.Z)(e,this.indexKey)))}generateScrollable(e,t){const i=t.id,s=new m.ZP(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+i,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new ug(this.managers,e,(0,ag.Z)(t.localId),this.onListLengthChange);return this.scrollables[i]=s,this.sortedLists[i]=n,s}addFilter(e){if(e.id===le.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return Ln(i.menu,t,e.localId),void Ln(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===le.J$?a.append(this.allChatsIntlElement.element):(0,c.Z)(a,(0,Zt.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,we.Z)(s),s.append(n),s.dataset.filterId=""+e.id,Ln(s,t,e.localId);const l=this.createChatList(),d=this.generateScrollable(l,e);d.container.classList.add("tabs-tab","chatlist-parts");const h=document.createElement("div");h.classList.add("chatlist-top");const u=document.createElement("div");u.classList.add("chatlist-bottom"),h.append(l),d.container.append(h,u);const p=d.container;Ln(d.container,this.folders.container,e.localId),this.setListClickListener(l,null,!0),this.filtersRendered[e.id]={menu:s,container:p,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(){return this.showFiltersPromise||(this.showFiltersPromise=new Promise((e=>{window.setTimeout((()=>{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,e()}),0)}))),this.showFiltersPromise}loadDialogs(e){if(this.log.warn("load",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scroll.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});const t=(0,Oe.Z)(),i=new Promise(((s,n)=>cg(this,void 0,void 0,(function*(){const{chatList:a,filterId:o,indexKey:r}=this;let l=as.height/72*1.25|0,c=0;const{index:d}=this.getOffsetIndex(e);if(d)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(o,!0),t=e.findIndex((e=>(0,hs.Z)(e,r)<=d)),i=Math.max(0,t-l);l=t-i,c=(0,hs.Z)(e[i],r)+1}else c=d;let h=this.placeholders[o];try{const s=this.managers.acknowledged.appMessagesManager.getConversations("",c,l,o,!0);if(!(a.childElementCount||h||this.loadedDialogsAtLeastOnce&&(yield s).cached)){h=this.placeholders[o]=new lg;const e=o===le.Zi?this.chatsContainer:this.folders.container;h.attach({container:a.parentElement,getRectFrom:e,onRemove:()=>{delete this.placeholders[o]},blockScrollable:this.scroll}),t.resolve(!1)}const d=yield s,u=yield d.result;if(this.loadDialogsRenderPromise!==i)return n(),void t.reject();if(t.resolve(d.cached),"bottom"===e?u.isEnd&&(this.scroll.loadedAll[e]=!0):u.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,u.dialogs.length){const s="top"===e?u.dialogs.slice().reverse():u.dialogs,a=[],o=[],r=e=>{o.push(e)};if(s.forEach((e=>{const t=this.sortedList.add(e.peerId,!0,r,!1);t.loadPromises&&a.push(...t.loadPromises)})),a.push((0,Be.AD)()),yield Promise.all(a).finally(),this.loadDialogsRenderPromise!==i)return n(),void t.reject();o.forEach((e=>e()))}else this.onListLengthChange();const p=u.dialogs["top"===e?0:u.dialogs.length-1];p&&(this.offsets[e]=(0,hs.Z)(p,r)),this.log.debug("getDialogs "+l+" dialogs by offset:",c,u,a.childElementCount),setTimeout((()=>{this.scroll.onScroll()}),0)}catch(e){this.log.error(e)}h&&h.detach(a.childElementCount),s()})))).finally((()=>{this.loadDialogsRenderPromise===i&&(this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0)}));return this.loadDialogsRenderPromise=i,this.loadDialogsPromise=t.then((e=>({cached:e,renderPromise:i})))}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,v.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,v.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===le.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.scroll.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let a,o;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:o="folder"}),i=a.container;const e=document.createElement("div"),t=128;wo({div:e,emoji:"📂",width:t,height:t}),i.prepend(e);const s=(0,M.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,n.fc)(s,(()=>cg(this,void 0,void 0,(function*(){Hr.createTab(hr).open(yield this.managers.filtersStorage.getFilter(this.filterId))})))),i.append(s)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:o="dialogs"}),i=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new v.ZP.IntlElement({element:a.subtitle}),Promise.all([this.updateContactsLength(!1),Ze(e,"assets/img/EmptyChats.svg"),(0,Be.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=o}updateContactsLength(e){return this.updateContactsLengthPromise?this.updateContactsLengthPromise: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,v.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.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){return cg(this,void 0,void 0,(function*(){const e=this.chatList,t=yield this.getDialogFromElement(e.firstElementChild),i=yield this.getDialogFromElement(e.lastElementChild),s=this.indexKey;this.offsets.top=(0,hs.Z)(t,s),this.offsets.bottom=(0,hs.Z)(i,s)}))}getDialogFromElement(e){return this.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,i=!1,s=!1,n=!1){let o;const r=(n?_m.setInnerPeer:_m.setPeer).bind(_m);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(e=>{if(0!==e.button)return;this.log("dialogs click list");const i=e.target,n=(0,l.Z)(i,dg);if(!n)return;const c=n.dataset.peerId.toPeerId();if(e.ctrlKey||e.metaKey)return window.open(n.href||"#"+c,"_blank"),void(0,a.Z)(e);if(s){const e=o===n;o&&!e&&o.classList.remove("active"),n&&(n.classList.add("active"),o=n,this.lastActiveElements.add(n))}if(n){t&&t();const e=+n.dataset.mid||void 0;r({peerId:c,lastMsgId:e})}else r()}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,a.Z)(e)}),{capture:!0}),R.ZP&&e.addEventListener("dblclick",(e=>{const t=(0,l.Z)(e.target,dg);if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",this.managers.appMessagesManager.getDialogByPeerId(e))}})),i&&Fi(e,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.dialog,e.lastMessage,e.dom,e.highlightWord,e.isBatch,e.setUnread).catch(ft.Z)}setLastMessage(e,t,i,n,a=!1,o=!1){var r;return cg(this,void 0,void 0,(function*(){if(!i&&!(i=this.getDialogDom(e.peerId)))return;const{deferred:l,middleware:c}=hg(i,"setLastMessagePromise");let d;if(!t&&("draftMessage"===(null===(r=e.draft)||void 0===r?void 0:r._)&&(d=e.draft),!(t=e.topMessage)||t.mid!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);t=yield c(i)}if(o&&this.setUnreadMessagesN({dialog:e,dom:i,isBatch:a,setLastMessagePromise:l}),!t)return i.lastMessageSpan.textContent="",i.lastTimeSpan.textContent="",delete i.listEl.dataset.mid,void l.resolve();const h=e.peerId,u=t&&wa(t);{let e;const a=[];if(t&&!d&&!u){const i=(0,Se.Z)(t),s=new Set(["video","gif","round"]);if(i&&("photo"===i._||s.has(i.type))){const n=Le(i,20,20);if("photoSizeEmpty"!==n._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===i.type&&e.classList.add("is-round"),a.push(dt({photo:i,message:t,container:e,withoutPreloader:!0,size:n}).then((()=>e))),s.has(i.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(d){const e=document.createElement("b");e.classList.add("danger"),e.append((0,v.ag)("Draft"),": "),a.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("b");if(t.fromId===s.Z.myId)e.append((0,v.ag)("FromYou")),a.unshift(e);else{const i=c(js({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),ft.Z);a.unshift(i)}e.append(": ")}const o=!!e&&!!(null==t?void 0:t.message);let r;if(r=n&&t.message?yield c(Aa(t,void 0,void 0,!1,n,o)):d?yield c(Aa(d)):t?yield c(Aa(t,void 0,void 0,!1,void 0,o)):document.createDocumentFragment(),a.length){const e=yield c(Promise.all(a));r.prepend(...e)}(0,g.Z)(i.lastMessageSpan,r)}if(t||d){const e=d?Math.max(d.date,t.date||0):t.date;(0,g.Z)(i.lastTimeSpan,H(new Date(1e3*e)))}else i.lastTimeSpan.textContent="";null===o||o||(i.listEl.dataset.mid=""+t.mid),l.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e.dialog,e.dom,e.isBatch,e.setLastMessagePromise).catch((()=>{}))}setUnreadMessages(e,t=this.getDialogDom(e.peerId),i=!1,n){var a;return cg(this,void 0,void 0,(function*(){if(!t)return;const{deferred:o,middleware:r}=hg(t,"setUnreadMessagePromise"),l=yield r(this.managers.appNotificationsManager.isPeerLocalMuted(e.peerId,!0)),c=t.listEl.classList.contains("is-muted");let d;if("draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)){const t=yield r(this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.top_message));t&&t.pFlags.out&&t.peerId!==s.Z.myId&&(d=t)}const h=yield r(this.managers.filtersStorage.getFilter(this.filterId));let u;u=h?-1!==h.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const p=yield r(this.managers.appMessagesManager.isDialogUnread(e)),m=u||p;if(n)try{yield r(n)}catch(e){}const g=i?0:200;l!==c&&Re(t.listEl,"is-muted",l,g),function(e,t,i){let s;if((null==t?void 0:t.pFlags.out)&&(s=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()}(t.statusSpan,d);const v=(0,Ne.Z)(t.unreadBadge);m&&!v&&t.subtitleEl.append(t.unreadBadge);const f=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),y=t.mentionsBadge&&(0,Ne.Z)(t.mentionsBadge);if(f&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling))),Re(t.unreadBadge,"is-visible",m,g,m?void 0:()=>{t.unreadBadge.remove()},v?0:2),t.mentionsBadge&&Re(t.mentionsBadge,"is-visible",f,g,f?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},y?0:2),!m)return void o.resolve();u?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let b=!0,w=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",w=!0):p?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",b=!1),t.unreadBadge.classList.toggle("unread",b),t.unreadBadge.classList.toggle("mention",w),o.resolve()}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){return cg(this,void 0,void 0,(function*(){if("object"!=typeof e){const t=yield this.managers.appMessagesManager.getDialogOnly(e);if(!t){const t=e||le.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return t}return 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=tg;const i=t.getContext("2d"),s=(tg-(3*sg+2*ig))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=Jm((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,tg,tg),i.fillStyle=e&&!d.Z.isMobile?tp.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*=eg,Xm(i,s+e*sg+e*ig,(tg-n)/2,sg,n,ng,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,ht.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&Re(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){e.autonomous=!1;const t=this.addDialogNew(e);if(t){const i=this.getDialog(e.peerId).then((i=>{const{peerId:n}=i,a=[];return n.isUser()||a.push(this.processDialogForCallStatus(i,t.dom)),n!==s.Z.myId&&n.isUser()&&a.push(this.managers.appUsersManager.getUser(n).then((e=>{var i;"userStatusOnline"===(null===(i=e.status)||void 0===i?void 0:i._)&&this.setOnlineStatus(t.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:i,dom:t.dom,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));e.loadPromises&&e.loadPromises.push(i)}return t}processDialogForCallStatus(e,t){return cg(this,void 0,void 0,(function*(){if(!Wd.Z)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const i=yield this.managers.appChatsManager.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),Ft(i)),{peerId:t}));return this.setLastMessage({_:"dialog",peerId:t},i,n.dom,s),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){return this.addDialog(e.peerId,e.container,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises,e.fromName,e.noIcons)}addDialog(e,t,i=!0,s=!1,n=!0,a=!0,o=54,r=!!t,l,c,d,h){var u;const p=new Wm;p.classList.add("dialog-avatar","avatar-"+o),p.updateWithOptions({loadPromises:c,lazyLoadQueue:l,isDialog:!!n,peerId:e,peerTitle:d});const m=document.createElement("div");m.classList.add("user-caption");const g=document.createElement("span");g.classList.add("user-title");const v=new Ot,f=v.update({peerId:e,fromName:d,dialog:n,onlyFirstName:s,plainText:!1,withIcons:!h});c&&c.push(f),g.append(v.element),g.classList.add("tgico");const y=document.createElement("span");y.classList.add("user-last-message"),y.setAttribute("dir","auto");const b=document.createElement(dg);b.classList.add("chatlist-chat"),r||(b.href="#"+e),i&&(0,we.Z)(b),b.append(p,m),b.dataset.peerId=""+e;const w=document.createElement("span");w.classList.add("message-status","sending-status");const S=document.createElement("span");S.classList.add("message-time");const C=document.createElement("div");C.className="dialog-subtitle-badge badge badge-24";const L=document.createElement("p");L.classList.add("dialog-title");const I=document.createElement("span");I.classList.add("dialog-title-details"),I.append(w,S),L.append(g,I);const M=document.createElement("p");M.classList.add("dialog-subtitle"),M.append(y),m.append(L,M);const E={avatarEl:p,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:w,lastTimeSpan:S,unreadBadge:C,lastMessageSpan:y,containerEl:b,listEl:b,subtitleEl:M};return t&&t[a?"append":"prepend"](b),r||(b.dialogDom=E,(null===(u=_m.chat)||void 0===u?void 0:u.peerId)===e&&this.setDialogActive(b,!0)),{dom:E}}setTyping(e){return cg(this,void 0,void 0,(function*(){const t=this.getDialogDom(e.peerId);if(!t)return;const i=t.lastMessageSpan.querySelector(".peer-typing-container"),s=yield _m.getPeerTyping(e.peerId,i);!i&&s&&((0,g.Z)(t.lastMessageSpan,s),t.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessageN({dialog:e,lastMessage:null,dom:t,setUnread:null}))}}const mg=new pg;R.GO.appDialogsManager=mg;const gg=mg},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}])}}]); +//# sourceMappingURL=911.4ab2cba0db01b5782509.chunk.js.map \ No newline at end of file diff --git a/public/911.4ab2cba0db01b5782509.chunk.js.map b/public/911.4ab2cba0db01b5782509.chunk.js.map new file mode 100644 index 000000000..c3319de44 --- /dev/null +++ b/public/911.4ab2cba0db01b5782509.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"911.4ab2cba0db01b5782509.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/codeInputField.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/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderImageWithFadeIn.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/preloader.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/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/components/generateFakeIcon.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/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/popups/pickUser.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/popups/deleteDialog.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.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/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.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/lib/richTextProcessor/matchEmail.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/privacyAndSecurity.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.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/editProfile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.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/helpers/number/formatNumber.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.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/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/middlewarePromise.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/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/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/helpers/dom/getViewportSlice.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/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/helpers/dom/getRichValueWithCaret.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/components/inputFieldAnimated.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/helpers/dom/setCaretAt.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.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/getStreamCached.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.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/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/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/groupCallState.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/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.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/helpers/dom/getSelectedNodes.ts","webpack://tweb/./src/helpers/generatePathData.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/helpers/dom/customProperties.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/helpers/dom/controlsHover.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/lib/calls/callState.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/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.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/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/components/connectionStatus.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/lib/appManagers/appDialogsManager.ts","webpack://tweb/./public/recorder.min.js"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport ripple from './ripple';\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true,\r\n onlyMobile: true,\r\n icon: string,\r\n rippleSquare: true,\r\n text: LangPackKey,\r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, {InputFieldOptions} from './inputField';\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n\r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n\r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n\r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\nimport PasswordInputField from '../passwordInputField';\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\r\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\r\n // return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n // console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from '../inputField';\r\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n\r\n frame = 0;\r\n }\r\n // animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n // console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n\r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n // animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n // console.log('enterFrame', currentFrame, needFrame);\r\n // let currentFrame = Math.round(e.currentTime);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n // animation.curFrame = 0;\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n // console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport InputField, {InputFieldOptions} from './inputField';\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport rootScope from '../lib/rootScope';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement,\r\n callback: (id: number) => Promise = () => Promise.resolve(),\r\n onEnd: (id: number) => void = null,\r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n // return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n\r\n const r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n // let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n\r\n // console.log('ripple drawRipple');\r\n\r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n // console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n // handler = () => animationEndPromise.then((duration) => {\r\n // console.log('ripple animation was:', duration);\r\n\r\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n // return;\r\n const elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n\r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n const delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n // });\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n // console.log('ripple after promise', Date.now() - startTime);\r\n // console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\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);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n\r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n // r.classList.add('active');\r\n // handler();\r\n });\r\n // });\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\r\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem ||\r\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n const touchEnd = () => {\r\n handler && handler();\r\n };\r\n\r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n // console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n\r\n // console.log('touchstart', e);\r\n touchStartFired = true;\r\n\r\n const {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n\r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n\r\n const {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string | DocumentFragment) {\r\n const span = document.createElement('span');\r\n if(typeof(html) === 'string') span.innerHTML = html;\r\n else span.append(html);\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element\r\n * @param callback\r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from '../lib/appManagers/appDialogsManager';\r\nimport Scrollable from './scrollable';\r\nimport InputSearch from './inputSearch';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(\r\n public name: LangPackKey | boolean,\r\n public type: string,\r\n private clearable = true,\r\n className?: string,\r\n clickable = true,\r\n public autonomous = true,\r\n public onFound?: () => void,\r\n public noIcons?: boolean\r\n ) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n\r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n\r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n public container: HTMLElement,\r\n public searchInput: InputSearch,\r\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\r\n public onSearch?: (count: number) => void,\r\n public noIcons?: boolean\r\n ) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(const i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n\r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n\r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(const i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n\r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n\r\n const query = this.query;\r\n\r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n\r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n\r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\r\n peerId: this.peerId,\r\n query,\r\n inputFilter: {_: 'inputMessagesFilterEmpty'},\r\n maxId,\r\n limit: 20,\r\n threadId: this.threadId\r\n }).then((res) => {\r\n this.searchPromise = null;\r\n\r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n\r\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n\r\n const {count, history} = res;\r\n\r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n\r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId,\r\n container: this.scrollable/* searchGroup.list */,\r\n avatarSize: 54,\r\n meAsSaved: false,\r\n message,\r\n query,\r\n noIcons: this.noIcons\r\n });\r\n } catch(err) {\r\n console.error('[appSearch] render search result', err);\r\n }\r\n });\r\n\r\n searchGroup.toggle();\r\n\r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n\r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n\r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n\r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch((err) => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { getRichValue } from \"../helpers/dom\";\r\nimport {LangPackKey} from '../lib/langPack';\r\nimport InputField from './inputField';\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n\r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n const value = this.value;\r\n\r\n // this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from './button';\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined,\r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport ButtonIcon from './buttonIcon';\r\nimport Scrollable from './scrollable';\r\nimport SidebarSlider from './slider';\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): T;\r\n}\r\n\r\nexport interface SliderSuperTabEventableConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n public managers: AppManagers;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n if(this.slider) {\r\n this.slider.addTab(this);\r\n }\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n this.scrollable.destroy();\r\n this.listenerSetter?.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {horizontalMenu} from './horizontalMenu';\r\nimport {TransitionSlider} from './transition';\r\nimport appNavigationController, {NavigationItem} from './appNavigationController';\r\nimport SliderSuperTab, {SliderSuperTabConstructable, SliderTab} from './sliderTab';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type'];\r\n protected managers: AppManagers;\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n // console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n\r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n // if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType,\r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n // }\r\n\r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n // appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME + 30);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n\r\n public createTab(ctor: SliderSuperTabConstructable, doNotAppend?: boolean) {\r\n const tab = new ctor(doNotAppend ? undefined : this, true);\r\n tab.managers = this.managers;\r\n return tab;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport type {InputFile} from '../layer';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport PopupElement from './popups';\r\nimport PopupAvatar from './popups/avatar';\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n attachClickEvent(this.container, () => {\r\n PopupElement.createPopup(PopupAvatar).open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from './button';\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport I18n, {i18n} from '../lib/langPack';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true,\r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\r\n joiner + date.getFullYear() +\r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp('20[0-9]{1,2}');\r\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\r\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if('today'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if('yesterday'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if(k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if(k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n\r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n\r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n\r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, {SettingSection} from '..';\r\nimport {InputFile} from '../../../layer';\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport InputField from '../../inputField';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport AvatarEdit from '../../avatarEdit';\r\nimport I18n from '../../../lib/langPack';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport getUserStatusString from '../../wrappers/getUserStatusString';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\n\r\ninterface OpenStreetMapInterface {\r\n place_id?: number;\r\n license?: string;\r\n osm_type?: string;\r\n osm_id?: number;\r\n lat?: string;\r\n lon?: string;\r\n display_name: string;\r\n address?: object;\r\n boundingbox?: object;\r\n}\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private isGeoChat: boolean = false;\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n private list: HTMLUListElement;\r\n private groupLocationInputField: InputField;\r\n private userLocationCoords: {lat: number, long: number};\r\n private userLocationAddress: string;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.groupNameInputField = new InputField({\r\n label: 'CreateGroup.NameHolder',\r\n maxLength: 128\r\n });\r\n\r\n this.groupLocationInputField = new InputField({\r\n label: 'ChatLocation',\r\n name: 'location',\r\n canBeEdited: false\r\n });\r\n\r\n inputWrapper.append(\r\n this.groupNameInputField.container,\r\n this.groupLocationInputField.container\r\n );\r\n\r\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\r\n const value = this.groupNameInputField.value;\r\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\r\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\r\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n attachClickEvent(this.nextBtn, () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n let promise: Promise;\r\n if(this.isGeoChat) {\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n promise = this.managers.appChatsManager.createChannel({\r\n title,\r\n about: '',\r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords\r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length) {\r\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n\r\n return chatId;\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n return chatId;\r\n });\r\n }\r\n\r\n if(!promise) {\r\n return;\r\n }\r\n\r\n promise.then((chatId) => {\r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n\r\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const chatsSection = new SettingSection({\r\n name: 'Members',\r\n nameArgs: [this.peerIds.length]\r\n });\r\n\r\n const list = this.list = appDialogsManager.createChatList({\r\n new: true\r\n });\r\n\r\n chatsSection.content.append(list);\r\n\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(section.container, chatsSection.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.groupLocationInputField.container.classList.add('hide');\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[], isGeoChat: boolean = false) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n const result = super.open();\r\n result.then(() => {\r\n if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n return Promise.all(this.peerIds.map(async(userId) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: userId,\r\n container: this.list,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\r\n }));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startLocating() {\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.userLocationCoords = {\r\n lat: location.coords.latitude,\r\n long: location.coords.longitude\r\n };\r\n\r\n let uri = 'https://nominatim.openstreetmap.org/reverse';\r\n uri += '?lat='+location.coords.latitude;\r\n uri += '&lon='+location.coords.longitude;\r\n uri += '&format=json';\r\n uri += '&addressdetails=1';\r\n uri += '&accept-language=en';\r\n fetch(uri)\r\n .then((response) => response.json())\r\n .then((response: OpenStreetMapInterface) => {\r\n this.userLocationAddress = response.display_name;\r\n this.groupLocationInputField.setValueSilently(response.display_name);\r\n });\r\n }, (error) => {\r\n if(error instanceof GeolocationPositionError) {\r\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\r\n } else {\r\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry};\r\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: OnVisibilityChangeItem[] = [];\r\n\r\n entries.forEach((entry) => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry};\r\n\r\n // ! order will be incorrect so can't use it\r\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\r\n changed.push(change);\r\n\r\n // onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach((item) => {\r\n onVisibilityChange(item);\r\n });\r\n }, options);\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n // window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n // this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n // });\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\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\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};\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 if(!this.intersectorTimeout) {\n this.intersectorTimeout = window.setTimeout(() => {\n this.intersectorTimeout = 0;\n this.processQueue();\n }, 0);\n }\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 unobserve(el: HTMLElement) {\n findAndSpliceAll(this.queue, (i) => i.div === el);\n\n this.intersector.unobserve(el);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\r\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\r\nimport findAndSplice from '../helpers/array/findAndSplice';\r\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(parallelLimit?: number) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n // this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return findAndSplice(this.queue, item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\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 bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\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: undefined\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","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","/*\r\nThis file is part of Telegram Desktop,\r\nthe official desktop application for the Telegram messaging service.\r\nFor license and copyright information please follow this link:\r\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\r\n*/\r\n\r\nimport accumulate from '../helpers/array/accumulate';\r\nimport clamp from '../helpers/number/clamp';\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n // else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === 'ww') &&\r\n (this.averageRatio > 1.4 * this.maxSizeRatio) &&\r\n (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === 'ww' || this.proportions === 'qq') {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n // console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n }\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n }\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0] /\r\n (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth -\r\n secondWidth -\r\n this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n }\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing) /\r\n (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight -\r\n thirdHeight -\r\n this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n }\r\n ];\r\n }\r\n\r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n }\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing) /\r\n (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n }\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n\r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing) /\r\n (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n }\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map((size) => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map((ratio) => {\r\n return averageRatio > 1.1 ?\r\n clamp(ratio, 1., kMaxRatio) :\r\n clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n const result = new Array(this.count);\r\n\r\n const attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n const heights: number[] = [];\r\n let offset = 0;\r\n for(const count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3) ||\r\n (second > ((this.averageRatio < 0.85) ? 4 : 3)) ||\r\n (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) +\r\n this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n\r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None |\r\n (row === 0 ? RectPart.Top : RectPart.None) |\r\n (row === rowCount - 1 ? RectPart.Bottom : RectPart.None) |\r\n (col === 0 ? RectPart.Left : RectPart.None) |\r\n (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1) ?\r\n (this.maxWidth - x) :\r\n Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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\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 && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n\n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\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 loader.addEventListener('load', () => {\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 && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', (err) => {\n console.error('Render image from url failed:', err, url, loader);\n callback();\n });\n }\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 renderImageFromUrl from './renderImageFromUrl';\n\nexport default function renderImageWithFadeIn(\n container: HTMLElement,\n image: HTMLImageElement,\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n image.classList.add('fade-in');\n }\n\n const promise = new Promise((resolve) => {\n /* if(photo._ === 'document') {\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\n return resolve();\n } */\n\n renderImageFromUrl(image, url, () => {\n sequentialDom.mutateElement(container, () => {\n aspecter.append(image);\n\n resolve();\n /* fastRaf(() => {\n resolve();\n }); */\n\n if(needFadeIn) {\n image.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n image.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\n\r\nconst SetTransition = (\r\n element: HTMLElement,\r\n className: string,\r\n forwards: boolean,\r\n duration: number,\r\n onTransitionEnd?: () => void,\r\n useRafs?: number,\r\n onTransitionStart?: () => void\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n // useRafs = undefined;\r\n // duration = 0;\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1, onTransitionStart);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n\r\n onTransitionEnd?.();\r\n };\r\n\r\n onTransitionStart?.();\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport SetTransition from './singleTransition';\r\nimport {fastRaf} from '../helpers/schedulers';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n\r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => any;\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'],\r\n streamable: ProgressivePreloader['streamable'],\r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n\r\n if(this.isUpload) {\r\n this.tryAgainOnFail = false;\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n\r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n\r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n\r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n // console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n\r\n this.promise = promise = null;\r\n };\r\n\r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n // console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n let useRafs = 0;\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n\r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n // return;\r\n\r\n this.detached = true;\r\n\r\n // return;\r\n\r\n if(this.preloader?.parentElement) {\r\n /* setTimeout(() => */// fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n // })/* , 5e3) */;\r\n }\r\n }\r\n\r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n\r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n\r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n // console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\r\nimport {fastRaf} from './schedulers';\r\nimport {ArgumentTypes} from '../types';\r\n\r\ntype HeavyQueue> = {\r\n items: ArgumentTypes[],\r\n process: (...args: any[]) => ReturnType,\r\n context: any,\r\n promise?: CancellablePromise[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]) as typeof promise;\r\n }\r\n\r\n const promise = queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk>(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([] as any);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: ReturnType[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: typeof results[0];\r\n // @ts-ignore\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n // setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n // setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!IS_CANVAS_FILTER_SUPPORTED) {\r\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(\r\n img: HTMLImageElement,\r\n radius: number,\r\n iterations: number,\r\n canvas: HTMLCanvasElement = document.createElement('canvas')\r\n) {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(IS_CANVAS_FILTER_SUPPORTED) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\r\nconst cache: Map = new Map();\r\nconst CACHE_SIZE = 150;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n throw 'no dataUri for blur: ' + dataUri;\r\n }\r\n\r\n if(cache.size > CACHE_SIZE) {\r\n cache.clear();\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.className = 'canvas-thumbnail';\r\n\r\n let cached = cache.get(dataUri);\r\n if(!cached) {\r\n const promise: CacheValue['promise'] = new Promise((resolve) => {\r\n // return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n // if(IS_CANVAS_FILTER_SUPPORTED) {\r\n // resolve(processBlurNext(img, radius, iterations));\r\n // } else {\r\n const promise = addHeavyTask({\r\n items: [[img, radius, iterations, canvas]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift');\r\n\r\n promise.then(() => {\r\n resolve();\r\n });\r\n // }\r\n };\r\n img.src = dataUri;\r\n });\r\n });\r\n\r\n cache.set(dataUri, cached = {\r\n canvas,\r\n promise\r\n });\r\n } else {\r\n canvas.width = cached.canvas.width;\r\n canvas.height = cached.canvas.height;\r\n cached.promise.then(() => {\r\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\r\n });\r\n }\r\n\r\n return {\r\n ...cached,\r\n canvas\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\n\nconst JPEG_HEADER = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\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 = bytes instanceof Uint8Array ? bytes : new Uint8Array(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 return bytesToDataURL(arr, mimeType);\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\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 {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(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\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 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 if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\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 {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 renderImageWithFadeIn from '../../helpers/dom/renderImageWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, 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';\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}: {\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?: () => boolean,\n size?: PhotoSize,\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}) {\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc) {\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return {\n loadPromises: {\n thumb: Promise.resolve(),\n full: Promise.resolve()\n },\n images: {\n thumb: null,\n full: null\n },\n preloader: null,\n aspecter: null\n };\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 const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n const image = new Image();\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n 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 thumbImage = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n image.classList.add('media-photo');\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 = isGif && !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 renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\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(() => {});\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\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return {\n loadPromises: {\n thumb: loadThumbPromise,\n full: loadPromise || Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: image\n },\n preloader,\n aspecter\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","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","/*\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","/*\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {FontFamily, FontSize, FontWeight} from '../config/font';\r\nimport getTextWidth from '../helpers/canvas/getTextWidth';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport clamp from '../helpers/number/clamp';\r\nimport {fastRaf} from '../helpers/schedulers';\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nconst fontSize = '16px';\r\nlet pendingTest = false;\r\n\r\nfunction setTestQueue() {\r\n if(pendingTest) {\r\n return;\r\n }\r\n\r\n pendingTest = true;\r\n fastRaf(() => {\r\n pendingTest = false;\r\n testQueueElements();\r\n });\r\n}\r\n\r\nfunction testQueueElements() {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n}\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n\r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nfunction getElementWidth(element: HTMLElement) {\r\n const type = element.dataset.sizeType;\r\n if(type) {\r\n const mediaSize = mediaSizes.active;\r\n // @ts-ignore\r\n const size: MediaSize = mediaSize[type];\r\n return size.width;\r\n }\r\n\r\n return element.getBoundingClientRect().width;\r\n}\r\n\r\nfunction testElement(element: HTMLElement) {\r\n // const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n // console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n // const perf = performance.now();\r\n font = `${element.dataset.fontWeight || FontWeight} ${FontSize} ${FontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n // console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n // const perf = performance.now();\r\n elementWidth = getElementWidth(element);\r\n // console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n // console.log('[MEE] testElement map set', element);\r\n }\r\n\r\n const newElementWidth = getElementWidth(element);\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n\r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n const smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/, '');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/, '');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = getElementWidth(element);\r\n // mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n // console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n connectedCallback() {\r\n // console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n if(this.dataset.sizeType) {\r\n testElement(this);\r\n } else {\r\n testQueue.add(this);\r\n setTestQueue();\r\n }\r\n // testElement(this);\r\n\r\n // console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n testQueue.delete(this);\r\n // console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define('middle-ellipsis-element', MiddleEllipsisElement);\r\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 {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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement,\r\n onStart: (position: GrabEvent) => void,\r\n onMove: (position: GrabEvent) => void,\r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachGrabListeners, {GrabEvent} from '../helpers/dom/attachGrabListeners';\r\nimport clamp from '../helpers/number/clamp';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n // onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n },\r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n // seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n // this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n\r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n\r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n // this.seek.value = '' + value;\r\n // this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n\r\n this.events = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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","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 {_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 {Chat, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\n\nexport default async function generateTitleIcons(peerId: PeerId) {\n const elements: Element[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified) {\n elements.push(generateVerifiedIcon());\n }\n\n if((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium) {\n elements.push(generatePremiumIcon());\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport {i18n} from '../lib/langPack';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\r\nimport limitSymbols from '../helpers/string/limitSymbols';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport getPeerTitle from './wrappers/getPeerTitle';\r\nimport generateTitleIcons from './generateTitleIcons';\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean,\r\n limitSymbols?: number,\r\n managers?: AppManagers,\r\n withIcons?: boolean\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach((element) => {\r\n const peerTitle = weakMap.get(element);\r\n // console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n private fromName: string;\r\n private plainText = false;\r\n private onlyFirstName = false;\r\n private dialog = false;\r\n private limitSymbols: number;\r\n private managers: AppManagers;\r\n private hasInner: boolean;\r\n private withIcons: boolean;\r\n\r\n constructor(options?: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n\r\n if(options) {\r\n this.update(options);\r\n }\r\n\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public setOptions(options?: PeerTitleOptions) {\r\n if(!options) {\r\n return;\r\n }\r\n\r\n for(const i in options) {\r\n // @ts-ignore\r\n const value = options[i];\r\n\r\n if(typeof(value) !== 'object') {\r\n // @ts-ignore\r\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\r\n }\r\n\r\n // @ts-ignore\r\n this[i] = value;\r\n }\r\n }\r\n\r\n public async update(options?: PeerTitleOptions) {\r\n this.setOptions(options);\r\n\r\n let fromName = this.fromName;\r\n if(fromName !== undefined) {\r\n if(this.limitSymbols !== undefined) {\r\n fromName = limitSymbols(fromName, this.limitSymbols, this.limitSymbols);\r\n }\r\n\r\n setInnerHTML(this.element, wrapEmojiText(fromName));\r\n return;\r\n }\r\n\r\n this.peerId ??= NULL_PEER_ID;\r\n\r\n let hasInner: boolean;\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n const managers = this.managers ?? rootScope.managers;\r\n const [title, icons] = await Promise.all([\r\n getPeerTitle(this.peerId, this.plainText, this.onlyFirstName, this.limitSymbols, managers),\r\n this.withIcons && generateTitleIcons(this.peerId)\r\n ]);\r\n\r\n if(icons?.length) {\r\n const inner = document.createElement('span');\r\n inner.classList.add('peer-title-inner');\r\n hasInner = true;\r\n setInnerHTML(inner, title);\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(inner, ...icons);\r\n setInnerHTML(this.element, fragment);\r\n } else {\r\n setInnerHTML(this.element, title);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n\r\n if(this.hasInner !== hasInner) {\r\n this.hasInner = hasInner;\r\n this.element.classList.toggle('with-icons', hasInner);\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport PeerTitle 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 new PeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\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 type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {wrapPhoto} from './wrappers';\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';\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.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 {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 mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\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} 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, withoutPreloader, loadPromises, noPlayButton, size, searchContext, autoDownload, managers = rootScope.managers}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: () => boolean,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n size?: PhotoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers\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,\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 {\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,\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 { // * gifs masonry\n // const gotThumb = managers.appDocsManager.getThumb(doc, false);\n // if(gotThumb) {\n // gotThumb.promise.then(() => {\n // video.poster = gotThumb.cacheContext.url;\n // });\n // }\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);\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 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 });\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 video.autoplay = true;\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 = managers.apiFileManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId, onlyCache: noAutoDownload});\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject();\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 renderImageFromUrl(video, cacheContext.url);\n }, () => {});\n\n return {download: loadPromise, render: 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 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 {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, 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 Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\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}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: () => boolean,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers\n}) {\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media = 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 items.forEach((item, idx) => {\n const {size, media, message} = item;\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: message.media.document,\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 });\n }\n\n if(thumbPromise && loadPromises) {\n loadPromises.push(thumbPromise);\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 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 replaceContent from '../../helpers/dom/replaceContent';\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}: {\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}): Promise {\n if(!fontWeight) fontWeight = 500;\n if(!sizeType) sizeType = '' as any;\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.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)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type)) {\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.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(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 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) {\n const key = doc.id + '-' + toneIndex;\n return !!savingLottiePreview[key];\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n let saving = savingLottiePreview[key];\n if(saving && saving.width >= width && saving.height >= height) {\n return;\n }\n\n 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","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport OverlayClickHandler from '../helpers/overlayClickHandler';\r\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nlet timeout: number;\r\n\r\nconst x = new OverlayClickHandler('toast');\r\nx.addEventListener('toggle', (open) => {\r\n if(!open) {\r\n hideToast();\r\n }\r\n});\r\n\r\nexport function hideToast() {\r\n x.close();\r\n\r\n toastEl.classList.remove('is-visible');\r\n timeout && clearTimeout(+timeout);\r\n\r\n timeout = window.setTimeout(() => {\r\n toastEl.remove();\r\n timeout = undefined;\r\n }, 200);\r\n}\r\n\r\nexport function toast(content: string | Node, onClose?: () => void) {\r\n x.close();\r\n\r\n replaceContent(toastEl, content);\r\n\r\n if(!toastEl.parentElement) {\r\n document.body.append(toastEl);\r\n void toastEl.offsetLeft; // reflow\r\n }\r\n\r\n toastEl.classList.add('is-visible');\r\n\r\n timeout && clearTimeout(+timeout);\r\n x.open(toastEl);\r\n\r\n timeout = window.setTimeout(hideToast, 3000);\r\n\r\n if(onClose) {\r\n x.addEventListener('toggle', onClose, {once: true});\r\n }\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey,\r\n langPackArguments: FormatterArguments,\r\n onClose: () => void\r\n}>) {\r\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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');\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 contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: string,\n onClick: (e: MouseEvent | TouchEvent) => void | boolean | any,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n // ripple(el);\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) textElement.innerHTML = options.regularText;\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 ? */ (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 const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\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 return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = 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\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\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","/*\n * 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({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\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 const {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 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","/*\n * 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 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(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\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 if(IS_APPLE && IS_TOUCH_SUPPORTED) {\n let timeout: number;\n\n const options: EventListenerOptions = {capture: true};\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.touches[0]);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n });\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 element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {InputFile} from '../layer';\r\nimport AvatarEdit from './avatarEdit';\r\nimport AvatarElement from './avatar';\r\nimport InputField from './inputField';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport ButtonCorner from './buttonCorner';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.updateWithOptions({peerId: this.peerId});\r\n\r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n\r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach((inputField) => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach((inputField) => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach((r) => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CheckboxField from './checkboxField';\r\nimport RadioField from './radioField';\r\nimport ripple from './ripple';\r\nimport {SliderSuperTab} from './slider';\r\nimport RadioForm from './radioForm';\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public titleRight: HTMLElement;\r\n public subtitle: HTMLElement;\r\n public media: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string | HTMLElement | DocumentFragment,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n titleRightSecondary: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean,\r\n noWrap: boolean,\r\n listenerSetter: ListenerSetter\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\r\n havePadding = true;\r\n }\r\n\r\n if(options.checkboxField) {\r\n this.checkboxField = options.checkboxField;\r\n\r\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\r\n if(isToggle) {\r\n this.container.classList.add('row-with-toggle');\r\n options.titleRight = this.checkboxField.label;\r\n } else {\r\n havePadding = true;\r\n this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n const onChange = () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n };\r\n\r\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\r\n else this.checkboxField.input.addEventListener('change', onChange);\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n }\r\n\r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n const titleRight = options.titleRight || options.titleRightSecondary;\r\n if(titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.noWrap) this.title.classList.add('no-wrap');\r\n if(options.title) {\r\n if(typeof(options.title) === 'string') {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(options.title);\r\n }\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(titleRight) {\r\n const titleRightEl = this.titleRight = document.createElement('div');\r\n titleRightEl.classList.add('row-title', 'row-title-right');\r\n\r\n if(options.titleRightSecondary) {\r\n titleRightEl.classList.add('row-title-right-secondary');\r\n }\r\n\r\n if(typeof(titleRight) === 'string') {\r\n titleRightEl.innerHTML = titleRight;\r\n } else {\r\n titleRightEl.append(titleRight);\r\n }\r\n\r\n c.append(titleRightEl);\r\n }\r\n }\r\n\r\n if(options.icon) {\r\n havePadding = true;\r\n this.title.classList.add('tgico', 'tgico-' + options.icon);\r\n this.container.classList.add('row-with-icon');\r\n }\r\n\r\n if(havePadding) {\r\n this.container.classList.add('row-with-padding');\r\n }\r\n\r\n if(options.navigationTab) {\r\n options.clickable = () => options.navigationTab.open();\r\n }\r\n\r\n if(options.clickable || options.radioField || options.checkboxField) {\r\n if(typeof(options.clickable) === 'function') {\r\n attachClickEvent(this.container, (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n }, {listenerSetter: options.listenerSetter});\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n public createMedia(size?: 'small') {\r\n this.container.classList.add('row-with-padding');\r\n\r\n const media = this.media = document.createElement('div');\r\n media.classList.add('row-media');\r\n\r\n if(size) {\r\n media.classList.add('row-media-' + size);\r\n }\r\n\r\n this.container.append(media);\r\n\r\n return media;\r\n }\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement('textarea');\r\n textArea.value = text;\r\n\r\n // Avoid scrolling to bottom\r\n textArea.style.top = '0';\r\n textArea.style.left = '0';\r\n textArea.style.position = 'fixed';\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n // const successful = document.execCommand('copy');\r\n // const msg = successful ? 'successful' : 'unsuccessful';\r\n // console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n // console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n\r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\r\n }); */\r\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getDeepProperty from '../helpers/object/getDeepProperty';\r\nimport {LangPackKey, _i18n} from '../lib/langPack';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string,\r\n langKey?: LangPackKey,\r\n name: string,\r\n value?: string,\r\n stateKey?: string,\r\n alignRight?: boolean\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n\r\n if(options.alignRight) {\r\n label.classList.add('radio-field-right');\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n\r\n if(options.value) {\r\n input.value = options.value;\r\n\r\n if(options.stateKey) {\r\n apiManagerProxy.getState().then((state) => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n\r\n input.addEventListener('change', () => {\r\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n\r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n\r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n\r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n\r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n\r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport debounce from '../helpers/schedulers/debounce';\r\nimport {LangPackKey} from '../lib/langPack';\r\nimport InputField, {InputFieldOptions, InputState} from './inputField';\r\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(\r\n options: UsernameInputField['options'],\r\n private managers: AppManagers\r\n ) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n // console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\r\n } else {\r\n this.checkUsernamePromise = this.managers.appUsersManager.checkUsername(username);\r\n }\r\n\r\n this.checkUsernamePromise.then((available) => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 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 });\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {copyTextToClipboard} from '../../../helpers/clipboard';\r\nimport {randomLong} from '../../../helpers/random';\r\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\r\nimport Button from '../../button';\r\nimport {setButtonLoader} from '../../putPreloader';\r\nimport RadioField from '../../radioField';\r\nimport Row, {RadioFormFromRows} from '../../row';\r\nimport {SettingSection} from '../../sidebarLeft';\r\nimport {toast} from '../../toast';\r\nimport {UsernameInputField} from '../../usernameInputField';\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport I18n from '../../../lib/langPack';\r\nimport PopupPeer from '../../popups/peer';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport CheckboxField from '../../checkboxField';\r\nimport rootScope from '../../../lib/rootScope';\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\r\n name: random,\r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\r\n name: random,\r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n // let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n\r\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n // revoked = true;\r\n // onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\r\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n }, this.managers);\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\r\n return this.managers.appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n // unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Scrollable from '../components/scrollable';\r\nimport safeAssign from './object/safeAssign';\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n\r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n\r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then((done) => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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","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","/*\n * 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 type {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager 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 {generateDelimiter, SettingSection} from './sidebarLeft';\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';\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 = 48;\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 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 }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\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.deleted) {\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 = null;\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 = null;\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 if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = this.managers.appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true);\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\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 }\n\n await this.renderSaved();\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\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.promise) return this.promise;\n\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 tempId = 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 this.promise = promise;\n const [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\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 }\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 this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 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.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\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 const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n\n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n\n return promises;\n };\n\n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\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 title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).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.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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport AppSelectPeers from '../appSelectPeers';\r\nimport PopupElement from '.';\r\nimport {LangPackKey, _i18n} from '../../lib/langPack';\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n\r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'],\r\n onSelect?: (peerId: PeerId) => Promise | void,\r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body,\r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n\r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n },\r\n peerType: options.peerTypes,\r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n },\r\n chatRightsAction: options.chatRightsAction,\r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence,\r\n managers: this.managers\r\n });\r\n\r\n // this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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 '../../sidebarLeft';\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 protected 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: 48\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, {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 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 from '../../row';\nimport {SettingSection} from '../../sidebarLeft';\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: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(options.chatId);\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 info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n (chat as Chat.channel).username &&\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(info.checkboxField.label);\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 protected 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(li: Element, 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 = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...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: 48,\n append\n });\n\n setSubtitle(dom.listEl, 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 PopupElement from '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {LangPackKey} from '../../lib/langPack';\nimport PeerTitle from '../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 ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect} = this;\n const peerTitleElement = new PeerTitle({peerId}).element;\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.finally(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n 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 && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], 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 new PeerTitle({peerId}).element\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(/* 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 titleLangKey: title,\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 debounce from '../../../helpers/schedulers/debounce';\nimport CheckboxField from '../../checkboxField';\nimport Row from '../../row';\nimport {SettingSection} from '../../sidebarLeft';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport {wrapStickerToRow} from '../../wrappers';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected 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 let originalReactions = chatFull.available_reactions ?? [];\n const enabledReactions = new Set(originalReactions);\n\n const toggleSection = new SettingSection({\n caption: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'EnableReactionsChannelInfo' : 'EnableReactionsGroupInfo'\n });\n\n const toggleCheckboxField = new CheckboxField({toggle: true, checked: !!enabledReactions.size});\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 const reactionsSection = new SettingSection({\n name: 'AvailableReactions'\n });\n\n const checkboxFields = availableReactions.map((availableReaction) => {\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: enabledReactions.has(availableReaction.reaction)\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n enabledReactions.add(availableReaction.reaction);\n\n if(!toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(true);\n }\n } else {\n enabledReactions.delete(availableReaction.reaction);\n\n if(!enabledReactions.size && toggleCheckboxField.checked) {\n toggleCheckboxField.setValueSilently(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 this.listenerSetter.add(toggleRow.checkboxField.input)('change', () => {\n if(!toggleCheckboxField.checked) {\n checkboxFields.forEach((checkboxField) => checkboxField.checked = false);\n saveReactionsDebounced();\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n checkboxFields.forEach((checkboxField) => checkboxField.checked = true);\n saveReactionsDebounced();\n }\n });\n\n const saveReactions = async() => {\n const newReactions = Array.from(enabledReactions);\n if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n return;\n }\n\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.chatId);\n if(chatFull) {\n chatFull.available_reactions = newReactions;\n }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, newReactions);\n originalReactions = newReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', saveReactions, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider'\r\nimport InputField from '../../inputField';\r\nimport EditPeer from '../../editPeer';\r\nimport {SettingSection} from '../../sidebarLeft';\r\nimport Row from '../../row';\r\nimport Button from '../../button';\r\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\r\nimport {Chat, ChatFull} from '../../../layer';\r\nimport AppChatTypeTab from './chatType';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport AppGroupPermissionsTab from './groupPermissions';\r\nimport {i18n, LangPackKey} from '../../../lib/langPack';\r\nimport PopupDeleteDialog from '../../popups/deleteDialog';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport CheckboxField from '../../checkboxField';\r\nimport AppChatReactionsTab from './chatReactions';\r\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n private tempId: number;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n this.tempId ??= 0;\r\n const tempId = ++this.tempId;\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n\r\n let chatFull = await this.managers.appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(this.chatId);\r\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = await this.managers.appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach((callback) => callback());\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\r\n if(this.chatId === chatId) {\r\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n const canChangeType = await this.managers.appChatsManager.hasRights(this.chatId, 'change_type');\r\n const canChangePermissions = await this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n\r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n\r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n\r\n if(canChangeType) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppChatTypeTab);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(canChangeType || canChangePermissions) {\r\n const reactionsRow = new Row({\r\n titleLangKey: 'Reactions',\r\n icon: 'reactions',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppChatReactionsTab);\r\n tab.chatId = this.chatId;\r\n tab.open().then(() => {\r\n if(this.tempId !== tempId) {\r\n return;\r\n }\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setReactionsLength);\r\n });\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\r\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\r\n const setReactionsLength = () => {\r\n const reactions = chatFull.available_reactions ?? [];\r\n reactionsRow.subtitle.innerHTML = reactions.length + '/' + availableReactionsLength;\r\n };\r\n\r\n setReactionsLength();\r\n\r\n section.content.append(reactionsRow.container);\r\n }\r\n\r\n if(canChangePermissions && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppGroupPermissionsTab);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const setPermissionsLength = async() => {\r\n const chat = await this.managers.appChatsManager.getChatTyped(this.chatId);\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength();\r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n const promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\r\n return this.managers.appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n\r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && canChangeType) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n\r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider'\r\nimport InputField from '../../inputField';\r\nimport EditPeer from '../../editPeer';\r\nimport {SettingSection} from '../../sidebarLeft';\r\nimport Row from '../../row';\r\nimport CheckboxField from '../../checkboxField';\r\nimport Button from '../../button';\r\nimport PeerTitle from '../../peerTitle';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport PopupPeer from '../../popups/peer';\r\nimport {addCancelButton} from '../../popups';\r\nimport {i18n} from '../../../lib/langPack';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\r\nimport formatUserPhone from '../../wrappers/formatUserPhone';\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !(await this.managers.appUsersManager.isContact(this.peerId.toUserId()));\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = await this.managers.appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n\r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n\r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n\r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n\r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n // profileNameDiv.innerHTML = 'Karen Stanford';\r\n\r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false));\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = await this.managers.appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, async() => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n this.managers.appUsersManager.addContact(\r\n this.peerId,\r\n this.nameInputField.value,\r\n this.lastNameInputField.value,\r\n (await this.managers.appUsersManager.getUser(this.peerId)).phone\r\n ).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n this.managers.appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport AppSelectPeers from '../../appSelectPeers';\r\nimport {setButtonLoader} from '../../putPreloader';\r\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\r\nimport ButtonCorner from '../../buttonCorner';\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.container.classList.add('add-members-container');\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'],\r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content,\r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n },\r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\r\n managers: this.managers\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\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","/*\n * 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';\n\nexport default function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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} from '../layer';\nimport type {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../lib/richTextProcessor/getAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\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.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 if(thumbImage) {\n thumbImage.remove();\n }\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 await (renderThumbPromise || renderPromise);\n\n return {\n cached,\n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon: string\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n}\n\n// peerId === peerId || title\nexport default async function putPhoto(\n div: HTMLElement,\n peerId: PeerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig?: boolean\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(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = await managers.appPeersManager.getPeerPhoto(peerId);\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 = await (title ? getAbbreviation(title) : getPeerInitials(peerId, managers));\n set(div, abbr, color, '');\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 getAbbreviation from '../../lib/richTextProcessor/getAbbreviation';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getPeerInitials(peerId: PeerId, managers = rootScope.managers) {\n const peer: Chat | User = await managers.appPeersManager.getPeer(peerId);\n return getAbbreviation(\n (peer as Chat.chat).title ?? [(peer as User.user).first_name, (peer as User.user).last_name].filter(Boolean).join(' ')\n );\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport contextMenuController from '../helpers/contextMenuController';\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\ncontextMenuController.addEventListener('toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean | Promise;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\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' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n\r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n\r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = async(_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */\r\n\r\n // } else { /* right swipe */\r\n\r\n // }\r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */\r\n\r\n // } else { /* down swipe */\r\n\r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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';\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 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);\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 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 IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport type {Channel} from '../lib/appManagers/appChatsManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport I18n from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport {SettingSection, generateDelimiter} from './sidebarLeft';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\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 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\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.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.isDialog = this.isDialog;\n this.avatar.attachClickEvent();\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 subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: async(e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n const full = await this.managers.appProfileManager.getProfileByPeerId(this.peerId);\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter\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: async() => {\n const peer: Channel | User.user = await this.managers.appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: async() => {\n const peer: User = await this.managers.appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n copyTextToClipboard(this.link.title.textContent);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n toast(I18n.format('LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter\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(this.peerId);\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(this.peerId, false);\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 listenerSetter.add(rootScope)('peer_title_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.fillUsername();\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', (peerId) => {\n if(this.peerId === peerId) {\n // const photo = appPeersManager.getPeerPhoto(peerId);\n // if(!photo && this.avatars) {\n this.setAvatar();\n // }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n private setPeerStatus = (needClear = false) => {\n const peerId = this.peerId;\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n if(!peerId || (rootScope.myId === peerId && this.isDialog)) return;\n\n return appImManager.setPeerStatus(\n peerId,\n this.subtitle,\n needClear,\n true,\n () => peerId === this.peerId,\n !this.isDialog\n ).then((callback) => {\n if(callback) {\n callback();\n }\n });\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 async setAvatar() {\n if(this.canBeDetailed()) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar.remove();\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 return;\n }\n }\n\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 await this.avatar.updateWithOptions({peerId: this.peerId});\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n return setText(username, this.username);\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n return setText(user.phone ? formatUserPhone(user.phone) : undefined, this.phone);\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(this.peerId, false);\n notificationsRow.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n });\n }\n }\n\n private async fillRows() {\n const peerId = this.peerId;\n\n await Promise.all([\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(),\n (async() => {\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: true\n })\n\n // generateTitleIcons(peerId)\n ]);\n replaceContent(this.name, element);\n // this.name.append(...icons);\n })(),\n this.setPeerStatus(true)\n ]);\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n await Promise.all([\n this.setAvatar(),\n this.fillRows()\n ]);\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull: ChatFull | UserFull) {\n // if(peerFull.about) {\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n // }\n\n if(!peerId.isUser()) {\n const chat: Chat.channel = await this.managers.appChatsManager.getChat(peerId.toChatId());\n if(chat.username) {\n setText('https://t.me/' + chat.username, this.link);\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n setText(exportedInvite.link, this.link);\n }\n }\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n setText(location.address, this.location);\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n }\n\n private async setMoreDetails(override?: true) {\n this.clearSetMoreDetailsTimeout();\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId || await this.managers.appPeersManager.isRestricted(peerId) || !this.canBeDetailed()) {\n return;\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override);\n const setPromise = result.result.then(async(peerFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId || await this.managers.appPeersManager.isRestricted(peerId)) {\n // this.log.warn('peer changed');\n return;\n }\n\n await this._setMoreDetails(peerId, peerFull);\n });\n\n if(result.cached) {\n await setPromise;\n }\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n\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.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n }\n}\n","/*\n * 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, 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';\n\nconst historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\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 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.title.append(i18n('Profile'));\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', 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(transitionContainer, 'slide-fade', 400, null, false);\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(this.closeBtn.firstElementChild.classList.contains('state-back')) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.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 AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n\n tab.open();\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.renderNewMessages(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.renderNewMessages(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 public async renderNewMessages(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n if(!historiesStorage[peerId]) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historiesStorage[peerId][inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter).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 === 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 public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historiesStorage[peerId][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 this.scrollable.onScroll();\n }\n\n public async cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', await this.searchSuper.canViewMembers() && await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\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 = 0) {\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] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n await this.cleanupHTML();\n await this.toggleEditBtn();\n await this.profile.fillProfileElements();\n }\n\n private async toggleEditBtn() {\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 show = await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from '../../lib/appManagers/appImManager';\r\nimport SidebarSlider from '../slider';\r\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\r\nimport AppSharedMediaTab from './tabs/sharedMedia';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n private isColumnProportionSet = false;\r\n private sharedMediaTab: AppSharedMediaTab;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n }\r\n\r\n construct(managers: AppManagers) {\r\n this.managers = managers;\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n }\r\n\r\n public createSharedMediaTab() {\r\n const tab = this.createTab(AppSharedMediaTab, true);\r\n tab.slider = this;\r\n // this.tabsContainer.prepend(tab.container);\r\n return tab;\r\n }\r\n\r\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\r\n const previousTab = this.sharedMediaTab;\r\n if(previousTab) {\r\n if(tab) {\r\n const wasActive = previousTab.container.classList.contains('active');\r\n if(wasActive) {\r\n tab.container.classList.add('active');\r\n }\r\n\r\n previousTab.container.replaceWith(tab.container);\r\n } else {\r\n previousTab.container.remove();\r\n }\r\n } else {\r\n this.tabsContainer.prepend(tab.container);\r\n }\r\n\r\n this.sharedMediaTab = tab;\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n\r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n\r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n\r\n set();\r\n\r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n\r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n\r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n\r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n\r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n const entry = entries\r\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\r\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n\r\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\r\n this.handler(true, container as HTMLElement);\r\n }, {root: this.container});\r\n }\r\n\r\n /**\r\n * @param {!Element} container\r\n * @param {string} className\r\n */\r\n private addSentinel(container: HTMLElement, className: string) {\r\n const sentinel = document.createElement('div');\r\n sentinel.classList.add('sticky_sentinel', className);\r\n return container.appendChild(sentinel);\r\n }\r\n\r\n /**\r\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\r\n * Note: the elements should be children of `container`.\r\n * @param {!Element} container\r\n */\r\n public observeStickyHeaderChanges(element: HTMLElement) {\r\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\r\n this.headersObserver.observe(headerSentinel);\r\n\r\n this.elementsObserver.observe(element);\r\n }\r\n\r\n public disconnect() {\r\n this.headersObserver.disconnect();\r\n this.elementsObserver.disconnect();\r\n }\r\n\r\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\r\n this.elementsObserver.unobserve(element);\r\n this.headersObserver.unobserve(headerSentinel);\r\n }\r\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","/*\n * 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} 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 {i18n, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable from '../../scrollable';\nimport StickyIntersector from '../../stickyIntersector';\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 {AppManagers} from '../../../lib/appManagers/managers';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\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(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople',\n 'Emoji.AnimalsAndNature',\n 'Emoji.FoodAndDrink',\n 'Emoji.TravelAndPlaces',\n 'Emoji.ActivityAndSport',\n 'Emoji.Objects',\n /* 'Emoji.Symbols', */\n 'Emoji.Flags',\n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = 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 // console.log('emoticons sorted:', sorted);\n\n // Object.keys(sorted).forEach((c) => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n // console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\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 appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n // console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n // emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n this.managers.appEmojiManager.getRecentEmojis().then((recent) => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map((category) => {\n const div = divs[category];\n\n if(!div) {\n console.error('no div by category:', category);\n }\n\n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n attachClickEvent(this.content, this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\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 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 findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector 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: HTMLElement) {\n this.intersector.observe(el);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\r\nimport {wrapVideo} from './wrappers';\r\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\r\nimport Scrollable from './scrollable';\r\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport renderImageFromUrl from '../helpers/dom/renderImageFromUrl';\r\nimport calcImageInBox from '../helpers/calcImageInBox';\r\nimport {doubleRaf} from '../helpers/schedulers';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport rootScope from '../lib/rootScope';\r\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n private managers: AppManagers;\r\n\r\n constructor(\r\n private element: HTMLElement,\r\n private group: AnimationItemGroup,\r\n private scrollable: Scrollable,\r\n attach = true\r\n ) {\r\n this.managers = rootScope.managers;\r\n\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n\r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n // animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n // animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n // console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\r\n const res = await wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true\r\n });\r\n\r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach((item) => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n // clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n // return load();\r\n\r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n // return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n\r\n if(img) {\r\n img && img.classList.remove('hide');\r\n\r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach((item) => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n // console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n // div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n // this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n // let preloader = new ProgressivePreloader(div);\r\n\r\n // const gotThumb = this.managers.appDocsManager.getThumb(doc, false);\r\n\r\n // const willBeAPoster = !!gotThumb;\r\n // let img: HTMLImageElement;\r\n // if(willBeAPoster) {\r\n // img = new Image();\r\n // img.classList.add('media-poster');\r\n\r\n // if(!gotThumb.cacheContext.url) {\r\n // gotThumb.promise.then(() => {\r\n // img.src = gotThumb.cacheContext.url;\r\n // });\r\n // }\r\n // }\r\n\r\n // const afterRender = () => {\r\n // if(img) {\r\n // div.append(img);\r\n // div.style.opacity = '';\r\n // }\r\n // };\r\n\r\n // (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, {EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP} from '..';\r\nimport GifsMasonry from '../../gifsMasonry';\r\nimport Scrollable from '../../scrollable';\r\nimport {putPreloader} from '../../putPreloader';\r\nimport {AppManagers} from '../../../lib/appManagers/managers';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n constructor(private managers: AppManagers) {\r\n\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n this.managers.appDocsManager.getGifs().then((docs) => {\r\n docs.forEach((doc) => {\r\n masonry.add(doc);\r\n });\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private _queue: Map = new Map();\n\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange, options?: IntersectionObserverInit) {\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) {\n const items = spliced.length ? spliced : [this._queue.get(target)];\n items.forEach((item) => {\n this.queue.unshift(item || this._queue.get(target));\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this._queue.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._queue.set(el.div, el);\n this.intersector.observe(el.div);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport whichChild from './whichChild';\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {addCancelButton} from './popups';\nimport PopupPeer, {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(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getVisibleRect(\r\n element: HTMLElement,\r\n overflowElement: HTMLElement,\r\n lookForSticky?: boolean,\r\n rect = element.getBoundingClientRect(),\r\n overflowRect = overflowElement.getBoundingClientRect()\r\n) {\r\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\r\n\r\n // * respect sticky headers\r\n if(lookForSticky) {\r\n const sticky = overflowElement.querySelector('.sticky');\r\n if(sticky) {\r\n const stickyRect = sticky.getBoundingClientRect();\r\n overflowTop = stickyRect.bottom;\r\n }\r\n }\r\n\r\n if(rect.top >= overflowBottom ||\r\n rect.bottom <= overflowTop ||\r\n rect.right <= overflowLeft ||\r\n rect.left >= overflowRight) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\r\n },\r\n overflow\r\n };\r\n}\r\n\r\n(window as any).getVisibleRect = getVisibleRect;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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} 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 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';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const managers = rootScope.managers;\n const findClassName = 'media-sticker-wrapper';\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findUpClassName(e.target, findClassName);\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: () => boolean,\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 player = 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 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.checkAnimations(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = lottieLoader.getAnimation(mediaContainer);\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 player.pause();\n } else if(player instanceof HTMLVideoElement) {\n player.currentTime = (mediaContainer.querySelector('video') as HTMLVideoElement).currentTime;\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(container, 'is-visible', true, openDuration, () => {\n if(!middleware()) return;\n ready();\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findUpClassName(e.target, 'media-sticker-wrapper');\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 return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition(_previousTransformer, 'is-switching', true, switchDuration, () => {\n _previousTransformer.remove();\n });\n\n previousTransformer = transformer;\n\n SetTransition(transformer, 'is-switching', false, switchDuration, () => {\n if(!middleware()) return;\n ready();\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n document.removeEventListener('mousemove', onMousePreMove);\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition(container, 'is-visible', false, openDuration, () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations(false);\n hasViewer = false;\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMouseMove);\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true});\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport mediaSizes from '../../../helpers/mediaSizes';\r\nimport {MessagesAllStickers, StickerSet} from '../../../layer';\r\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\r\nimport {AppManagers} from '../../../lib/appManagers/managers';\r\nimport {i18n, LangPackKey} from '../../../lib/langPack';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\r\nimport LazyLoadQueue from '../../lazyLoadQueue';\r\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\r\nimport {putPreloader} from '../../putPreloader';\r\nimport PopupStickers from '../../popups/stickers';\r\nimport Scrollable, {ScrollableX} from '../../scrollable';\r\nimport StickyIntersector from '../../stickyIntersector';\r\nimport {wrapSticker, wrapStickerSetThumb} from '../../wrappers';\r\nimport findAndSplice from '../../../helpers/array/findAndSplice';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\r\nimport noop from '../../../helpers/noop';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport confirmationPopup from '../../confirmationPopup';\r\nimport VisibilityIntersector, {OnVisibilityChange} from '../../visibilityIntersector';\r\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\r\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\r\nimport forEachReverse from '../../../helpers/array/forEachReverse';\r\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\r\nimport attachStickerViewerListeners from '../../stickerViewer';\r\nimport ListenerSetter from '../../../helpers/listenerSetter';\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animated: Set = new Set();\r\n\r\n constructor(\r\n private regularLazyLoadQueue: LazyLoadQueue,\r\n private group: AnimationItemGroup,\r\n private managers: AppManagers,\r\n private options?: IntersectionObserverInit\r\n ) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\r\n if(!visible) {\r\n this.processInvisible(target);\r\n }\r\n }, options);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\r\n if(!element) {\r\n element = document.createElement('div');\r\n element.classList.add('grid-item', 'super-sticker');\r\n element.dataset.docId = '' + doc.id;\r\n\r\n if(doc.animated) {\r\n this.observeAnimated(element);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n /* !doc.animated && */wrapSticker({\r\n doc,\r\n div: element,\r\n lazyLoadQueue: this.regularLazyLoadQueue,\r\n group: this.group,\r\n onlyThumb: doc.animated,\r\n loadPromises\r\n });\r\n\r\n return element;\r\n }\r\n\r\n public observeAnimated(element: HTMLElement) {\r\n this.animated.add(element);\r\n this.lazyLoadQueue.observe({\r\n div: element,\r\n load: this.processVisible\r\n });\r\n }\r\n\r\n public unobserveAnimated(element: HTMLElement) {\r\n this.animated.delete(element);\r\n this.lazyLoadQueue.unobserve(element);\r\n }\r\n\r\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\r\n // console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(element);\r\n players.forEach((player) => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisible = async(element: HTMLElement) => {\r\n const docId = element.dataset.docId;\r\n const doc = await this.managers.appDocsManager.getDoc(docId);\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n // console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc,\r\n div: element,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null,\r\n group: this.group,\r\n onlyThumb: false,\r\n play: true,\r\n loop: true,\r\n withLock: true\r\n }).then(({render}) => render);\r\n\r\n promise.then(() => {\r\n // clearTimeout(timeout);\r\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisible = async(element: HTMLElement) => {\r\n const docId = element.dataset.docId;\r\n const doc = await this.managers.appDocsManager.getDoc(docId);\r\n\r\n // console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(element, false);\r\n\r\n element.textContent = '';\r\n this.renderSticker(doc, element as HTMLDivElement);\r\n };\r\n}\r\n\r\ntype StickersTabCategory = {\r\n elements: {\r\n container: HTMLElement,\r\n title: HTMLElement,\r\n items: HTMLElement,\r\n menuTab: HTMLElement,\r\n menuTabPadding: HTMLElement\r\n },\r\n set: StickerSet.stickerSet,\r\n items: {\r\n document: MyDocument,\r\n element: HTMLElement\r\n }[],\r\n mounted?: boolean,\r\n id: string,\r\n limit?: number\r\n};\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n private categories: {[id: string]: StickersTabCategory};\r\n private categoriesMap: Map;\r\n private categoriesIntersector: VisibilityIntersector;\r\n private localCategories: StickersTabCategory[];\r\n\r\n private scroll: Scrollable;\r\n private menu: HTMLElement;\r\n private mounted = false;\r\n private stickyIntersector: StickyIntersector;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n constructor(private managers: AppManagers) {\r\n this.categories = {};\r\n this.categoriesMap = new Map();\r\n this.localCategories = [];\r\n }\r\n\r\n private setFavedLimit(appConfig: MTAppConfig) {\r\n const limit = rootScope.premium ? appConfig.stickers_faved_limit_premium : appConfig.stickers_faved_limit_default;\r\n const category = this.categories['faved'];\r\n category.limit = limit;\r\n }\r\n\r\n private createCategory(stickerSet: StickerSet.stickerSet, _title: HTMLElement | DocumentFragment) {\r\n const container = document.createElement('div');\r\n container.classList.add('emoji-category', 'hide');\r\n\r\n const items = document.createElement('div');\r\n items.classList.add('category-items', 'super-stickers');\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('category-title');\r\n title.append(_title);\r\n\r\n const menuTab = ButtonIcon(undefined, {noRipple: true});\r\n menuTab.classList.add('menu-horizontal-div-item');\r\n\r\n const menuTabPadding = document.createElement('div');\r\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\r\n\r\n menuTab.append(menuTabPadding);\r\n\r\n const category: StickersTabCategory = {\r\n elements: {\r\n container,\r\n title,\r\n items,\r\n menuTab,\r\n menuTabPadding\r\n },\r\n set: stickerSet,\r\n items: [],\r\n id: '' + stickerSet.id\r\n };\r\n\r\n container.append(title, items);\r\n\r\n this.categories[stickerSet.id] = category;\r\n this.categoriesMap.set(container, category);\r\n\r\n this.categoriesIntersector.observe(container);\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n\r\n return category;\r\n }\r\n\r\n private categoryAppendStickers(\r\n category: StickersTabCategory,\r\n promise: Promise\r\n ) {\r\n const {container} = category.elements;\r\n\r\n promise.then((documents) => {\r\n const isVisible = this.isCategoryVisible(category);\r\n\r\n documents.forEach((document) => {\r\n const element = this.superStickerRenderer.renderSticker(document);\r\n category.items.push({document, element});\r\n\r\n if(isVisible) {\r\n category.elements.items.append(element);\r\n }\r\n });\r\n\r\n this.setCategoryItemsHeight(category);\r\n container.classList.remove('hide');\r\n });\r\n }\r\n\r\n private isCategoryVisible(category: StickersTabCategory) {\r\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\r\n }\r\n\r\n private setCategoryItemsHeight(category: StickersTabCategory) {\r\n const containerWidth = this.content.getBoundingClientRect().width - 10;\r\n const stickerSize = mediaSizes.active.esgSticker.width;\r\n\r\n const itemsPerRow = Math.floor(containerWidth / stickerSize);\r\n const rows = Math.ceil(category.items.length / itemsPerRow);\r\n const height = rows * stickerSize;\r\n\r\n category.elements.items.style.minHeight = height + 'px';\r\n }\r\n\r\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const category = this.createCategory(set, wrapEmojiText(set.title));\r\n const {menuTab, menuTabPadding, container} = category.elements;\r\n\r\n const pos = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\r\n positionElementByIndex(menuTab, this.menu, pos);\r\n\r\n const promise = this.managers.appStickersManager.getStickerSet(set);\r\n this.categoryAppendStickers(\r\n category,\r\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\r\n );\r\n // const stickerSet = await promise;\r\n\r\n positionElementByIndex(container, this.scroll.container, pos, -1);\r\n\r\n wrapStickerSetThumb({\r\n set,\r\n container: menuTabPadding,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n public init() {\r\n this.content = document.getElementById('content-stickers');\r\n const menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n const menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n const onCategoryVisibility: OnVisibilityChange = ({target, visible, entry}) => {\r\n const category = this.categoriesMap.get(target);\r\n // console.log('roll the windows up', category, target, visible, entry);\r\n if(!visible) {\r\n category.elements.items.textContent = '';\r\n } else {\r\n category.elements.items.append(...category.items.map(({element}) => element));\r\n }\r\n };\r\n\r\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\r\n this.categoriesIntersector = new VisibilityIntersector(onCategoryVisibility, intersectionOptions);\r\n\r\n const clearCategoryItems = (category: StickersTabCategory) => {\r\n category.elements.items.textContent = '';\r\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\r\n category.items.length = 0;\r\n };\r\n\r\n this.scroll.container.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const container = findUpClassName(target, 'emoji-category');\r\n const category = this.categoriesMap.get(container);\r\n if(category.set.id === 'recent') {\r\n return;\r\n }\r\n\r\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n const {stickyIntersector, setActive} = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll);\r\n this.stickyIntersector = stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n const createLocalCategory = (id: string, title: LangPackKey, icon?: string) => {\r\n const category = this.createCategory({id} as any, i18n(title));\r\n this.localCategories.push(category);\r\n category.elements.title.classList.add('disable-hover');\r\n icon && category.elements.menuTab.classList.add('tgico-' + icon);\r\n category.elements.menuTabPadding.remove();\r\n this.toggleLocalCategory(category, false);\r\n return category;\r\n };\r\n\r\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\r\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\r\n // category.limit = stickers.length;\r\n // }\r\n\r\n if(category.limit) {\r\n stickers = stickers.slice(0, category.limit);\r\n }\r\n\r\n const ids = new Set(stickers.map((doc) => doc.id));\r\n forEachReverse(category.items, (item) => {\r\n if(!ids.has(item.document.id)) {\r\n this.deleteSticker(category, item.document, true);\r\n }\r\n });\r\n\r\n this.toggleLocalCategory(category, !!stickers.length);\r\n forEachReverse(stickers, (doc, idx) => {\r\n this.unshiftSticker(category, doc, true, idx);\r\n });\r\n this.spliceExceed(category);\r\n category.elements.container.classList.remove('hide');\r\n };\r\n\r\n const favedCategory = createLocalCategory('faved', 'FavoriteStickers', 'saved');\r\n favedCategory.elements.menuTab.classList.add('active');\r\n\r\n const recentCategory = createLocalCategory('recent', 'Stickers.Recent', 'recent');\r\n recentCategory.limit = 20;\r\n // recentCategory.elements.menuTab.classList.add('active');\r\n\r\n const clearButton = ButtonIcon('close', {noRipple: true});\r\n recentCategory.elements.title.append(clearButton);\r\n attachClickEvent(clearButton, () => {\r\n confirmationPopup({\r\n titleLangKey: 'ClearRecentStickersAlertTitle',\r\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\r\n button: {\r\n langKey: 'Clear'\r\n }\r\n }).then(() => {\r\n this.managers.appStickersManager.clearRecentStickers();\r\n }, noop);\r\n });\r\n\r\n const premiumCategory = createLocalCategory('premium', 'PremiumStickersShort');\r\n const s = document.createElement('span');\r\n s.classList.add('tgico-star', 'color-premium');\r\n premiumCategory.elements.menuTab.append(s);\r\n\r\n const promises = [\r\n Promise.all([\r\n this.managers.apiManager.getAppConfig(),\r\n this.managers.appStickersManager.getFavedStickersStickers()\r\n ]).then(([appConfig, stickers]) => {\r\n this.setFavedLimit(appConfig);\r\n onCategoryStickers(favedCategory, stickers);\r\n }),\r\n\r\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\r\n onCategoryStickers(recentCategory, stickers);\r\n }),\r\n\r\n this.managers.appStickersManager.getAllStickers().then((res) => {\r\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n }),\r\n\r\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\r\n const length = stickers.length;\r\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\r\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\r\n\r\n rootScope.addEventListener('premium_toggle', (isPremium) => {\r\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\r\n });\r\n })\r\n ];\r\n\r\n Promise.race(promises).finally(() => {\r\n preloader.remove();\r\n });\r\n\r\n Promise.all(promises).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n setActive(0);\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\r\n\r\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\r\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\r\n\r\n // emoticonsDropdown.addEventListener('close', () => {\r\n // this.categoriesIntersector.lock();\r\n // });\r\n\r\n // emoticonsDropdown.addEventListener('closed', () => {\r\n // for(const [container] of this.categoriesMap) {\r\n // onCategoryVisibility(container, false);\r\n // }\r\n // });\r\n\r\n // emoticonsDropdown.addEventListener('opened', () => {\r\n // this.categoriesIntersector.unlockAndRefresh();\r\n // });\r\n\r\n // setInterval(() => {\r\n // // @ts-ignore\r\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\r\n\r\n // console.log(\r\n // 'STICKERS RENDERED IN PANEL:',\r\n // players.length,\r\n // players.filter((p) => !p.paused).length,\r\n // rendererLazyLoadQueue.intersector.getVisible().length\r\n // );\r\n // }, .25e3);\r\n\r\n rootScope.addEventListener('stickers_installed', (set) => {\r\n if(!this.categories[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', ({id}) => {\r\n const category = this.categories[id];\r\n if(category && this.mounted) {\r\n category.elements.container.remove();\r\n category.elements.menuTab.remove();\r\n this.categoriesIntersector.unobserve(category.elements.container);\r\n clearCategoryItems(category);\r\n delete this.categories[id];\r\n this.categoriesMap.delete(category.elements.container);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\r\n // if(type === 'faved') {\r\n // return;\r\n // }\r\n\r\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\r\n if(category) {\r\n if(faved) {\r\n this.unshiftSticker(category, document);\r\n } else {\r\n this.deleteSticker(category, document);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\r\n if(this.mounted) {\r\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\r\n onCategoryStickers(category, stickers);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('app_config', (appConfig) => {\r\n this.setFavedLimit(appConfig);\r\n });\r\n\r\n const resizeCategories = () => {\r\n for(const [container, category] of this.categoriesMap) {\r\n this.setCategoryItemsHeight(category);\r\n }\r\n };\r\n\r\n mediaSizes.addEventListener('resize', resizeCategories);\r\n\r\n emoticonsDropdown.addEventListener('opened', resizeCategories);\r\n\r\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\r\n\r\n createStickersContextMenu({\r\n listenTo: this.content,\r\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\r\n onOpen: () => {\r\n emoticonsDropdown.setIgnoreMouseOut(true);\r\n },\r\n onClose: () => {\r\n emoticonsDropdown.setIgnoreMouseOut(false);\r\n }\r\n });\r\n\r\n this.init = null;\r\n }\r\n\r\n private toggleLocalCategory(category: StickersTabCategory, visible: boolean) {\r\n if(!visible) {\r\n category.elements.menuTab.remove();\r\n category.elements.container.remove();\r\n } else {\r\n let idx = this.localCategories.indexOf(category);\r\n const notMounted = this.localCategories.slice(0, idx).filter((category) => !category.mounted);\r\n idx -= notMounted.length;\r\n positionElementByIndex(category.elements.menuTab, this.menu, idx);\r\n positionElementByIndex(category.elements.container, this.scroll.container, idx);\r\n }\r\n\r\n category.mounted = visible;\r\n // category.elements.container.classList.toggle('hide', !visible);\r\n }\r\n\r\n private onLocalCategoryUpdate(category: StickersTabCategory) {\r\n this.setCategoryItemsHeight(category);\r\n this.toggleLocalCategory(category, !!category.items.length);\r\n }\r\n\r\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\r\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\r\n if(item) {\r\n item.element.remove();\r\n\r\n if(!batch) {\r\n this.onLocalCategoryUpdate(category);\r\n }\r\n }\r\n }\r\n\r\n private spliceExceed(category: StickersTabCategory) {\r\n const {items, limit} = category;\r\n items.splice(limit, items.length - limit).forEach(({element}) => {\r\n element.remove();\r\n });\r\n\r\n this.onLocalCategoryUpdate(category);\r\n }\r\n\r\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\r\n if(idx !== undefined) {\r\n const i = category.items[idx];\r\n if(i && i.document.id === doc.id) {\r\n return;\r\n }\r\n }\r\n\r\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\r\n if(!item) {\r\n item = {\r\n element: this.superStickerRenderer.renderSticker(doc),\r\n document: doc\r\n };\r\n }\r\n\r\n category.items.unshift(item);\r\n category.elements.items.prepend(item.element);\r\n\r\n if(!batch) {\r\n this.spliceExceed(category);\r\n }\r\n }\r\n\r\n public unshiftRecentSticker(doc: MyDocument) {\r\n this.managers.appStickersManager.saveRecentSticker(doc.id);\r\n }\r\n\r\n public deleteRecentSticker(doc: MyDocument) {\r\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport InputSearch from '../../inputSearch';\r\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\r\nimport appSidebarRight from '..';\r\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\r\nimport GifsMasonry from '../../gifsMasonry';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport type {MyDocument} from '../../../lib/appManagers/appDocsManager';\r\nimport mediaSizes from '../../../helpers/mediaSizes';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport {NULL_PEER_ID} from '../../../lib/mtproto/mtproto_config';\r\n\r\nconst ANIMATIONGROUP: AnimationItemGroup = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n\r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable.append(this.gifsDiv);\r\n\r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n // this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const {results, next_offset} = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport InputSearch from '../../inputSearch';\r\nimport LazyLoadQueue from '../../lazyLoadQueue';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport PopupStickers from '../../popups/stickers';\r\nimport animationIntersector from '../../animationIntersector';\r\nimport {wrapSticker} from '../../wrappers';\r\nimport appSidebarRight from '..';\r\nimport {StickerSet, StickerSetCovered} from '../../../layer';\r\nimport {i18n} from '../../../lib/langPack';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport forEachReverse from '../../../helpers/array/forEachReverse';\r\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport attachStickerViewerListeners from '../../stickerViewer';\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\r\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n // console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `
`;\r\n\r\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n // ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\r\n // console.log('renderSet got set:', set);\r\n\r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc,\r\n div,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: 'STICKERS-SEARCH',\r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68,\r\n withLock: true\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach((animation) => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach((set) => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\r\n\r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n // console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach((set) => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {attachClickEvent} from './dom/clickEvent';\r\nimport findUpAsChild from './dom/findUpAsChild';\r\nimport EventListenerBase from './eventListenerBase';\r\nimport ListenerSetter from './listenerSetter';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport safeAssign from './object/safeAssign';\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n protected ignoreMouseOut = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n // console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', (e) => {\r\n clearTimeout(this.displayTimeout);\r\n this.onMouseOut(e);\r\n });\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n protected onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN || !this.isActive()) return;\r\n clearTimeout(this.displayTimeout);\r\n\r\n if(this.ignoreMouseOut) {\r\n return;\r\n }\r\n\r\n const toElement = (e as any).toElement as HTMLElement;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n // console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n // if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n\r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchResultableEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n // animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\r\n\r\n public setIgnoreMouseOut(ignore: boolean) {\r\n this.ignoreMouseOut = ignore;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 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 {simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public 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 });\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\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n // this.container.classList.remove('disable-hover');\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\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 }\n\n protected init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab(this.managers);\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\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 === 1) {\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 this.deleteBtn.addEventListener('click', (e) => {\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 cancelEvent(e);\n });\n\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\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); // set emoji tab\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_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\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[2].toggleAttribute('disabled', !canSendStickers);\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n // console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n menuScroll.scrollIntoViewNew({\n element: menu.children[which] as HTMLElement,\n position: 'center',\n axis: 'x'\n });\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n // console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\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 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}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose} = 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: () => emoticonsDropdown.stickersTab.deleteRecentSticker(doc),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => EmoticonsDropdown.sendDocId(doc.id, false, true),\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","/*\n * 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, {ButtonMenuItemOptions} 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 boolean | Promise}>({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose\n}: {\n buttons: T[],\n findElement: (e: MouseEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any\n}) {\n appendTo ??= document.body;\n\n const attachListenerSetter = new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener(listenTo, (e) => {\n const target = findElement(e as any);\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 }, attachListenerSetter);\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 = ButtonMenu(filteredButtons, listenerSetter);\n _element.classList.add('contextmenu');\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement from '.';\r\nimport type {AppStickersManager} from '../../lib/appManagers/appStickersManager';\r\nimport {wrapSticker} from '../wrappers';\r\nimport LazyLoadQueue from '../lazyLoadQueue';\r\nimport {putPreloader} from '../putPreloader';\r\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\r\nimport appImManager from '../../lib/appManagers/appImManager';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport {i18n} from '../../lib/langPack';\r\nimport Button from '../button';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport {toastNew} from '../toast';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\r\nimport attachStickerViewerListeners from '../stickerViewer';\r\n\r\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\r\n\r\n this.title.append(i18n('Loading'));\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup();\r\n destroy();\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.scrollable.append(div);\r\n this.body.append(this.stickersFooter);\r\n\r\n const {destroy} = createStickersContextMenu({\r\n listenTo: this.stickersDiv,\r\n isStickerPack: true\r\n });\r\n\r\n attachStickerViewerListeners({listenTo: this.stickersDiv, listenerSetter: this.listenerSetter});\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const docId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(docId)) {\r\n this.hide();\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return this.managers.appStickersManager.getStickerSet(this.stickerSetInput).then(async(set) => {\r\n if(!set) {\r\n toastNew({langPackKey: 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n let button: HTMLElement;\r\n const s = i18n('Stickers', [set.set.count]);\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [s]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [s]));\r\n }\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n this.managers.appStickersManager.toggleStickerSet(set.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const divs = await Promise.all(set.documents.map(async(doc) => {\r\n if(doc._ === 'documentEmpty') {\r\n return;\r\n }\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n await wrapSticker({\r\n doc,\r\n div,\r\n lazyLoadQueue,\r\n group: ANIMATION_GROUP,\r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size,\r\n withLock: true\r\n });\r\n\r\n return div;\r\n }));\r\n\r\n setInnerHTML(this.title, wrapEmojiText(set.set.title));\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n this.stickersDiv.append(...divs.filter(Boolean));\r\n\r\n this.scrollable.onAdditionalScroll();\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\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?: () => boolean,\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 animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\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 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 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 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 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 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';\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 default async function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect}: {\n doc: MyDocument,\n div: HTMLElement,\n middleware?: () => boolean,\n lazyLoadQueue?: LazyLoadQueue,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: boolean,\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}) {\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 if(!stickerType) {\n console.error('wrong doc for wrapSticker!', doc);\n throw new Error('wrong doc for wrapSticker!');\n }\n\n div.dataset.docId = '' + doc.id;\n div.classList.add('media-sticker-wrapper');\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.classList.add('reflect-x');\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n const lockUrl = locksUrls[doc.id];\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\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 ? 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 let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div.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 let thumbImage: HTMLImageElement | HTMLCanvasElement;\n const afterRender = () => {\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 }\n };\n\n if('url' in thumb) {\n thumbImage = new Image();\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\n haveThumbCached = true;\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(thumb.bytes.length) {\n const d = getPathFromBytes(thumb.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) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.append(svg);\n } else {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n } else if(toneIndex <= 0) {\n thumbImage = new Image();\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n renderImageFromUrl(thumbImage, getPreviewURLFromThumb(doc, thumb, true), afterRender);\n haveThumbCached = true;\n } else {\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()) return;\n\n if(!div.childElementCount) {\n renderImageFromUrl(thumbImage, getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\n }\n }).catch(() => {});\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if(div.childElementCount || (middleware && !middleware())) return;\n\n const r = () => {\n if(div.childElementCount || (middleware && !middleware())) return;\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\n };\n\n await getCacheContext();\n if(cacheContext.url) {\n r();\n return;\n } else {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n thumbImage = res.image;\n res.loadPromise.then(r);\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n }\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div, load});\n return;\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;\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 /* if(doc.id === '1860749763008266301') {\n console.log('loaded sticker:', doc, div);\n } */\n\n // await new Promise((resolve) => setTimeout(resolve, 500));\n // return;\n\n // console.time('download sticker' + doc.id);\n\n // appDocsManager.downloadDocNew(doc.id).promise.then((res) => res.json()).then(async(json) => {\n // fetch(doc.url).then((res) => res.json()).then(async(json) => {\n return await appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb})\n .then(async(blob) => {\n // console.timeEnd('download sticker' + doc.id);\n // console.log('loaded sticker:', doc, div/* , blob */);\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: div,\n loop: loop && !emoji,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex\n }, group, middleware);\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas);\n div.style.setProperty('--lock-url', `url(${lockUrl})`);\n } : undefined;\n\n animation.addEventListener('firstFrame', () => {\n const element = div.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== animation.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 animation.canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n animation.canvas.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n animation.canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n\n if(withThumb !== false) {\n saveLottiePreview(doc, animation.canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n // deferred.resolve();\n }, {once: true});\n\n if(emoji) {\n const data: SendMessageEmojiInteractionData = {\n a: [],\n v: 1\n };\n\n let sendInteractionThrottled: () => void;\n\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n\n attachClickEvent(div, async(e) => {\n cancelEvent(e);\n const animation = lottieLoader.getAnimation(div);\n\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 div.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 const peerId = appImManager.chat.peerId;\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 {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 280,\n target: div,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n if(!sendInteractionThrottled) {\n 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(div, '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);\n\n data.a.length = 0;\n }, 1000, false);\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(e.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\n }\n });\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n\n // console.timeEnd('render sticker' + doc.id);\n } else if(asStatic || stickerType === 3) {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n media = createVideo();\n (media as HTMLVideoElement).muted = true;\n\n if(play) {\n (media as HTMLVideoElement).autoplay = true;\n }\n\n if(loop) {\n (media as HTMLVideoElement).loop = true;\n }\n }\n\n const thumbImage = div.firstElementChild !== media && div.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage : (!thumbImage || thumbImage.tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n media.classList.add('media-sticker');\n\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n return new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const onLoad = () => {\n sequentialDom.mutateElement(div, () => {\n div.append(media);\n thumbImage && thumbImage.classList.add('fade-out');\n\n if(stickerType === 3 && !isSavingLottiePreview(doc, toneIndex)) {\n // const perf = performance.now();\n assumeType(media);\n const canvas = document.createElement('canvas');\n canvas.width = width * window.devicePixelRatio;\n canvas.height = height * window.devicePixelRatio;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n\n if(stickerType === 3 && group) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n\n resolve(media as any);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, {once: true});\n }\n });\n };\n\n await getCacheContext();\n if(asStatic) {\n renderImageFromUrl(media, cacheContext.url, onLoad);\n } else {\n (media as HTMLVideoElement).src = cacheContext.url;\n onMediaLoad(media as HTMLVideoElement).then(onLoad);\n }\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType === 2 && 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 };\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div, 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,\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n return {render: loadPromise};\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: () => boolean,\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","/*\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport appSidebarRight from '..';\r\nimport {roundPercents} from '../../poll';\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport ripple from '../../ripple';\r\nimport {i18n} from '../../../lib/langPack';\r\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public async open(message: any) {\r\n const ret = super.open();\r\n const poll = await this.managers.appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\r\n\r\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\r\n votesList.votes.forEach((vote) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: vote.user_id.toPeerId(false),\r\n container: list,\r\n rippleEnabled: false,\r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n\r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then((votes) => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport ripple from './ripple';\r\nimport appSidebarRight from './sidebarRight';\r\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\r\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\r\nimport {fastRaf} from '../helpers/schedulers';\r\nimport SetTransition from './singleTransition';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport windowSize from '../helpers/windowSize';\r\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\r\nimport toHHMMSS from '../helpers/string/toHHMMSS';\r\nimport StackedAvatars from './stackedAvatars';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n // console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n const remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n // throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n const remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n // throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n // console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach((pollElement) => {\r\n // console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nlet isListenerSet = false;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\r\n appImManager.chat.bubbles.container.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n\r\n if(!isListenerSet) {\r\n isListenerSet = true;\r\n appImManager.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: Message.message;\r\n public managers: AppManagers;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach((pollElement) => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n // void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public async render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n // console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\r\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n // console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n\r\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\r\n\r\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\r\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\r\n });\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n\r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\r\n\r\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\r\n\r\n if(timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n // timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n this.managers.appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n\r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\r\n if(indexes.length) {\r\n\r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach((el) => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n // let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n // active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n // active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find((r) => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n simulateClickEvent(toggleHint);\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n\r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach((target) => {\r\n target.classList.add('is-voting');\r\n });\r\n\r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach((target) => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n\r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\r\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\r\n stackedAvatars.render(peerIds);\r\n replaceContent(this.avatarsDiv, stackedAvatars.container);\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach((svg) => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map((p) => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n // void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n\r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach((svg) => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey;\r\n const args: FormatterArguments = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n\r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define('poll-element', PollElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n\r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\r\n if(html instanceof DocumentFragment) return html;\r\n const template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\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","// 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","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport I18n, {i18n, join, LangPackKey} from '../lib/langPack';\r\nimport formatDuration, {DurationType} from './formatDuration';\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n const d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'},\r\n {m: 60, t: 'h'},\r\n {m: 24, t: 'd'},\r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n\r\n return out;\r\n}\r\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\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':'3672990'}, 'AFN':{'code':'AFN', 'title':'Afghan Afghani', 'symbol':'AFN', 'native':'؋', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'8893', 'max_amount':'88930176'}, 'ALL':{'code':'ALL', 'title':'Albanian Lek', 'symbol':'ALL', 'native':'Lek', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':false, 'space_between':false, 'exp':2, 'min_amount':'11408', 'max_amount':'114088432'}, 'AMD':{'code':'AMD', 'title':'Armenian Dram', 'symbol':'AMD', 'native':'դր.', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'41129', 'max_amount':'411293180'}, 'ARS':{'code':'ARS', 'title':'Argentine Peso', 'symbol':'ARS', 'native':'$', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'12503', 'max_amount':'125036607'}, 'AUD':{'code':'AUD', 'title':'Australian Dollar', 'symbol':'AU$', 'native':'$', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'145', 'max_amount':'1451625'}, 'AZN':{'code':'AZN', 'title':'Azerbaijani Manat', 'symbol':'AZN', 'native':'ман.', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'171', 'max_amount':'1711164'}, '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':'187', 'max_amount':'1873042'}, 'BDT':{'code':'BDT', 'title':'Bangladeshi Taka', 'symbol':'BDT', 'native':'৳', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'9415', 'max_amount':'94154281'}, 'BGN':{'code':'BGN', 'title':'Bulgarian Lev', 'symbol':'BGN', 'native':'лв.', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'186', 'max_amount':'1869710'}, 'BND':{'code':'BND', 'title':'Brunei Dollar', 'symbol':'BND', 'native':'$', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'139', 'max_amount':'1399458'}, 'BOB':{'code':'BOB', 'title':'Bolivian Boliviano', 'symbol':'BOB', 'native':'Bs', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'692', 'max_amount':'6926834'}, 'BRL':{'code':'BRL', 'title':'Brazilian Real', 'symbol':'R$', 'native':'R$', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'518', 'max_amount':'5182986'}, 'CAD':{'code':'CAD', 'title':'Canadian Dollar', 'symbol':'CA$', 'native':'$', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'129', 'max_amount':'1290450'}, 'CHF':{'code':'CHF', 'title':'Swiss Franc', 'symbol':'CHF', 'native':'CHF', 'thousands_sep':'\\'', 'decimal_sep':'.', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'95', 'max_amount':'954630'}, 'CLP':{'code':'CLP', 'title':'Chilean Peso', 'symbol':'CLP', 'native':'$', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':true, 'space_between':true, 'exp':0, 'min_amount':'926', 'max_amount':'9268013'}, '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':'669', 'max_amount':'6692902'}, 'COP':{'code':'COP', 'title':'Colombian Peso', 'symbol':'COP', 'native':'$', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'410927', 'max_amount':'4109270000'}, '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':'69166', 'max_amount':'691668622'}, 'CZK':{'code':'CZK', 'title':'Czech Koruna', 'symbol':'CZK', 'native':'Kč', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'2367', 'max_amount':'23674601'}, 'DKK':{'code':'DKK', 'title':'Danish Krone', 'symbol':'DKK', 'native':'kr', 'thousands_sep':'', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'712', 'max_amount':'7120540'}, 'DOP':{'code':'DOP', 'title':'Dominican Peso', 'symbol':'DOP', 'native':'$', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'5497', 'max_amount':'54971796'}, 'DZD':{'code':'DZD', 'title':'Algerian Dinar', 'symbol':'DZD', 'native':'د.ج.‏', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'14655', 'max_amount':'146557782'}, 'EGP':{'code':'EGP', 'title':'Egyptian Pound', 'symbol':'EGP', 'native':'ج.م.‏', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'1879', 'max_amount':'18794601'}, 'EUR':{'code':'EUR', 'title':'Euro', 'symbol':'€', 'native':'€', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'95', 'max_amount':'957150'}, 'GBP':{'code':'GBP', 'title':'British Pound', 'symbol':'£', 'native':'£', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'82', 'max_amount':'822531'}, 'GEL':{'code':'GEL', 'title':'Georgian Lari', 'symbol':'GEL', 'native':'GEL', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'293', 'max_amount':'2939866'}, 'GTQ':{'code':'GTQ', 'title':'Guatemalan Quetzal', 'symbol':'GTQ', 'native':'Q', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'781', 'max_amount':'7811180'}, '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':'7845675'}, 'HNL':{'code':'HNL', 'title':'Honduran Lempira', 'symbol':'HNL', 'native':'L', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'2476', 'max_amount':'24763692'}, 'HRK':{'code':'HRK', 'title':'Croatian Kuna', 'symbol':'HRK', 'native':'kn', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'721', 'max_amount':'7210988'}, 'HUF':{'code':'HUF', 'title':'Hungarian Forint', 'symbol':'HUF', 'native':'Ft', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'37819', 'max_amount':'378197939'}, 'IDR':{'code':'IDR', 'title':'Indonesian Rupiah', 'symbol':'IDR', 'native':'Rp', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'1490695', 'max_amount':'14906950000'}, 'ILS':{'code':'ILS', 'title':'Israeli New Sheqel', 'symbol':'₪', 'native':'₪', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'348', 'max_amount':'3480155'}, 'INR':{'code':'INR', 'title':'Indian Rupee', 'symbol':'₹', 'native':'₹', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'7894', 'max_amount':'78945050'}, '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':'133', 'max_amount':'1336303'}, 'JMD':{'code':'JMD', 'title':'Jamaican Dollar', 'symbol':'JMD', 'native':'$', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'15175', 'max_amount':'151753529'}, 'JPY':{'code':'JPY', 'title':'Japanese Yen', 'symbol':'¥', 'native':'¥', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':0, 'min_amount':'136', 'max_amount':'1362010'}, 'KES':{'code':'KES', 'title':'Kenyan Shilling', 'symbol':'KES', 'native':'Ksh', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'11787', 'max_amount':'117879251'}, 'KGS':{'code':'KGS', 'title':'Kyrgyzstani Som', 'symbol':'KGS', 'native':'KGS', 'thousands_sep':' ', 'decimal_sep':'-', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'7950', 'max_amount':'79509472'}, 'KRW':{'code':'KRW', 'title':'South Korean Won', 'symbol':'₩', 'native':'₩', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':0, 'min_amount':'1297', 'max_amount':'12971249'}, 'KZT':{'code':'KZT', 'title':'Kazakhstani Tenge', 'symbol':'KZT', 'native':'₸', 'thousands_sep':' ', 'decimal_sep':'-', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'47177', 'max_amount':'471777437'}, 'LBP':{'code':'LBP', 'title':'Lebanese Pound', 'symbol':'LBP', 'native':'ل.ل.‏', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'152338', 'max_amount':'1523381760'}, 'LKR':{'code':'LKR', 'title':'Sri Lankan Rupee', 'symbol':'LKR', 'native':'රු.', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'36271', 'max_amount':'362713465'}, 'MAD':{'code':'MAD', 'title':'Moroccan Dirham', 'symbol':'MAD', 'native':'د.م.‏', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'1018', 'max_amount':'10188182'}, 'MDL':{'code':'MDL', 'title':'Moldovan Leu', 'symbol':'MDL', 'native':'MDL', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'1928', 'max_amount':'19284237'}, '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':'312408', 'max_amount':'3124087599'}, 'MUR':{'code':'MUR', 'title':'Mauritian Rupee', 'symbol':'MUR', 'native':'MUR', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'4614', 'max_amount':'46144273'}, 'MVR':{'code':'MVR', 'title':'Maldivian Rufiyaa', 'symbol':'MVR', 'native':'MVR', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'1534', 'max_amount':'15349670'}, 'MXN':{'code':'MXN', 'title':'Mexican Peso', 'symbol':'MX$', 'native':'$', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'2015', 'max_amount':'20158770'}, 'MYR':{'code':'MYR', 'title':'Malaysian Ringgit', 'symbol':'MYR', 'native':'RM', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'440', 'max_amount':'4406499'}, 'MZN':{'code':'MZN', 'title':'Mozambican Metical', 'symbol':'MZN', 'native':'MTn', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'6383', 'max_amount':'63830365'}, 'NGN':{'code':'NGN', 'title':'Nigerian Naira', 'symbol':'NGN', 'native':'₦', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'41513', 'max_amount':'415132815'}, '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':'3612', 'max_amount':'36125609'}, 'NOK':{'code':'NOK', 'title':'Norwegian Krone', 'symbol':'NOK', 'native':'kr', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'990', 'max_amount':'9902585'}, 'NPR':{'code':'NPR', 'title':'Nepalese Rupee', 'symbol':'NPR', 'native':'नेरू', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'12731', 'max_amount':'127318435'}, 'NZD':{'code':'NZD', 'title':'New Zealand Dollar', 'symbol':'NZ$', 'native':'$', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'160', 'max_amount':'1603695'}, 'PAB':{'code':'PAB', 'title':'Panamanian Balboa', 'symbol':'PAB', 'native':'B\\/.', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'100', 'max_amount':'1007566'}, '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':'381', 'max_amount':'3818809'}, 'PHP':{'code':'PHP', 'title':'Philippine Peso', 'symbol':'PHP', 'native':'₱', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'5499', 'max_amount':'54994501'}, 'PKR':{'code':'PKR', 'title':'Pakistani Rupee', 'symbol':'PKR', 'native':'₨', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'20651', 'max_amount':'206515440'}, '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':'446', 'max_amount':'4466920'}, 'PYG':{'code':'PYG', 'title':'Paraguayan Guaraní', 'symbol':'PYG', 'native':'₲', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':true, 'space_between':true, 'exp':0, 'min_amount':'6909', 'max_amount':'69095662'}, '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':'3640988'}, 'RON':{'code':'RON', 'title':'Romanian Leu', 'symbol':'RON', 'native':'RON', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'473', 'max_amount':'4736501'}, 'RSD':{'code':'RSD', 'title':'Serbian Dinar', 'symbol':'RSD', 'native':'дин.', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'11252', 'max_amount':'112520089'}, 'RUB':{'code':'RUB', 'title':'Russian Ruble', 'symbol':'RUB', 'native':'руб.', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'5282', 'max_amount':'52825030'}, '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':'3752099'}, 'SEK':{'code':'SEK', 'title':'Swedish Krona', 'symbol':'SEK', 'native':'kr', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'1022', 'max_amount':'10224070'}, 'SGD':{'code':'SGD', 'title':'Singapore Dollar', 'symbol':'SGD', 'native':'$', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'139', 'max_amount':'1390698'}, 'THB':{'code':'THB', 'title':'Thai Baht', 'symbol':'฿', 'native':'฿', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'3529', 'max_amount':'35290499'}, 'TJS':{'code':'TJS', 'title':'Tajikistani Somoni', 'symbol':'TJS', 'native':'TJS', 'thousands_sep':' ', 'decimal_sep':';', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'977', 'max_amount':'9773409'}, 'TRY':{'code':'TRY', 'title':'Turkish Lira', 'symbol':'TRY', 'native':'TL', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'1667', 'max_amount':'16673549'}, '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':'684', 'max_amount':'6847347'}, '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':'2973', 'max_amount':'29735499'}, 'TZS':{'code':'TZS', 'title':'Tanzanian Shilling', 'symbol':'TZS', 'native':'TSh', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':2, 'min_amount':'233200', 'max_amount':'2332000087'}, 'UAH':{'code':'UAH', 'title':'Ukrainian Hryvnia', 'symbol':'UAH', 'native':'₴', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':false, 'exp':2, 'min_amount':'2974', 'max_amount':'29741945'}, 'UGX':{'code':'UGX', 'title':'Ugandan Shilling', 'symbol':'UGX', 'native':'USh', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':false, 'exp':0, 'min_amount':'3788', 'max_amount':'37883728'}, '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':'3979', 'max_amount':'39794286'}, 'UZS':{'code':'UZS', 'title':'Uzbekistani Som', 'symbol':'UZS', 'native':'UZS', 'thousands_sep':' ', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':2, 'min_amount':'1094209', 'max_amount':'10942099215'}, 'VND':{'code':'VND', 'title':'Vietnamese Đồng', 'symbol':'₫', 'native':'₫', 'thousands_sep':'.', 'decimal_sep':',', 'symbol_left':false, 'space_between':true, 'exp':0, 'min_amount':'23270', 'max_amount':'232700000'}, 'YER':{'code':'YER', 'title':'Yemeni Rial', 'symbol':'YER', 'native':'ر.ي.‏', 'thousands_sep':',', 'decimal_sep':'.', 'symbol_left':true, 'space_between':true, 'exp':2, 'min_amount':'25024', 'max_amount':'250249914'}, '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':'1624', 'max_amount':'16246189'}};\n\nexport default Currencies;\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 {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} 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 {Message, MessageAction} from '../../layer';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport PeerTitle from '../peerTitle';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport wrapMessageForReply from './messageForReply';\n\nasync function wrapLinkToMessage(message: Message.message | Message.messageService, plain?: boolean) {\n const a = document.createElement('i');\n a.dataset.savedFrom = message.peerId + '_' + message.mid;\n a.dir = 'auto';\n a.append(await wrapMessageForReply(message, undefined, undefined, plain as any));\n return a;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\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 = async(peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\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(pinnedMessage, plain));\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(plain ? action.title : htmlToSpan(wrapEmojiText(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(invoiceMessage, plain).then((el) => {\n el.classList.add('is-receipt-link');\n return el;\n }));\n }\n }\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 {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain: true): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain?: false): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain: boolean): Promise;\nexport default async function wrapMessageActionTextNew(message: MyMessage, plain?: boolean): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('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 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} 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 wrapMessageActionTextNew from './messageActionTextNew';\n\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\nexport default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\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('i');\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;\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] 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 addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\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 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('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport limitSymbols from '../../helpers/string/limitSymbols';\r\nimport appImManager, {CHAT_ANIMATION_GROUP} from '../../lib/appManagers/appImManager';\r\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport DivAndCaption from '../divAndCaption';\r\nimport {wrapPhoto, wrapSticker} from '../wrappers';\r\nimport wrapMessageForReply from '../wrappers/messageForReply';\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport async function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(await wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n // console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n\r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n await wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n // onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n await wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(await wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach((child) => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, async(title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = await wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n\r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply');\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 createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {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';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers}: {\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}) {\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 });\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 const promise = managers.appStickersManager.getStickerSet(set);\n const stickerSet = await promise;\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc: stickerSet.documents[0],\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height\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 insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware} from './middleware';\nimport safeAssign from './object/safeAssign';\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId,\n index: number\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, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\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 safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public 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, true);\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 return callback(false);\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 add(\n id: SortedElementId,\n batch = false,\n updateElementWith?: SortedList['updateElementWith'],\n updateBatch = batch\n ) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\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(\n id: SortedElementId,\n batch = false,\n element = this.get(id),\n updateElementWith?: SortedList['updateElementWith']\n ) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\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 appDialogsManager, {AppDialogsManager, DialogDom} 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 = 48;\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 lazyLoadQueue: this.lazyLoadQueue\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 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) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\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 if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from '../../lib/appManagers/appImManager';\r\nimport PopupPickUser from './pickUser';\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]},\r\n onSelect?: (peerId: PeerId) => Promise | void,\r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer({peerId});\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 PeerTitle from '../peerTitle';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\n\nexport default class PopupDeleteMessages {\n constructor(private peerId: PeerId, private mids: number[], private type: ChatType, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm} = this;\n\n const peerTitleElement = new PeerTitle({peerId}).element;\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 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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {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 {toast} from '../toast';\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 rootScope from '../../lib/rootScope';\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;\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(listenElement, (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 }, listenerSetter);\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(element, 'is-selected', false, 200);\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 && 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 this.onToggleSelection && 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 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(element, 'is-selected', isSelected, 200);\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(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\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 SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\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('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(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\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 // 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.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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n\r\n return '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\n * 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, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport type {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\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 {wrapDocument, wrapPhoto, wrapVideo} from './wrappers';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware} from '../helpers/middleware';\nimport {ChannelParticipant, 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 ButtonMenu, {ButtonMenuItemOptions} 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 getAbbreviation from '../lib/richTextProcessor/getAbbreviation';\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';\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 = (e: MouseEvent) => {\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(attachTo, onContextMenu as any, listenerSetter);\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 = ButtonMenu(this.buttons);\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: () => boolean,\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 public urlsToRevoke: string[] = [];\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 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 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 {dom} = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 54,\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dom,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises);\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 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 [wrapped.images.thumb, wrapped.images.full].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;\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 // this.log.error('NO ENTITY:', message);\n const match = matchUrl(message.message);\n if(!match) {\n // this.log.error('NO ENTITY AND NO MATCH:', message);\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 const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\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, getAbbreviation(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 /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n\n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\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.filter(Boolean));\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 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 : messages.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: 48,\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && (peer.participants_count || peer.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.innerHTML = '' + 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)\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.appMessagesManager.getConversations(query, 0, 20, 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.innerHTML = '';\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: 48,\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 // console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n });\n }\n\n this.searchGroups.people.setActive();\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] ?? (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 = this.searchContext.peerId;\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),\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 }\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 public 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 return Promise.all([\n this.searchContext.peerId.isAnyChat(),\n this.managers.appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()),\n this.managers.appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants')\n ]).then(([isAnyChat, isBroadcast, hasRights]) => {\n return isAnyChat && !isBroadcast && hasRights;\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 if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\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.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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport contextMenuController from '../helpers/contextMenuController';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport ButtonIcon from './buttonIcon';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from './buttonMenu';\r\n\r\nconst ButtonMenuToggle = (\r\n options: Partial<{\r\n noRipple: true,\r\n onlyMobile: true,\r\n listenerSetter: ListenerSetter,\r\n asDiv: boolean,\r\n container: HTMLElement\r\n }> = {},\r\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\r\n buttons: ButtonMenuItemOptions[],\r\n onOpen?: (e: Event) => void,\r\n onClose?: () => void\r\n) => {\r\n options.asDiv = true;\r\n const button = options.container ?? ButtonIcon('more', options);\r\n button.classList.add('btn-menu-toggle');\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options, onClose);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void | Promise, options?: AttachClickOptions, onClose?: () => void) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n // console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n // console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n // window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n contextMenuController.close();\r\n } else {\r\n const result = onOpen && onOpen(e);\r\n const open = () => {\r\n contextMenuController.openBtnMenu(openedMenu, onClose);\r\n };\r\n\r\n if(result instanceof Promise) {\r\n result.then(open);\r\n } else {\r\n open();\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport {ButtonMenuToggleHandler};\r\nexport default ButtonMenuToggle;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport {randomLong} from '../helpers/random';\r\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\r\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\r\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\r\nimport RadioField from './radioField';\r\nimport Row, {RadioFormFromRows} from './row';\r\nimport Scrollable from './scrollable';\r\nimport {SettingSection, generateSection} from './sidebarLeft';\r\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\r\nimport {SliderSuperTabEventable} from './sliderTab';\r\n\r\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey,\r\n inputKey: InputPrivacyKey['_'],\r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey],\r\n managers: AppManagers\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n const managers = options.managers;\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter((r) => !options.skipTypes.includes(r.type));\r\n }\r\n\r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey,\r\n name: random,\r\n value: '' + type\r\n })\r\n });\r\n\r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow',\r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow',\r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n options.tab.slider.createTab(AppAddMembersTab).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\r\n const details = getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach((k) => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map((id) => id.toPeerId()));\r\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', async() => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n const a = ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow',\r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>);\r\n for(const [k, chatKey, usersKey] of a) {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n\r\n if(splitted.users.length) {\r\n rules.push({\r\n _: usersKey,\r\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else if(caption instanceof HTMLElement) {\r\n replaceContent(captionElement, caption);\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n\r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach((peerId) => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\r\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\r\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\r\n const captionEl = document.createElement('div');\r\n captionEl.append(\r\n i18n('PrivacyPhoneInfo'),\r\n document.createElement('br'),\r\n document.createElement('br'),\r\n i18n('PrivacyPhoneInfo4'),\r\n document.createElement('br'),\r\n anchorCopy({\r\n mePath: formatted\r\n })\r\n );\r\n\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [captionEl, captionEl, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n },\r\n managers: this.managers\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {toastNew} from '../../components/toast';\nimport {copyTextToClipboard} from '../clipboard';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\n\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n if(options.mePath) {\n const href = 'https://t.me/' + options.mePath;\n anchor.href = anchor.innerText = href;\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(anchor.href);\n toastNew({langPackKey: 'LinkCopied'});\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 {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport wrapSticker from './sticker'\n\nexport default async function wrapStickerEmoji({emoji, div, width, height, managers = rootScope.managers}: {\n emoji: string,\n div: HTMLElement,\n managers?: AppManagers,\n width: number,\n height: number\n}) {\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 doc,\n div,\n emoji,\n width,\n height,\n loop: false,\n play: true\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport Button from '../../../button';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\nimport AppSettingsTab from '../settings';\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n captionOld: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n emoji,\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport Button from '../../../button';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport AppTwoStepVerificationSetTab from './passwordSet';\r\nimport CodeInputField from '../../../codeInputField';\r\nimport AppTwoStepVerificationEmailTab from './email';\r\nimport {putPreloader} from '../../../putPreloader';\r\nimport {i18n, _i18n} from '../../../../lib/langPack';\r\nimport {canFocus} from '../../../../helpers/dom/canFocus';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport replaceContent from '../../../../helpers/dom/replaceContent';\r\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n\r\n this.managers.passwordManager.confirmPasswordEmail('' + code)\r\n .then((value) => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch((err) => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n\r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport Button from '../../../button';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport InputField from '../../../inputField';\r\nimport {putPreloader} from '../../../putPreloader';\r\nimport AppTwoStepVerificationSetTab from './passwordSet';\r\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\r\nimport PopupPeer from '../../../popups/peer';\r\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\r\nimport {canFocus} from '../../../../helpers/dom/canFocus';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n this.managers.passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n // inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n this.managers.passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true\r\n }],\r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport Button from '../../../button';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport InputField from '../../../inputField';\r\nimport AppTwoStepVerificationEmailTab from './email';\r\nimport {toast} from '../../../toast';\r\nimport I18n from '../../../../lib/langPack';\r\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const stickerContainer = document.createElement('div');\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport Button from '../../../button';\r\nimport PasswordInputField from '../../../passwordInputField';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport TrackingMonkey from '../../../monkeys/tracking';\r\nimport AppTwoStepVerificationHintTab from './hint';\r\nimport {InputState} from '../../../inputField';\r\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from '.';\r\nimport {SettingSection} from '../..';\r\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\r\nimport {canFocus} from '../../../../helpers/dom/canFocus';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport replaceContent from '../../../../helpers/dom/replaceContent';\r\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport I18n, {i18n} from '../../../../lib/langPack';\r\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\r\nimport Button from '../../../button';\r\nimport {putPreloader} from '../../../putPreloader';\r\nimport PasswordMonkey from '../../../monkeys/password';\r\nimport PasswordInputField from '../../../passwordInputField';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n\r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n\r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n const getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return this.managers.passwordManager.getState().then((_state) => {\r\n this.state = _state;\r\n\r\n if(this.state.hint) {\r\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n\r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n\r\n const plainPassword = passwordInputField.value;\r\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\r\n console.log(auth);\r\n\r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n\r\n switch(err.type) {\r\n default:\r\n // btnContinue.innerText = err.type;\r\n textEl.key = 'PASSWORD_HASH_INVALID';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n\r\n getState();\r\n });\r\n };\r\n\r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '../..';\r\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\r\nimport {AccountPassword} from '../../../../layer';\r\nimport {_i18n} from '../../../../lib/langPack';\r\nimport Button from '../../../button';\r\nimport PopupPeer from '../../../popups/peer';\r\nimport {SliderSuperTab} from '../../../slider';\r\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\r\nimport AppSettingsTab from '../settings';\r\nimport AppTwoStepVerificationEmailTab from './email';\r\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n captionOld: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const stickerContainer = document.createElement('div');\r\n\r\n wrapStickerEmoji({\r\n div: stickerContainer,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n });\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true\r\n }],\r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n\r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody],\r\n managers: this.managers\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../../sliderTab';\r\nimport PrivacySection from '../../../privacySection';\r\nimport {LangPackKey} from '../../../../lib/langPack';\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n managers: this.managers\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '..';\r\nimport Button from '../../button';\r\nimport Row from '../../row';\r\nimport {Authorization} from '../../../layer';\r\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\r\nimport ButtonMenu from '../../buttonMenu';\r\nimport {toast} from '../../toast';\r\nimport I18n from '../../../lib/langPack';\r\nimport PopupPeer from '../../popups/peer';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport findAndSplice from '../../../helpers/array/findAndSplice';\r\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\r\nimport positionMenu from '../../../helpers/positionMenu';\r\nimport contextMenuController from '../../../helpers/contextMenuController';\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\r\n // toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n\r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach((auth) => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then((value) => {\r\n if(value) {\r\n target.remove();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n contextMenuController.openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport {SettingSection} from '..';\r\nimport ButtonMenu from '../../buttonMenu';\r\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\r\nimport PopupPickUser from '../../popups/pickUser';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport findUpTag from '../../../helpers/dom/findUpTag';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport formatUserPhone from '../../wrappers/formatUserPhone';\r\nimport getUserStatusString from '../../wrappers/getUserStatusString';\r\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\r\nimport positionMenu from '../../../helpers/positionMenu';\r\nimport contextMenuController from '../../../helpers/contextMenuController';\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n section.caption.parentElement.prepend(section.caption);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n // console.log('block', peerId);\r\n this.managers.appUsersManager.toggleBlock(peerId, true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n section.content.append(list);\r\n\r\n const add = async(peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: list,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = await this.managers.appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : getUserStatusString(user));\r\n }\r\n\r\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n this.managers.appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n contextMenuController.openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport {SettingSection} from '..';\r\nimport Row from '../../row';\r\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates} from '../../../layer';\r\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\r\nimport AppTwoStepVerificationTab from './2fa';\r\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\r\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\r\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\r\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\r\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\r\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\r\nimport AppPrivacyCallsTab from './privacy/calls';\r\nimport AppActiveSessionsTab from './activeSessions';\r\nimport AppBlockedUsersTab from './blockedUsers';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\r\nimport replaceContent from '../../../helpers/dom/replaceContent';\r\nimport CheckboxField from '../../checkboxField';\r\nimport PopupPeer from '../../popups/peer';\r\nimport Button from '../../button';\r\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\r\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\r\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\r\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\r\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\r\nimport noop from '../../../helpers/noop';\r\nimport {toastNew} from '../../toast';\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppBlockedUsersTab);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n this.managers.passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = this.slider.createTab(AppTwoStepVerificationTab);\r\n }\r\n\r\n tab.state = passwordState;\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n };\r\n\r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = this.slider.createTab(AppActiveSessionsTab);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.updateActiveSessions();\r\n }, {once: true});\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n this.managers.appUsersManager.getBlocked().then((res) => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n this.managers.passwordManager.getState().then((state) => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n\r\n // console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyLastSeenTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyCallsTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\r\n const details = getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(\r\n numberVisibilityRow.container,\r\n lastSeenTimeRow.container,\r\n photoVisibilityRow.container,\r\n callRow.container,\r\n linkAccountRow.container,\r\n groupChatsAddRow.container\r\n );\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n\r\n {\r\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\r\n\r\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\r\n const row = new Row({\r\n checkboxField,\r\n noCheckboxSubtitle: true\r\n });\r\n\r\n section.content.append(row.container);\r\n\r\n let enabled: boolean, destroyed: boolean;\r\n this.eventListener.addEventListener('destroy', () => {\r\n destroyed = true;\r\n if(enabled === undefined) return;\r\n this.managers.appPrivacyManager.setGlobalPrivacySettings({\r\n _: 'globalPrivacySettings',\r\n archive_and_mute_new_noncontact_peers: checkboxField.checked\r\n });\r\n }, {once: true});\r\n\r\n const promise = Promise.all([\r\n this.managers.apiManager.getAppConfig(),\r\n this.managers.appPrivacyManager.getGlobalPrivacySettings()\r\n ]).then(([appConfig, settings]) => {\r\n if(destroyed) {\r\n return;\r\n }\r\n\r\n const onPremiumToggle = (isPremium: boolean) => {\r\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\r\n onPremiumToggle(rootScope.premium);\r\n\r\n enabled = settings.archive_and_mute_new_noncontact_peers;\r\n\r\n checkboxField.setValueSilently(enabled);\r\n });\r\n\r\n promises.push(promise);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\r\n section.container.classList.add('hide');\r\n\r\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\r\n const row = new Row({\r\n checkboxField,\r\n noCheckboxSubtitle: true\r\n });\r\n\r\n section.content.append(row.container);\r\n\r\n let enabled: boolean;\r\n this.eventListener.addEventListener('destroy', () => {\r\n if(enabled === undefined) return;\r\n const _enabled = row.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n\r\n this.managers.apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n\r\n const promise = this.managers.apiManager.invokeApi('account.getContentSettings').then((settings) => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n\r\n enabled = settings.pFlags.sensitive_enabled;\r\n checkboxField.setValueSilently(enabled);\r\n section.container.classList.remove('hide');\r\n });\r\n\r\n promises.push(promise);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\r\n\r\n const onClearClick = () => {\r\n const options: PopupConfirmationOptions = {\r\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\r\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\r\n button: {\r\n langKey: 'Clear'\r\n },\r\n checkboxes: [{\r\n text: 'PrivacyClearShipping',\r\n checked: true\r\n }, {\r\n text: 'PrivacyClearPayment',\r\n checked: true\r\n }]\r\n };\r\n\r\n confirmationPopup(options).then(() => {\r\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\r\n const toggle = toggleDisability([clearButton], true);\r\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\r\n if(!info && !payment) {\r\n return;\r\n }\r\n\r\n toggle();\r\n toastNew({\r\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\r\n });\r\n });\r\n }, noop);\r\n };\r\n\r\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\r\n this.listenerSetter.add(clearButton)('click', onClearClick);\r\n section.content.append(clearButton);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }],\r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n\r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n\r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n // console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport renderImageFromUrl from './dom/renderImageFromUrl';\r\n\r\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\r\n const context = canvas.getContext('2d');\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n const pixelsLength = pixels.length / 4;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n // const alphaPixel = pixels[i + 3];\r\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\r\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\r\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n // outPixel[3] = 255;\r\n return outPixel;\r\n}\r\n\r\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\r\n const canvas = document.createElement('canvas');\r\n const ratio = width / height;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n\r\n const context = canvas.getContext('2d');\r\n context.drawImage(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\r\n return averageColorFromCanvas(canvas);\r\n}\r\n\r\nexport function averageColor(imageUrl: string) {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n resolve(averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight));\r\n });\r\n });\r\n};\r\n","import {rgbaToHsla} from './color';\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n\r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\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 {animate} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\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, 25, 50, 75, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900,\n 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1830, 1860, 1890, 1920,\n 1950, 1980, 2010, 2040, 2070, 2100, 2130, 2160, 2190, 2220, 2250, 2280, 2310,\n 2340, 2370, 2400, 2430, 2460, 2490, 2520, 2550, 2580, 2610, 2630, 2640, 2650,\n 2660, 2670, 2680, 2690, 2700\n ]; */\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\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 while(shift > 0) {\n positions.push(positions.shift());\n --shift;\n }\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 drawOnWheel = () => {\n let diff = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n diff = diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n if(diff) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = () => {\n const frames = this._frames;\n const id = frames.shift();\n if(id) {\n this.drawImageData(id);\n }\n\n const leftLength = frames.length;\n if(!leftLength) {\n this._animatingToNextPosition = undefined;\n }\n\n return !!leftLength;\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() {\n if(this._colors.length < 2) {\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 animate(this.drawNextPositionAnimated);\n }\n\n public scrollAnimate(start?: boolean) {\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","import {ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla} from '../helpers/color';\r\nimport attachGrabListeners from '../helpers/dom/attachGrabListeners';\r\nimport clamp from '../helpers/number/clamp';\r\nimport InputField, {InputState} from './inputField';\r\n\r\nexport type ColorPickerColor = {\r\n hsl: string;\r\n rgb: string;\r\n hex: string;\r\n hsla: string;\r\n rgba: string;\r\n hexa: string;\r\n rgbaArray: ColorRgba;\r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n // private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n // private hueDraggerRect: DOMRect;\r\n\r\n private hue = 0;\r\n private saturation = 100;\r\n private lightness = 50;\r\n private alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n\r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\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])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n\r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n\r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n\r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '..';\r\nimport {Theme} from '../../../config/state';\r\nimport {hexaToRgba} from '../../../helpers/color';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport highlightningColor from '../../../helpers/highlightningColor';\r\nimport throttle from '../../../helpers/schedulers/throttle';\r\nimport themeController from '../../../helpers/themeController';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\r\nimport {SliderSuperTab} from '../../slider';\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = themeController.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach((color) => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n\r\n background.id = '2';\r\n background.intensity = 0;\r\n background.slug = '';\r\n background.color = hex.toLowerCase();\r\n background.highlightningColor = hsla;\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n const color = (background.color || '').split(',')[0];\r\n const isColored = !!color && !background.slug;\r\n\r\n // * set active if type is color\r\n if(isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(color || '#cccccc');\r\n\r\n if(!isColored) {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","import type {MediaSize} from '../mediaSize';\n\nexport default function scaleMediaElement(options: {\n media: CanvasImageSource,\n mediaSize?: MediaSize,\n boxSize?: MediaSize,\n quality?: number,\n mimeType?: 'image/jpeg' | 'image/png',\n size?: MediaSize\n}): Promise<{blob: Blob, size: MediaSize}> {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n canvas.width = size.width * window.devicePixelRatio;\n canvas.height = size.height * window.devicePixelRatio;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\n canvas.toBlob((blob) => {\n resolve({blob, size});\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {generateSection} from '..';\r\nimport {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\r\nimport blur from '../../../helpers/blur';\r\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\r\nimport highlightningColor from '../../../helpers/highlightningColor';\r\nimport copy from '../../../helpers/object/copy';\r\nimport sequentialDom from '../../../helpers/sequentialDom';\r\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\r\nimport {Document, PhotoSize, WallPaper} from '../../../layer';\r\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\r\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport Button from '../../button';\r\nimport CheckboxField from '../../checkboxField';\r\nimport ProgressivePreloader from '../../preloader';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport {wrapPhoto} from '../../wrappers';\r\nimport AppBackgroundColorTab from './backgroundColor';\r\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\r\nimport {STATE_INIT, Theme} from '../../../config/state';\r\nimport themeController from '../../../helpers/themeController';\r\nimport requestFile from '../../../helpers/files/requestFile';\r\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\r\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\r\nimport {MediaSize} from '../../../helpers/mediaSize';\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n private wallPapersByElement: Map = new Map();\r\n private elementsByKey: Map = new Map();\r\n\r\n private get theme() {\r\n return themeController.getTheme();\r\n }\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n this.slider.createTab(AppBackgroundColorTab).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur',\r\n name: 'blur',\r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n const wallpaper = this.wallPapersByElement.get(active);\r\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\r\n return;\r\n }\r\n\r\n this.setBackgroundDocument(wallpaper);\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n this.managers.appDocsManager.getWallPapers().then((wallPapers) => {\r\n wallPapers.forEach((wallPaper) => {\r\n this.addWallPaper(wallPaper);\r\n });\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\r\n if(file.name.endsWith('.png')) {\r\n const img = document.createElement('img');\r\n const url = URL.createObjectURL(file);\r\n await renderImageFromUrlPromise(img, url, false);\r\n const mimeType = 'image/jpeg';\r\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\r\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\r\n }\r\n\r\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\r\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\r\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\r\n deferred.cancel = uploadDeferred.cancel;\r\n\r\n uploadDeferred.then((wallPaper) => {\r\n this.clicked.delete(key);\r\n this.elementsByKey.delete(key);\r\n this.wallPapersByElement.set(container, wallPaper);\r\n const newKey = this.getWallPaperKey(wallPaper);\r\n this.elementsByKey.set(newKey, container);\r\n\r\n this.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n\r\n const key = this.getWallPaperKey(wallPaper);\r\n deferred.catch(() => {\r\n container.remove();\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallPaper, false);\r\n this.clicked.add(key);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private getColorsFromWallPaper(wallPaper: WallPaper) {\r\n return wallPaper.settings ? [\r\n wallPaper.settings.background_color,\r\n wallPaper.settings.second_background_color,\r\n wallPaper.settings.third_background_color,\r\n wallPaper.settings.fourth_background_color\r\n ].filter(Boolean).map((color) => '#' + color.toString(16)).join(',') : '';\r\n }\r\n\r\n private getWallPaperKey(wallPaper: WallPaper) {\r\n return '' + wallPaper.id;\r\n }\r\n\r\n private getWallPaperKeyFromTheme(theme: Theme) {\r\n return '' + theme.background.id;\r\n }\r\n\r\n private addWallPaper(wallPaper: WallPaper, append = true) {\r\n const colors = this.getColorsFromWallPaper(wallPaper);\r\n const hasFile = wallPaper._ === 'wallPaper';\r\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\r\n return;\r\n }\r\n\r\n const isDark = !!wallPaper.pFlags.dark;\r\n\r\n const doc = hasFile ? wallPaper.document as Document.document : undefined;\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n container.dataset.id = '' + wallPaper.id;\r\n\r\n const key = this.getWallPaperKey(wallPaper);\r\n this.wallPapersByElement.set(container, wallPaper);\r\n this.elementsByKey.set(key, container);\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n let wrapped: ReturnType, size: PhotoSize;\r\n if(hasFile) {\r\n size = choosePhotoSize(doc, 200, 200);\r\n wrapped = wrapPhoto({\r\n photo: doc,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: size,\r\n noFadeIn: wallPaper.pFlags.pattern\r\n });\r\n\r\n if(wallPaper.pFlags.pattern) {\r\n media.classList.add('is-pattern');\r\n }\r\n\r\n wrapped.then(async({loadPromises, images}) => {\r\n await loadPromises.thumb || loadPromises.full;\r\n return images;\r\n }).then((images) => {\r\n if(wallPaper.pFlags.pattern) {\r\n if(isDark) {\r\n images.full.style.display = 'none';\r\n if(images.thumb) {\r\n images.thumb.style.display = 'none';\r\n }\r\n } else if(wallPaper.settings?.intensity) {\r\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\r\n }\r\n }\r\n\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n } else {\r\n container.append(media);\r\n }\r\n\r\n if(wallPaper.settings && wallPaper.settings.background_color !== undefined) {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\r\n canvas.classList.add('background-colors-canvas');\r\n\r\n if(isDark && hasFile) {\r\n wrapped.then(({loadPromises}) => {\r\n loadPromises.full.then(async() => {\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\r\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\r\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\r\n media.append(canvas);\r\n });\r\n });\r\n } else {\r\n media.append(canvas);\r\n }\r\n }\r\n\r\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\r\n container.classList.add('active');\r\n }\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const wallpaper = this.wallPapersByElement.get(target);\r\n if(wallpaper._ === 'wallPaperNoFile') {\r\n this.setBackgroundDocument(wallpaper);\r\n return;\r\n }\r\n\r\n const key = this.getWallPaperKey(wallpaper);\r\n if(this.clicked.has(key)) return;\r\n this.clicked.add(key);\r\n\r\n const doc = wallpaper.document as MyDocument;\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const load = async() => {\r\n const promise = this.setBackgroundDocument(wallpaper);\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n // console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then((response) => {\r\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (wallPaper: WallPaper) => {\r\n const _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\r\n const deferred = deferredPromise();\r\n let download: Promise | ReturnType;\r\n if(doc) {\r\n download = appDownloadManager.downloadMediaURL({media: doc, queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0});\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n } else {\r\n download = Promise.resolve();\r\n }\r\n\r\n download.then(async() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url?: string) => {\r\n // const perf = performance.now();\r\n let getPixelPromise: Promise;\r\n if(url && !this.theme.background.color) {\r\n getPixelPromise = averageColor(url);\r\n } else {\r\n const {canvas} = ChatBackgroundGradientRenderer.create(this.getColorsFromWallPaper(wallPaper));\r\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\r\n }\r\n\r\n getPixelPromise.then((pixel) => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const hsla = highlightningColor(Array.from(pixel) as any);\r\n // const hsla = 'rgba(0, 0, 0, 0.3)';\r\n // console.log(doc, hsla, performance.now() - perf);\r\n\r\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\r\n background.id = wallPaper.id;\r\n background.intensity = wallPaper.settings?.intensity ?? 0;\r\n background.color = this.getColorsFromWallPaper(wallPaper);\r\n background.slug = slug;\r\n background.highlightningColor = hsla;\r\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n if(slug) {\r\n this.saveToCache(slug, url);\r\n }\r\n\r\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\r\n });\r\n };\r\n\r\n if(!doc) {\r\n onReady();\r\n return;\r\n }\r\n\r\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n const {canvas, promise} = blur(cacheContext.url, 12, 4)\r\n promise.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(canvas.toDataURL());\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n };\r\n}\r\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 {SettingSection} from '..';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SliderSuperTab from '../../sliderTab';\nimport {wrapStickerToRow} from '../../wrappers';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n protected init() {\n this.header.classList.add('with-border');\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.reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction(value);\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {generateSection, SettingSection} from '..';\r\nimport RangeSelector from '../../rangeSelector';\r\nimport Button from '../../button';\r\nimport CheckboxField from '../../checkboxField';\r\nimport RadioField from '../../radioField';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {IS_APPLE} from '../../../environment/userAgent';\r\nimport Row from '../../row';\r\nimport AppBackgroundTab from './background';\r\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport assumeType from '../../../helpers/assumeType';\r\nimport {MessagesAllStickers, StickerSet} from '../../../layer';\r\nimport {wrapStickerSetThumb, wrapStickerToRow} from '../../wrappers';\r\nimport LazyLoadQueue from '../../lazyLoadQueue';\r\nimport PopupStickers from '../../popups/stickers';\r\nimport eachMinute from '../../../helpers/eachMinute';\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\r\nimport AppQuickReactionTab from './quickReaction';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport {State} from '../../../config/state';\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n public valueContainer: HTMLElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(\r\n name: LangPackKey,\r\n step: number,\r\n initialValue: number,\r\n minValue: number,\r\n maxValue: number,\r\n writeValue = true\r\n ) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = this.valueContainer = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n\r\n if(writeValue) {\r\n valueDiv.innerHTML = '' + initialValue;\r\n }\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step,\r\n min: minValue,\r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n if(writeValue) {\r\n // console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n\r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n this.slider.createTab(AppBackgroundTab).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations',\r\n name: 'animations',\r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter',\r\n name,\r\n value: 'enter',\r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter',\r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n\r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n if(IS_GEOLOCATION_SUPPORTED) {\r\n const container = section('DistanceUnitsTitle');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'distance-unit';\r\n const stateKey = 'settings.distanceUnit';\r\n\r\n const kilometersRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsKilometers',\r\n name,\r\n value: 'kilometers',\r\n stateKey\r\n })\r\n });\r\n\r\n const milesRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsMiles',\r\n name,\r\n value: 'miles',\r\n stateKey\r\n })\r\n });\r\n\r\n form.append(kilometersRow.container, milesRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('General.TimeFormat');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'time-format';\r\n const stateKey = 'settings.timeFormat';\r\n\r\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\r\n ['h12', 'General.TimeFormat.h12'],\r\n ['h23', 'General.TimeFormat.h23']\r\n ];\r\n\r\n const rows = formats.map(([format, langPackKey]) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey,\r\n name,\r\n value: format,\r\n stateKey\r\n })\r\n });\r\n\r\n return row;\r\n });\r\n\r\n const cancel = eachMinute(() => {\r\n const date = new Date();\r\n\r\n formats.forEach(([format], idx) => {\r\n const str = date.toLocaleTimeString('en-us-u-hc-' + format, {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n });\r\n\r\n rows[idx].subtitle.textContent = str;\r\n });\r\n });\r\n\r\n this.eventListener.addEventListener('destroy', cancel);\r\n\r\n form.append(...rows.map((row) => row.container));\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction',\r\n name: 'suggest-emoji',\r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji',\r\n name: 'emoji-big',\r\n stateKey: 'settings.emoji.big',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\r\n\r\n const reactionsRow = new Row({\r\n titleLangKey: 'DoubleTapSetting',\r\n havePadding: true,\r\n clickable: () => {\r\n this.slider.createTab(AppQuickReactionTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const renderQuickReaction = () => {\r\n Promise.resolve(this.managers.appReactionsManager.getQuickReaction()).then((reaction) => {\r\n wrapStickerToRow({\r\n row: reactionsRow,\r\n doc: reaction.static_icon,\r\n size: 'small'\r\n });\r\n });\r\n };\r\n\r\n renderQuickReaction();\r\n\r\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers',\r\n name: 'suggest',\r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated',\r\n name: 'loop',\r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const stickersContent = section.generateContentElement();\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n stickersContent[method](row.container);\r\n };\r\n\r\n this.managers.appStickersManager.getAllStickers().then((allStickers) => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n\r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n\r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n section.content.append(reactionsRow.container, suggestCheckboxField.label, loopCheckboxField.label);\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from '../../inputField';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport EditPeer from '../../editPeer';\r\nimport {UsernameInputField} from '../../usernameInputField';\r\nimport {i18n, i18n_} from '../../../lib/langPack';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {generateSection, SettingSection} from '..';\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n\r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const appConfig = await this.managers.apiManager.getAppConfig();\r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: rootScope.premium ? appConfig.about_length_limit_premium : appConfig.about_length_limit_default\r\n });\r\n\r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n }, this.managers);\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n\r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n section.content.append(inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n const promises: Promise[] = [];\r\n\r\n promises.push(this.managers.appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\r\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = await this.managers.appUsersManager.getSelf();\r\n\r\n const userFull = await this.managers.appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n const url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport AppSelectPeers from '../../appSelectPeers';\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport CheckboxField from '../../checkboxField';\r\nimport Button from '../../button';\r\nimport AppEditFolderTab from './editFolder';\r\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\r\nimport {SettingSection} from '..';\r\nimport {toast} from '../../toast';\r\nimport copy from '../../../helpers/object/copy';\r\nimport forEachReverse from '../../../helpers/array/forEachReverse';\r\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\r\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n private limit: number;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n attachClickEvent(this.confirmBtn, async() => {\r\n const selected = this.selector.getSelected();\r\n\r\n // this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n\r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\r\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onAppConfig = (appConfig: MTAppConfig) => {\r\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\r\n\r\n this.dialogsByFilters = new Map();\r\n return Promise.all([\r\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\r\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\r\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\r\n const peerIds = dialogs.map((d) => d.peerId);\r\n this.dialogsByFilters.set(filter, new Set(peerIds));\r\n }));\r\n }),\r\n\r\n this.managers.apiManager.getAppConfig().then((appConfig) => {\r\n onAppConfig(appConfig);\r\n })\r\n ]);\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await this.managers.appUsersManager.getContacts();\r\n peerIds.forEach((peerId) => {\r\n // if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: this.selector.scrollable,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n // if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n setInnerHTML(span, wrapEmojiText(filter.title));\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach((el) => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n // ///////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container,\r\n onChange: this.onSelectChange,\r\n peerType: ['dialogs'],\r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats',\r\n managers: this.managers\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= this.limit && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n // const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n\r\n return super.open();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\r\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport {toast} from '../../toast';\r\nimport InputField from '../../inputField';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport ButtonMenuToggle from '../../buttonMenuToggle';\r\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\r\nimport Button from '../../button';\r\nimport AppIncludedChatsTab from './includedChats';\r\nimport {i18n, LangPackKey} from '../../../lib/langPack';\r\nimport {SettingSection} from '..';\r\nimport PopupPeer from '../../popups/peer';\r\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\r\nimport copy from '../../../helpers/object/copy';\r\nimport deepEqual from '../../../helpers/object/deepEqual';\r\nimport documentFragmentToHTML from '../../../helpers/dom/documentFragmentToHTML';\r\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\r\nimport filterAsync from '../../../helpers/array/filterAsync';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputSection = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.nameInputField = new InputField({\r\n label: 'FilterNameHint',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\r\n inputSection.content.append(inputWrapper);\r\n\r\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\r\n const section = new SettingSection({\r\n name: h2Text,\r\n noDelimiter: true\r\n });\r\n\r\n section.container.classList.add('folder-list', className);\r\n\r\n const categories = section.generateContentElement();\r\n categories.classList.add('folder-categories');\r\n\r\n buttons.forEach((o) => {\r\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\r\n icon: o.icon,\r\n text: o.text,\r\n noRipple: o.withRipple ? undefined : true\r\n });\r\n\r\n if(o.name) {\r\n to[o.name] = button;\r\n }\r\n\r\n categories.append(button);\r\n });\r\n\r\n return section;\r\n };\r\n\r\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\r\n icon: 'add primary',\r\n text: 'ChatList.Filter.Include.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.Contacts',\r\n icon: 'newprivate',\r\n name: 'contacts'\r\n }, {\r\n text: 'ChatList.Filter.NonContacts',\r\n icon: 'noncontacts',\r\n name: 'non_contacts'\r\n }, {\r\n text: 'ChatList.Filter.Groups',\r\n icon: 'group',\r\n name: 'groups'\r\n }, {\r\n text: 'ChatList.Filter.Channels',\r\n icon: 'channel',\r\n name: 'broadcasts'\r\n }, {\r\n text: 'ChatList.Filter.Bots',\r\n icon: 'bots',\r\n name: 'bots'\r\n }], this.flags);\r\n\r\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\r\n icon: 'minus primary',\r\n text: 'ChatList.Filter.Exclude.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.MutedChats',\r\n icon: 'mute',\r\n name: 'exclude_muted'\r\n }, {\r\n text: 'ChatList.Filter.Archive',\r\n icon: 'archive',\r\n name: 'exclude_archived'\r\n }, {\r\n text: 'ChatList.Filter.ReadChats',\r\n icon: 'readchats',\r\n name: 'exclude_read'\r\n }], this.flags);\r\n\r\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\r\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\r\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(this.confirmBtn, () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n\r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then((bool) => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch((err) => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then((player) => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n\r\n const filter = this.filter;\r\n this.nameInputField.value = documentFragmentToHTML(wrapDraftText(filter.title));\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList({ignoreClick: true});\r\n\r\n let peers = filter[key];\r\n\r\n // filter peers where we're kicked\r\n const hasPeer = async(peerId: PeerId) => {\r\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\r\n };\r\n\r\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\r\n peers.length = 0;\r\n peers.push(...filtered);\r\n\r\n peers = peers.slice();\r\n\r\n const renderMore = async(_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\r\n continue;\r\n }\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n peerId: peerId,\r\n container: ul,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n\r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n if(this.container) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\r\n }\r\n\r\n if(firstTime) {\r\n this.originalFilter = filter;\r\n this.filter = copy(filter);\r\n } else {\r\n this.filter = filter;\r\n this.onEditOpen();\r\n this.editCheckForChange();\r\n }\r\n }\r\n\r\n public open(filter?: DialogFilter) {\r\n if(filter === undefined) {\r\n this.setFilter({\r\n _: 'dialogFilter',\r\n id: 0,\r\n title: '',\r\n pFlags: {},\r\n pinned_peers: [],\r\n include_peers: [],\r\n exclude_peers: [],\r\n pinnedPeerIds: [],\r\n includePeerIds: [],\r\n excludePeerIds: []\r\n }, true);\r\n this.type = 'create';\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n }\r\n\r\n return super.open().then(() => {\r\n if(this.type === 'edit') {\r\n this.setFilter(this.originalFilter, true);\r\n this.onEditOpen();\r\n } else {\r\n this.onCreateOpen();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDialogFilter} from '../../../lib/storages/filters';\r\nimport type {DialogFilterSuggested} from '../../../layer';\r\nimport type _rootScope from '../../../lib/rootScope';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\r\nimport {toast} from '../../toast';\r\nimport Button from '../../button';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport AppEditFolderTab from './editFolder';\r\nimport Row from '../../row';\r\nimport {SettingSection} from '..';\r\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\r\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\r\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\r\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\r\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\r\nimport replaceContent from '../../../helpers/dom/replaceContent';\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private async renderFolder(\r\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\r\n container?: HTMLElement,\r\n row?: Row,\r\n append?: boolean\r\n ) {\r\n let filter: MyDialogFilter;\r\n let description = '';\r\n const d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter as MyDialogFilter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n const enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n\r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n\r\n if(!d.length) {\r\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n await Promise.all(folder.map(async(dialog) => {\r\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }));\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n if(!row) {\r\n row = new Row({\r\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: filter.id !== FOLDER_ID_ALL\r\n });\r\n\r\n if(d.length) {\r\n row.subtitle.append(...join(d));\r\n }\r\n\r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\r\n attachClickEvent(row.container, async() => {\r\n this.slider.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n if(filter.id !== FOLDER_ID_ALL) {\r\n replaceContent(row.title, wrapEmojiText(filter.title));\r\n }\r\n\r\n row.subtitle.textContent = '';\r\n row.subtitle.append(...join(d));\r\n }\r\n\r\n const div = row.container;\r\n\r\n if(append) {\r\n const localId = (filter as MyDialogFilter).localId;\r\n if(localId !== undefined) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, localId);\r\n } else if(container) {\r\n container.append(div);\r\n }\r\n }\r\n\r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n\r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, async() => {\r\n if(!(await this.canCreateFolder())) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n this.slider.createTab(AppEditFolderTab).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\r\n for(const filter of filters) {\r\n if(filter.id === FOLDER_ID_ARCHIVE) {\r\n continue;\r\n }\r\n\r\n await this.renderFolder(filter, this.foldersSection.content, undefined, true);\r\n }\r\n\r\n this.toggleAllChats();\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\r\n const filterRendered = this.filtersRendered[filter.id];\r\n if(filterRendered) {\r\n await this.renderFolder(filter, null, filterRendered);\r\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\r\n await this.renderFolder(filter, this.foldersSection.content, undefined, true);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n const filterRendered = this.filtersRendered[filter.id];\r\n if(filterRendered) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n\r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n filterRendered.container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\r\n const filterRendered = this.filtersRendered[filterId];\r\n const container = filterRendered.container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\r\n });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\r\n this.toggleAllChats();\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then((player) => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private toggleAllChats() {\r\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\r\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\r\n }\r\n\r\n private async canCreateFolder() {\r\n const [appConfig, filters] = await Promise.all([\r\n this.managers.apiManager.getAppConfig(),\r\n this.managers.filtersStorage.getDialogFilters()\r\n ]);\r\n\r\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\r\n return filtersLength < (rootScope.premium ? appConfig.dialog_filters_limit_premium : appConfig.dialog_filters_limit_default);\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\r\n\r\n for(const filter of suggestedFilters) {\r\n const div = await this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, async(e) => {\r\n cancelEvent(e);\r\n\r\n if(!(await this.canCreateFolder())) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n this.managers.filtersStorage.createDialogFilter(f, true).then((bool) => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '..';\r\nimport Row from '../../row';\r\nimport CheckboxField from '../../checkboxField';\r\nimport {InputNotifyPeer, Update} from '../../../layer';\r\nimport {SliderSuperTabEventable} from '../../sliderTab';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {LangPackKey} from '../../../lib/langPack';\r\nimport copy from '../../../helpers/object/copy';\r\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\r\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\r\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('notifications-container', 'with-border');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = async() => {\r\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n\r\n return muted;\r\n };\r\n\r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', async() => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\r\n subtitleLangKey: 'Loading',\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SettingSection} from '..';\r\nimport {randomLong} from '../../../helpers/random';\r\nimport I18n from '../../../lib/langPack';\r\nimport RadioField from '../../radioField';\r\nimport Row, {RadioFormFromRows} from '../../row';\r\nimport {SliderSuperTab} from '../../slider'\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = Promise.all([\r\n this.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'web'\r\n }),\r\n this.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }),\r\n ]).then(([languages1, languages2]) => {\r\n const rendered: Set = new Set();\r\n const webLangCodes = languages1.map((language) => language.lang_code);\r\n\r\n const random = randomLong();\r\n languages1.concat(languages2).forEach((language) => {\r\n if(rendered.has(language.lang_code)) return;\r\n rendered.add(language.lang_code);\r\n\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name,\r\n name: random,\r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n\r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value, webLangCodes.includes(value));\r\n });\r\n\r\n I18n.getCacheLangPack().then((langPack) => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n\r\n row.radioField.setValueSilently(true);\r\n });\r\n\r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../../../../helpers/listenerSetter';\nimport {SettingSection} from '../..';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\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 withRipple: true,\n listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n withRipple: true,\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n withRipple: true,\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n withRipple: true,\n listenerSetter\n });\n\n section.content.append(\n contactsCheckboxField.label,\n privateCheckboxField.label,\n groupsCheckboxField.label,\n channelsCheckboxField.label\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n protected init() {\n this.header.classList.add('with-border');\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 protected init() {\n this.header.classList.add('with-border');\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 protected init() {\n this.header.classList.add('with-border');\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 {SettingSection} from '..';\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';\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 protected async init() {\n this.header.classList.add('with-border');\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 withRipple: true\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 = new tabConstructor(this.slider, true);\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 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 autoCheckboxField.label,\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 const gifsCheckboxField = new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n withRipple: true,\n listenerSetter: this.listenerSetter\n });\n const videosCheckboxField = new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n withRipple: true,\n listenerSetter: this.listenerSetter\n });\n\n section.content.append(gifsCheckboxField.label, videosCheckboxField.label);\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport ButtonMenuToggle from '../../buttonMenuToggle';\r\nimport Button from '../../button';\r\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\r\nimport AppGeneralSettingsTab from './generalSettings';\r\nimport AppEditProfileTab from './editProfile';\r\nimport AppChatFoldersTab from './chatFolders';\r\nimport AppNotificationsTab from './notifications';\r\nimport AppLanguageTab from './language';\r\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\r\nimport PopupPeer from '../../popups/peer';\r\nimport AppDataAndStorageTab from './dataAndStorage';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport PeerProfile from '../../peerProfile';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {SettingSection} from '..';\r\nimport Row from '../../row';\r\nimport AppActiveSessionsTab from './activeSessions';\r\nimport {i18n, LangPackKey} from '../../../lib/langPack';\r\nimport {SliderSuperTabConstructable} from '../../sliderTab';\r\nimport PopupAvatar from '../../popups/avatar';\r\nimport {AccountAuthorizations, Authorization} from '../../../layer';\r\nimport PopupElement from '../../popups';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\n// import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n storage: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n } = {} as any;\r\n private profile: PeerProfile;\r\n\r\n private languageRow: Row;\r\n private devicesRow: Row;\r\n\r\n private authorizations: Authorization.authorization[];\r\n private getAuthorizationsPromise: Promise;\r\n\r\n protected async init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n\r\n const btnMenu = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n this.managers.apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.buttons.edit = ButtonIcon('edit');\r\n\r\n this.header.append(this.buttons.edit, btnMenu);\r\n\r\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\r\n this.profile.init();\r\n this.profile.setPeer(rootScope.myId);\r\n const fillPromise = this.profile.fillProfileElements();\r\n\r\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\r\n attachClickEvent(changeAvatarBtn, () => {\r\n const canvas = document.createElement('canvas');\r\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\r\n upload().then((inputFile) => {\r\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\r\n\r\n const updateChangeAvatarBtn = async() => {\r\n const user = await this.managers.appUsersManager.getSelf();\r\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\r\n };\r\n\r\n updateChangeAvatarBtn();\r\n this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\r\n if(rootScope.myId === peerId) {\r\n updateChangeAvatarBtn();\r\n }\r\n });\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n\r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n\r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const b: [string, LangPackKey, SliderSuperTabConstructable][] = [\r\n ['unmute', 'AccountSettings.Notifications', AppNotificationsTab],\r\n ['data', 'DataSettings', AppDataAndStorageTab],\r\n ['lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab],\r\n ['settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab],\r\n ['folder', 'AccountSettings.Filters', AppChatFoldersTab]\r\n ];\r\n\r\n const rows = b.map(([icon, langPackKey, tabConstructor]) => {\r\n return new Row({\r\n titleLangKey: langPackKey,\r\n icon,\r\n clickable: () => {\r\n this.slider.createTab(tabConstructor).open();\r\n // new tabConstructor(this.slider, true).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n });\r\n });\r\n\r\n rows.push(\r\n this.devicesRow = new Row({\r\n titleLangKey: 'Devices',\r\n titleRightSecondary: ' ',\r\n icon: 'activesessions',\r\n clickable: async() => {\r\n if(!this.authorizations) {\r\n await this.updateActiveSessions();\r\n }\r\n\r\n const tab = this.slider.createTab(AppActiveSessionsTab);\r\n tab.authorizations = this.authorizations;\r\n tab.eventListener.addEventListener('destroy', () => {\r\n this.authorizations = undefined;\r\n this.updateActiveSessions(true);\r\n }, {once: true});\r\n tab.open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n }),\r\n\r\n this.languageRow = new Row({\r\n titleLangKey: 'AccountSettings.Language',\r\n titleRightSecondary: i18n('LanguageName'),\r\n icon: 'language',\r\n clickable: () => {\r\n this.slider.createTab(AppLanguageTab).open();\r\n },\r\n listenerSetter: this.listenerSetter\r\n })\r\n );\r\n\r\n buttonsDiv.append(...rows.map((row) => row.container));\r\n\r\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\r\n // profileSection.content.append(this.profile.element);\r\n\r\n const buttonsSection = new SettingSection();\r\n buttonsSection.content.append(buttonsDiv);\r\n\r\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\r\n\r\n attachClickEvent(this.buttons.edit, () => {\r\n const tab = this.slider.createTab(AppEditProfileTab);\r\n tab.open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.updateActiveSessions();\r\n\r\n await fillPromise;\r\n }\r\n\r\n private getAuthorizations(overwrite?: boolean) {\r\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\r\n\r\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\r\n .finally(() => {\r\n if(this.getAuthorizationsPromise === promise) {\r\n this.getAuthorizationsPromise = undefined;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n public updateActiveSessions(overwrite?: boolean) {\r\n return this.getAuthorizations(overwrite).then((auths) => {\r\n this.authorizations = auths.authorizations;\r\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\r\n });\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.profile.destroy();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, {SettingSection} from '..';\r\nimport {InputFile} from '../../../layer';\r\nimport InputField from '../../inputField';\r\nimport {SliderSuperTab} from '../../slider';\r\nimport AvatarEdit from '../../avatarEdit';\r\nimport AppAddMembersTab from './addMembers';\r\nimport {_i18n} from '../../../lib/langPack';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport appImManager from '../../../lib/appManagers/appImManager';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({\r\n caption: 'Channel.DescriptionHolderDescrpiton'\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.channelNameInputField = new InputField({\r\n label: 'EnterChannelName',\r\n maxLength: 128\r\n });\r\n\r\n this.channelDescriptionInputField = new InputField({\r\n label: 'DescriptionOptionalPlaceholder',\r\n maxLength: 255\r\n });\r\n\r\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\r\n\r\n const onLengthChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length &&\r\n !this.channelNameInputField.input.classList.contains('error') &&\r\n !this.channelDescriptionInputField.input.classList.contains('error'));\r\n };\r\n\r\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\r\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n attachClickEvent(this.nextBtn, () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n this.managers.appChatsManager.createChannel({\r\n title,\r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n\r\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\r\n\r\n appSidebarLeft.removeTabFromHistory(this);\r\n this.slider.createTab(AppAddMembersTab).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 protected 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 // 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 / 72 * 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 if(this.init) {\n this.init();\n this.init = null;\n }\n\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 / 72 * 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 public open() {\n this.openContacts();\n return super.open();\n }\n}\n","/*\n * 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 protected init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n const scrollable = appDialogsManager.generateScrollable(chatList, {\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n // appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {SliderSuperTab} from '../../slider';\r\nimport ButtonCorner from '../../buttonCorner';\r\nimport AppNewGroupTab from './newGroup';\r\nimport {toast} from '../../toast';\r\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\r\nimport {i18n, join, _i18n} from '../../../lib/langPack';\r\nimport rootScope from '../../../lib/rootScope';\r\nimport {wrapSticker} from '../../wrappers';\r\nimport SortedUserList from '../../sortedUserList';\r\nimport {PeerLocated, Update, Updates} from '../../../layer';\r\nimport {SettingChatListSection} from '..';\r\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport confirmationPopup from '../../confirmationPopup';\r\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\r\nimport type LazyLoadQueue from '../../lazyLoadQueue';\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueue;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n // protected async init() {\r\n // this.container.classList.add('people-nearby-container');\r\n // this.setTitle('PeopleNearby');\r\n\r\n // this.errorCategory = document.createElement('div');\r\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n // this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n // const emoji = '🧭';\r\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\r\n // const stickerContainer = document.createElement('div');\r\n // stickerContainer.classList.add('sticker-container');\r\n\r\n // if(doc) {\r\n // wrapSticker({\r\n // doc,\r\n // div: stickerContainer,\r\n // loop: false,\r\n // play: true,\r\n // width: 86,\r\n // height: 86,\r\n // emoji,\r\n // needUpscale: true\r\n // }).then(() => {\r\n // // this.animation = player;\r\n // });\r\n // } else {\r\n // stickerContainer.classList.add('media-sticker-wrapper');\r\n // }\r\n\r\n // const caption = document.createElement('div');\r\n // caption.classList.add('caption');\r\n // _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n // this.locatedPeers = new Map();\r\n\r\n // const m = () => {\r\n // const sortedUserList = new SortedUserList({\r\n // avatarSize: 42,\r\n // createChatListOptions: {\r\n // dialogSize: 48,\r\n // new: true\r\n // },\r\n // autonomous: false,\r\n // onUpdate: (element) => {\r\n // const peer = this.locatedPeers.get(element.id);\r\n // const elements: HTMLElement[] = [\r\n // this.parseDistance(peer.distance)\r\n // ];\r\n\r\n // if(!element.id.isUser()) {\r\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\r\n // }\r\n\r\n // element.dom.lastMessageSpan.textContent = '';\r\n // element.dom.lastMessageSpan.append(...join(elements, false));\r\n // },\r\n // getIndex: (element) => {\r\n // const peer = this.locatedPeers.get(element.id);\r\n // return 0x7FFFFFFF - peer.distance;\r\n // },\r\n // appUsersManager: this.managers.appUsersManager\r\n // });\r\n\r\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n\r\n // return sortedUserList;\r\n // };\r\n\r\n // const peopleSection = this.peopleSection = new SettingChatListSection({\r\n // name: 'PeopleNearbyHeader',\r\n // sortedList: m()\r\n // });\r\n\r\n // const chatsSection = this.chatsSection = new SettingChatListSection({\r\n // name: 'ChatsNearbyHeader',\r\n // sortedList: m()\r\n // });\r\n\r\n // const btnMakeVisible = peopleSection.makeButton({\r\n // text: 'MakeMyselfVisible',\r\n // icon: 'location'\r\n // });\r\n\r\n // const btnMakeInvisible = peopleSection.makeButton({\r\n // text: 'StopShowingMe',\r\n // icon: 'location'\r\n // });\r\n\r\n // const btnCreateGroup = chatsSection.makeButton({\r\n // text: 'NearbyCreateGroup',\r\n // icon: 'newgroup'\r\n // });\r\n\r\n // attachClickEvent(btnMakeVisible, () => {\r\n // confirmationPopup({\r\n // titleLangKey: 'MakeMyselfVisibleTitle',\r\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n // button: {\r\n // langKey: 'OK'\r\n // }\r\n // }).then(() => {\r\n // this.startWatching();\r\n // });\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // attachClickEvent(btnMakeInvisible, () => {\r\n // this.stopWatching();\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // attachClickEvent(btnCreateGroup, () => {\r\n // this.slider.createTab(AppNewGroupTab).open([], true);\r\n // }, {listenerSetter: this.listenerSetter});\r\n\r\n // btnMakeVisible.classList.add('primary');\r\n // btnMakeInvisible.classList.add('danger');\r\n // btnCreateGroup.classList.add('primary');\r\n\r\n // this.content.append(this.retryBtn);\r\n // this.scrollable.append(\r\n // stickerContainer,\r\n // caption,\r\n // peopleSection.container,\r\n // chatsSection.container,\r\n // this.errorCategory\r\n // );\r\n // }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n public open() {\r\n const result = super.open();\r\n result.then(() => {\r\n this.retryBtn.classList.remove('is-visible');\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.latestLocationSaved = {\r\n latitude: location.coords.latitude,\r\n longitude: location.coords.longitude,\r\n accuracy: location.coords.accuracy\r\n };\r\n\r\n console.log(this.latestLocationSaved);\r\n\r\n this.managers.appUsersManager.getLocated(\r\n location.coords.latitude,\r\n location.coords.longitude,\r\n location.coords.accuracy\r\n ).then((response) => {\r\n const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n const peers = update.peers as PeerLocated.peerLocated[];\r\n const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n orderedPeers?.forEach((peer) => {\r\n const peerId = getPeerId(peer.peer);\r\n const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n this.locatedPeers.set(peerId, peer);\r\n section.sortedList.add(peerId);\r\n });\r\n\r\n this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n this.errorCategory.innerHTML = 'No groups or channels found around you.';\r\n });\r\n }, (error) => {\r\n this.errorCategory.classList.remove('hide');\r\n this.retryBtn.classList.add('is-visible');\r\n this.retryBtn.addEventListener('click', this.open);\r\n if(error instanceof GeolocationPositionError) {\r\n this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\r\n } else {\r\n this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n this.managers.appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n this.managers.appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n this.managers.appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\r\n (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\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","/*\n * 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';\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\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) => {\n this.createTab(AppNewGroupTab).open(peerIds);\n },\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(1, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(1));\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: 'saved',\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\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, async(e) => {\n await Promise.all(filteredButtons.map(async(button) => {\n if(button.verify) {\n button.element.classList.toggle('hide', !(await button.verify()));\n }\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 const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\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 this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\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 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.classList.add('btn-update');\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 // const weave = new TopbarWeave();\n // const weaveContainer = weave.render('btn-update-weave');\n // this.updateBtn.prepend(weaveContainer);\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 // setTimeout(() => {\n // weave.componentDidMount();\n // weave.setCurrentState(GROUP_CALL_STATE.MUTED, true);\n // weave.setAmplitude(0);\n // weave.handleBlur();\n // }, 1e3);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n // parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.innerText = '' + 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((state) => {\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\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-30');\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.appMessagesManager.getConversations(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(searchContainer.parentElement, 'zoom-fade', 150, (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 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 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 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\nexport const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../../lib/rootScope';\r\n// import { generatePathData } from \"../../helpers/dom\";\r\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\r\nimport type Chat from './chat';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\r\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\r\nimport AvatarElement from '../avatar';\r\nimport {Message} from '../../layer';\r\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\r\nimport forEachReverse from '../../helpers/array/forEachReverse';\r\nimport partition from '../../helpers/array/partition';\r\n\r\ntype GroupItem = {\r\n bubble: HTMLElement,\r\n fromId: PeerId,\r\n mid: number,\r\n groupMid?: number,\r\n timestamp: number,\r\n dateTimestamp: number,\r\n mounted: boolean,\r\n single: boolean,\r\n group?: BubbleGroup,\r\n message: Message.message | Message.messageService // use it only to set avatar\r\n};\r\n\r\nclass BubbleGroup {\r\n container: HTMLElement;\r\n chat: Chat;\r\n groups: BubbleGroups;\r\n items: GroupItem[]; // descend sorted\r\n avatarContainer: HTMLElement;\r\n avatarLoadPromise: ReturnType;\r\n avatar: AvatarElement;\r\n mounted: boolean;\r\n dateTimestamp: number;\r\n offset: number;\r\n\r\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('bubbles-group');\r\n this.chat = chat;\r\n this.groups = groups;\r\n this.items = [];\r\n this.dateTimestamp = dateTimestamp;\r\n this.offset = 0;\r\n }\r\n\r\n createAvatar(message: Message.message | Message.messageService) {\r\n if(this.avatarLoadPromise) {\r\n return this.avatarLoadPromise;\r\n } else if(message._ === 'messageService') {\r\n return;\r\n }\r\n\r\n this.avatarContainer = document.createElement('div');\r\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\r\n ++this.offset;\r\n\r\n const fwdFrom = message.fwd_from;\r\n const fwdFromId = message.fwdFromId;\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n const currentPeerId = this.chat.peerId;\r\n const avatar = this.avatar = new AvatarElement();\r\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\r\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\r\n const avatarLoadPromise = this.avatar.updateWithOptions({\r\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\r\n peerId,\r\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined\r\n });\r\n\r\n this.avatarLoadPromise = Promise.all([\r\n avatarLoadPromise,\r\n peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\r\n ]).then(([result, user]) => {\r\n if(user?.pFlags?.premium) {\r\n avatar.classList.add('is-premium', 'tgico-star');\r\n }\r\n\r\n return result;\r\n });\r\n\r\n this.avatarContainer.append(this.avatar);\r\n this.container.append(this.avatarContainer);\r\n\r\n return this.avatarLoadPromise;\r\n }\r\n\r\n get firstTimestamp() {\r\n return this.firstItem.timestamp;\r\n }\r\n\r\n get firstMid() {\r\n return this.firstItem.mid;\r\n }\r\n\r\n get firstItem() {\r\n return this.items[this.items.length - 1];\r\n }\r\n\r\n get lastTimestamp() {\r\n return this.lastItem.timestamp;\r\n }\r\n\r\n get lastMid() {\r\n return this.lastItem.mid;\r\n }\r\n\r\n get lastItem() {\r\n return this.items[0];\r\n }\r\n\r\n updateClassNames() {\r\n const items = this.items;\r\n const length = items.length;\r\n if(!length) {\r\n return;\r\n }\r\n\r\n // const elements = Array.from(this.container.children);\r\n // if(this.offset) elements.splice(0, this.offset);\r\n\r\n // const length = elements.length;\r\n // if(!length) {\r\n // return;\r\n // }\r\n\r\n const first = items[length - 1].bubble;\r\n\r\n if(items.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n // this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n // this.setClipIfNeeded(first, true);\r\n }\r\n\r\n for(let i = 1, _length = length - 1; i < _length; ++i) {\r\n const bubble = items[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n // this.setClipIfNeeded(bubble, true);\r\n }\r\n\r\n const last = items[0].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n // this.setClipIfNeeded(last);\r\n }\r\n\r\n insertItem(item: GroupItem) {\r\n const {items} = this;\r\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\r\n\r\n item.group = this;\r\n if(items.length === 1) {\r\n this.groups.insertGroup(this);\r\n }\r\n }\r\n\r\n removeItem(item: GroupItem) {\r\n indexOfAndSplice(this.items, item);\r\n\r\n if(!this.items.length) {\r\n indexOfAndSplice(this.groups.groups, this);\r\n }\r\n\r\n item.group = undefined;\r\n }\r\n\r\n mount(updateClassNames?: boolean) {\r\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\r\n debugger;\r\n\r\n if(this.mounted) {\r\n this.onItemUnmount();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const {offset, items} = this;\r\n const {length} = items;\r\n forEachReverse(items, (item, idx) => {\r\n this.mountItem(item, length - 1 - idx, offset);\r\n });\r\n\r\n if(updateClassNames) {\r\n this.updateClassNames();\r\n }\r\n\r\n this.onItemMount();\r\n }\r\n\r\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\r\n if(item.mounted) {\r\n return;\r\n }\r\n\r\n positionElementByIndex(item.bubble, this.container, offset + idx);\r\n item.mounted = true;\r\n }\r\n\r\n unmountItem(item: GroupItem) {\r\n if(!item.mounted) {\r\n return;\r\n }\r\n\r\n item.bubble.remove();\r\n item.mounted = false;\r\n this.onItemUnmount();\r\n }\r\n\r\n onItemMount() {\r\n if(this.mounted) {\r\n return;\r\n }\r\n\r\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\r\n // const idx = this.groups.indexOf(group);\r\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\r\n const dateGroupsLength = dateGroups.length;\r\n const idx = dateGroups.indexOf(this);\r\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\r\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\r\n this.mounted = true;\r\n }\r\n\r\n onItemUnmount() {\r\n if(!this.mounted) {\r\n return;\r\n }\r\n\r\n if(!this.items.length) {\r\n this.container.remove();\r\n this.chat.bubbles.deleteEmptyDateGroups();\r\n this.mounted = false;\r\n } else {\r\n this.updateClassNames();\r\n }\r\n }\r\n}\r\n\r\n// class BubbleGroupItem implements GroupItem {\r\n// bubble: HTMLElement;\r\n// fromId: PeerId;\r\n// mid: number;\r\n// timestamp: number;\r\n// dateTimestamp: number;\r\n// mounted: boolean;\r\n// single: boolean;\r\n// group: BubbleGroup;\r\n\r\n// constructor(details: GroupItem) {\r\n// Object.assign(this, details);\r\n// }\r\n// }\r\n\r\nexport default class BubbleGroups {\r\n public itemsArr: Array = []; // descend sorted\r\n private itemsMap: Map = new Map();\r\n public groups: Array = []; // descend sorted\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n private sortItemsKey: Extract;\r\n private sortGroupsKey: Extract;\r\n public sortGroupItemsKey: Extract;\r\n\r\n constructor(private chat: Chat) {\r\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\r\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\r\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\r\n }\r\n\r\n removeItem(item: GroupItem) {\r\n item.group.removeItem(item);\r\n this.removeItemFromCache(item);\r\n }\r\n\r\n removeAndUnmountBubble(bubble: HTMLElement) {\r\n const item = this.getItemByBubble(bubble);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n const items = this.itemsArr;\r\n const index = items.indexOf(item);\r\n const siblings = this.getSiblingsAtIndex(index, items);\r\n\r\n const group = item.group;\r\n this.removeItem(item);\r\n group.unmountItem(item);\r\n\r\n const modifiedGroups: Set = new Set();\r\n modifiedGroups.add(group);\r\n\r\n const [previousSibling, nextSibling] = siblings;\r\n if(\r\n previousSibling &&\r\n nextSibling &&\r\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\r\n previousSibling.group !== nextSibling.group\r\n ) {\r\n const group = nextSibling.group;\r\n this.f(nextSibling.group.items);\r\n group.onItemUnmount();\r\n modifiedGroups.add(previousSibling.group);\r\n this.groupUngrouped();\r\n }\r\n\r\n this.mountUnmountGroups(Array.from(modifiedGroups));\r\n }\r\n\r\n mountUnmountGroups(groups: BubbleGroup[]) {\r\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\r\n\r\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\r\n toUnmount.forEach((group) => {\r\n group.onItemUnmount();\r\n })\r\n\r\n toMount.forEach((group) => {\r\n group.mount(true);\r\n });\r\n\r\n // toMount.forEach((group) => {\r\n // group.updateClassNames();\r\n // });\r\n }\r\n\r\n f(items: GroupItem[], index: number = 0, length = items.length) {\r\n for(; index < length; ++index) {\r\n const item = items[index];\r\n item.mounted = false;\r\n item.group.removeItem(item);\r\n --length;\r\n --index;\r\n }\r\n }\r\n\r\n getItemByBubble(bubble: HTMLElement) {\r\n return this.itemsMap.get(bubble);\r\n }\r\n\r\n getLastGroup() {\r\n return this.groups[0];\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const item = this.getItemByBubble(bubble);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n item.mid = mid;\r\n\r\n // indexOfAndSplice(item.group.items, item);\r\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\r\n // // if(canChangeGroupMid) item.groupMid = mid;\r\n // item.group.insertItem(item);\r\n\r\n indexOfAndSplice(this.itemsArr, item);\r\n this.insertItemToArray(item, this.itemsArr);\r\n }\r\n\r\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\r\n this.itemsMap.delete(item.bubble);\r\n item.bubble = bubble;\r\n this.itemsMap.set(bubble, item);\r\n }\r\n\r\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\r\n const item = this.getItemByBubble(from);\r\n if(!item) {\r\n return;\r\n }\r\n\r\n this.changeItemBubble(item, to);\r\n }\r\n\r\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\r\n return item2.fromId === item1.fromId &&\r\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\r\n item1.dateTimestamp === item2.dateTimestamp &&\r\n !item1.single &&\r\n !item2.single;\r\n }\r\n\r\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\r\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\r\n }\r\n\r\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\r\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\r\n // }\r\n\r\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\r\n items = items.slice();\r\n const idx = this.insertItemToArray(item, items);\r\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\r\n return this.findGroupSiblingInItems(item, items, idx);\r\n }\r\n\r\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\r\n const previousItem = items[index - 1];\r\n let siblingGroupedItem: GroupItem;\r\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\r\n siblingGroupedItem = previousItem;\r\n } else {\r\n for(let k = index + 1; k < length; ++k) {\r\n const nextItem = items[k];\r\n if(this.canItemsBeGrouped(item, nextItem)) {\r\n if(nextItem.group) {\r\n siblingGroupedItem = nextItem;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return siblingGroupedItem;\r\n }\r\n\r\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\r\n group.insertItem(item);\r\n this.addItemToCache(item);\r\n }\r\n\r\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\r\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\r\n }\r\n\r\n insertGroup(group: BubbleGroup) {\r\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\r\n }\r\n\r\n addItemToCache(item: GroupItem) {\r\n this.insertItemToArray(item, this.itemsArr);\r\n this.itemsMap.set(item.bubble, item);\r\n }\r\n\r\n removeItemFromCache(item: GroupItem) {\r\n indexOfAndSplice(this.itemsArr, item);\r\n this.itemsMap.delete(item.bubble);\r\n }\r\n\r\n getMessageFromId(message: MyMessage) {\r\n let fromId = message.viaBotId || message.fromId;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n\r\n return fromId;\r\n }\r\n\r\n createItem(bubble: HTMLElement, message: MyMessage) {\r\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\r\n const {mid, date: timestamp} = message;\r\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\r\n const item: GroupItem = {\r\n mid,\r\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\r\n fromId: this.getMessageFromId(message),\r\n bubble,\r\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\r\n timestamp,\r\n dateTimestamp,\r\n mounted: false,\r\n single,\r\n message\r\n };\r\n\r\n return item;\r\n }\r\n\r\n splitSiblingsOnGrouping(siblings: ReturnType) {\r\n const [previousSibling, nextSibling] = siblings;\r\n const previousGroup = previousSibling?.group;\r\n const nextGroup = nextSibling?.group;\r\n\r\n if(!previousGroup) {\r\n return;\r\n }\r\n\r\n // will refresh group\r\n // if(previousGroup === nextGroup) {\r\n const items = previousGroup.items;\r\n const index = items.indexOf(previousSibling) + 1;\r\n const length = items.length;\r\n if(index === length) {\r\n return;\r\n }\r\n\r\n const modifiedGroups: BubbleGroup[] = [previousGroup];\r\n // if(previousGroup !== nextGroup && nextGroup) {\r\n // modifiedGroups.push(nextGroup);\r\n // }\r\n\r\n this.f(items, index, length);\r\n return modifiedGroups;\r\n // }\r\n }\r\n\r\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\r\n const foundItem = this.getItemByBubble(bubble);\r\n if(foundItem) { // should happen only on edit\r\n // debugger;\r\n return;\r\n }\r\n\r\n const item = this.createItem(bubble, message);\r\n this.addItemToCache(item);\r\n }\r\n\r\n groupUngrouped() {\r\n const items = this.itemsArr;\r\n const length = items.length;\r\n const modifiedGroups: Set = new Set();\r\n // for(let i = length - 1; i >= 0; --i) {\r\n for(let i = 0; i < length; ++i) {\r\n const item = items[i];\r\n if(item.group) {\r\n continue;\r\n }\r\n\r\n let hadGroup = true;\r\n const siblings = this.getSiblingsAtIndex(i, items);\r\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\r\n\r\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\r\n const foundItem = siblingGroupedItem;\r\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\r\n\r\n modifiedGroups.add(group);\r\n group.insertItem(item);\r\n\r\n if(!hadGroup) {\r\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\r\n if(splittedGroups) {\r\n splittedGroups.forEach((group) => modifiedGroups.add(group));\r\n }\r\n }\r\n }\r\n\r\n return modifiedGroups;\r\n }\r\n\r\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\r\n // const oldItem = this.getItemByBubble(bubble);\r\n // if(unmountIfFound) { // updating position\r\n // this.removeAndUnmountBubble(bubble);\r\n // } else if(oldItem) { // editing\r\n // const group = oldItem.group;\r\n // this.changeItemBubble(oldItem, bubble);\r\n // oldItem.mounted = false;\r\n\r\n // return {item: oldItem, group};\r\n // }\r\n\r\n // const item = this.createItem(bubble, message);\r\n\r\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\r\n\r\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\r\n // this.addItemToGroup(item, group);\r\n\r\n // return {item, group};\r\n // }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach((object) => {\r\n if(object instanceof SVGDefsElement) return;\r\n\r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n\r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n\r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n\r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n\r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n\r\n // updateGroupByMessageId(mid: number) {\r\n // const item = this.itemsArr.find((g) => g.mid === mid);\r\n // if(item) {\r\n // item.group.updateGroup();\r\n // }\r\n // }\r\n\r\n cleanup() {\r\n this.itemsArr = [];\r\n this.groups = [];\r\n this.itemsMap.clear();\r\n }\r\n\r\n // findIncorrentPositions() {\r\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\r\n // var items = this.itemsArr;\r\n // for(var i = 0, length = items.length; i < length; ++i) {\r\n // const item = items[i];\r\n // const foundBubble = bubbles[i];\r\n // if(item.bubble !== foundBubble) {\r\n // console.log('incorrect position', i, item, foundBubble);\r\n // // debugger;\r\n // // break;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, {PopupOptions} from '.';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\r\nimport InputField from '../inputField';\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true,\r\n noTitle: true,\r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', {\r\n body: true,\r\n overlayClosable: true,\r\n buttons: options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }],\r\n title: true,\r\n ...options\r\n });\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n\r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n\r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n // const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n // this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n // cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n\r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey;\r\n const args: FormatterArguments = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n\r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n // const splitted = this.selectedDate.toString().split(' ', 3);\r\n // this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n // this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1));\r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {wrapSticker, wrapStickerAnimation} from '../wrappers';\nimport {Awaited} from '../../types';\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\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) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\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 availableReaction = this.managers.appReactionsManager.getReaction(reactionCount.reaction);\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 const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc: availableReaction.center_icon ?? availableReaction.static_icon,\n width: size,\n height: size,\n static: true,\n managers: this.managers\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\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.pFlags.chosen) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition(this, 'is-chosen', isChosen, this.isConnected ? 300 : 0);\n }\n }\n\n public fireAroundAnimation() {\n callbackify(this.managers.appReactionsManager.getReaction(this.reactionCount.reaction), (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 }).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 }).stickerPromise\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n fastRaf(() => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n });\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(remove, 1e3);\n });\n } else {\n remove();\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 {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\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\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\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(message: Message.message, type: ReactionLayoutType, isPlaceholder?: boolean) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\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.isPlaceholder);\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 availableReactionsResult instanceof Promise ?\n reactions.results :\n reactions.results.filter((reactionCount) => {\n return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n })\n ) : [];\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionCount.reaction === reaction);\n if(!found) {\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 && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n const reactionElementIdx = this.sorted.findIndex((reactionElement) => reactionElement.reactionCount.reaction === reactionCount.reaction);\n let reactionElement = reactionElementIdx !== -1 && this.sorted[reactionElementIdx];\n if(!reactionElement) {\n reactionElement = new ReactionElement();\n reactionElement.init(this.type);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => 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) => reactionElement.reactionCount.reaction === reactionCount.reaction);\n if(reactionElement) {\n reactionElement.fireAroundAnimation();\n }\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Message} from '../../layer';\r\nimport rootScope from '../../lib/rootScope';\r\nimport ripple from '../ripple';\r\nimport I18n from '../../lib/langPack';\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport StackedAvatars from '../stackedAvatars';\r\nimport formatNumber from '../../helpers/number/formatNumber';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\r\nimport type LazyLoadQueue from '../lazyLoadQueue';\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (message) => {\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueue;\r\n public stackedAvatars: StackedAvatars;\r\n public text: I18n.IntlElement;\r\n public managers: AppManagers;\r\n\r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n this.managers = rootScope.managers;\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!this.stackedAvatars) {\r\n this.stackedAvatars = new StackedAvatars({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n avatarSize: 30\r\n });\r\n\r\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\r\n }\r\n\r\n leftPart = this.stackedAvatars.container;\r\n\r\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.prepend(leftPart);\r\n }\r\n\r\n if(!this.text) {\r\n this.text = new I18n.IntlElement();\r\n }\r\n\r\n const text = this.text;\r\n if(replies) {\r\n if(replies.replies) {\r\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\r\n } else {\r\n text.compareAndUpdate({key: 'LeaveAComment'});\r\n }\r\n } else {\r\n text.compareAndUpdate({key: 'ViewInChat'});\r\n }\r\n\r\n if(replies) {\r\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n }/* else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n } */\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text.element);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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';\nimport Chat, {ChatType} from './chat';\nimport ReactionsElement from './reactions';\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, sponsoredSpan: HTMLElement, reactionsElement: ReactionsElement, 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(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 if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\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, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n // return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\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};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n start?: string\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 }\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\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};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, {addCancelButton} from '.';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\r\nimport {ChatInvite} from '../../layer';\r\nimport appImManager from '../../lib/appManagers/appImManager';\r\nimport {i18n, _i18n} from '../../lib/langPack';\r\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport AvatarElement from '../avatar';\r\nimport putPhoto from '../putPhoto';\r\nimport {toastNew} from '../toast';\r\nimport {wrapPhoto} from '../wrappers';\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(\r\n private hash: string,\r\n private chatInvite: ChatInvite.chatInvite\r\n ) {\r\n super('popup-join-chat-invite', {\r\n closable: true,\r\n overlayClosable: true,\r\n body: true,\r\n buttons: addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n this.managers.appChatsManager.importChatInvite(hash)\r\n .then((chatId) => {\r\n const peerId = chatId.toPeerId(true);\r\n appImManager.setInnerPeer({peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }])\r\n });\r\n\r\n this.construct();\r\n }\r\n\r\n private async construct() {\r\n this.header.remove();\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n\r\n const {chatInvite, managers, hash} = this;\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.classList.add('avatar-100');\r\n avatarElem.isDialog = false;\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\r\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n\r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n\r\n this.show();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 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 debugger;\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","/*\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 middlewarePromise(middleware: () => boolean, throwWhat: any = '') {\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","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 PopupElement from '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {TelegramWebviewEventCallback} 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 function createVerificationIframe(url: string, callback: TelegramWebviewEventCallback) {\n const iframe = document.createElement('iframe');\n // iframe.title = 'Complete Payment';\n iframe.allow = 'payment';\n // iframe.setAttribute('sandbox', 'allow-forms allow-scripts allow-same-origin allow-top-navigation allow-modals');\n iframe.setAttribute('sandbox', 'allow-forms allow-scripts allow-same-origin allow-modals');\n iframe.classList.add('payment-verification');\n iframe.src = url;\n\n iframe.addEventListener('load', () => {\n weakMap.set(iframe.contentWindow, callback);\n }, {once: true});\n\n return iframe;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n constructor(private url: string) {\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 iframe = createVerificationIframe(this.url, (event) => {\n if(event.eventType !== 'web_app_open_tg_link') {\n return;\n }\n\n this.dispatchEvent('finish');\n this.hide();\n appImManager.openUrl('https://t.me' + event.eventData.path_full);\n });\n\n this.body.append(iframe);\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 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 {TelegramWebviewEvent} from '../../types';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {SettingSection} from '../sidebarLeft';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\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 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 iframe = createVerificationIframe(paymentForm.url, (event) => {\n if(event.eventType !== 'payment_form_submit') {\n return;\n }\n\n const data = event.eventData;\n\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(iframe);\n this.show();\n }\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 const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\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 cardSection.content.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean));\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 noCheckboxSubtitle: true\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 '../sidebarLeft';\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 '../sidebarLeft';\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 noCheckboxSubtitle: true\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 {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport Button from '../button';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport {SettingSection} from '../sidebarLeft';\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 {wrapPhoto} from '../wrappers';\nimport wrapPeerTitle from '../wrappers/peerTitle';\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 ) {\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();\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 = mediaInvoice ? !!mediaInvoice.receipt_msg_id : paymentForm._ === 'payments.paymentReceipt';\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);\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;\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\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 noCheckboxSubtitle: true\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);\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {AppImManager, ChatSavedPosition} from '../../lib/appManagers/appImManager';\r\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\r\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport type Chat from './chat';\r\nimport {CHAT_ANIMATION_GROUP} from '../../lib/appManagers/appImManager';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport {logger} from '../../lib/logger';\r\nimport rootScope from '../../lib/rootScope';\r\nimport BubbleGroups from './bubbleGroups';\r\nimport PopupDatePicker from '../popups/datePicker';\r\nimport PopupForward from '../popups/forward';\r\nimport PopupStickers from '../popups/stickers';\r\nimport ProgressivePreloader from '../preloader';\r\nimport Scrollable, {SliceSides} from '../scrollable';\r\nimport StickyIntersector from '../stickyIntersector';\r\nimport animationIntersector from '../animationIntersector';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\r\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\r\nimport AvatarElement from '../avatar';\r\nimport ripple from '../ripple';\r\nimport {wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments} from '../wrappers';\r\nimport {MessageRender} from './messageRender';\r\nimport LazyLoadQueue from '../lazyLoadQueue';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport PollElement from '../poll';\r\nimport AudioElement from '../audio';\r\nimport {ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, User, WebPage} from '../../layer';\r\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\r\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\r\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\r\nimport deferredPromise from '../../helpers/cancellablePromise';\r\nimport RepliesElement from './replies';\r\nimport DEBUG from '../../config/debug';\r\nimport {SliceEnd} from '../../helpers/slicedArray';\r\nimport PeerTitle from '../peerTitle';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport {toast, toastNew} from '../toast';\r\nimport {getElementByPoint} from '../../helpers/dom/getElementByPoint';\r\nimport {getMiddleware} from '../../helpers/middleware';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\r\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\r\nimport reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport whichChild from '../../helpers/dom/whichChild';\r\nimport {cancelAnimationByKey} from '../../helpers/animation';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\r\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\r\nimport windowSize from '../../helpers/windowSize';\r\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\r\nimport AppMediaViewer from '../appMediaViewer';\r\nimport SetTransition from '../singleTransition';\r\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\r\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\r\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\r\nimport formatCallDuration from '../../helpers/formatCallDuration';\r\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\r\nimport Button from '../button';\r\nimport {CallType} from '../../lib/calls/types';\r\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\r\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\r\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\r\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\r\nimport type ReactionElement from './reaction';\r\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport ScrollSaver from '../../helpers/scrollSaver';\r\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\r\nimport forEachReverse from '../../helpers/array/forEachReverse';\r\nimport formatNumber from '../../helpers/number/formatNumber';\r\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\r\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\r\nimport generateFakeIcon from '../generateFakeIcon';\r\nimport copyFromElement from '../../helpers/dom/copyFromElement';\r\nimport PopupElement from '../popups';\r\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\r\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\r\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\r\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\r\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\r\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\r\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\r\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\r\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\r\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport {Awaited} from '../../types';\r\nimport idleController from '../../helpers/idleController';\r\nimport overlayCounter from '../../helpers/overlayCounter';\r\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\r\nimport contextMenuController from '../../helpers/contextMenuController';\r\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\r\nimport middlewarePromise from '../../helpers/middlewarePromise';\r\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport noop from '../../helpers/noop';\r\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\r\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\r\nimport PopupPayment from '../popups/payment';\r\nimport isInDOM from '../../helpers/dom/isInDOM';\r\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\r\nimport attachStickerViewerListeners from '../stickerViewer';\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nexport const SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\nexport const STICKY_OFFSET = 3;\r\nconst SCROLLED_DOWN_THRESHOLD = 300;\r\nconst PEER_CHANGED_ERROR = new Error('peer changed');\r\n\r\nconst DO_NOT_SLICE_VIEWPORT = false;\r\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\r\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\r\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\r\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\r\n\r\ntype Bubble = {\r\n bubble: HTMLElement,\r\n mids: Set,\r\n groupedId?: string\r\n};\r\n\r\ntype MyHistoryResult = HistoryResult | {history: number[]};\r\n\r\nfunction getMainMidForGrouped(mids: number[]) {\r\n return Math.max(...mids);\r\n}\r\n\r\nexport default class ChatBubbles {\r\n public container: HTMLDivElement;\r\n public chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n // public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\r\n public bubblesNew: {[mid: string]: Bubble} = {};\r\n private dateMessages: {[timestamp: number]: {\r\n div: HTMLElement,\r\n firstTimestamp: number,\r\n container: HTMLElement,\r\n timeout?: number\r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: ReturnType[] = [];\r\n // private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderBubble: HTMLElement;\r\n\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n\r\n private hoverBubble: HTMLElement;\r\n private hoverReaction: HTMLElement;\r\n private sliceViewportDebounced: DebounceReturnType;\r\n private resizeObserver: ResizeObserver;\r\n private willScrollOnLoad: boolean;\r\n private observer: SuperIntersectionObserver;\r\n\r\n private renderingMessages: Set = new Set();\r\n private setPeerCached: boolean;\r\n private attachPlaceholderOnRender: () => void;\r\n\r\n private bubblesToEject: Set = new Set();\r\n private bubblesToReplace: Map = new Map(); // TO -> FROM\r\n private updatePlaceholderPosition: () => void;\r\n private setPeerOptions: {lastMsgId: number; topMessage: number;};\r\n\r\n private setPeerTempId: number = 0;\r\n\r\n private renderNewPromises: Set> = new Set();\r\n\r\n // private reactions: Map;\r\n\r\n constructor(\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n this.log = this.chat.log;\r\n // this.chat.log.error('Bubbles construction');\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.constructBubbles();\r\n\r\n // * constructor end\r\n\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // this.reactions = new Map();\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\r\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\r\n return;\r\n }\r\n\r\n const {mid} = message;\r\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\r\n log && log('start');\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n if(this.renderNewPromises.size) {\r\n log && log.error('will await new messages render');\r\n await Promise.all(Array.from(this.renderNewPromises));\r\n }\r\n\r\n if(this.messagesQueuePromise) {\r\n log && log.error('messages render in process');\r\n await this.messagesQueuePromise;\r\n }\r\n\r\n if(this.bubbles[mid] !== bubble) return;\r\n\r\n // await getHeavyAnimationPromise();\r\n\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(!item) { // probably a group item\r\n log && log.error('no item by bubble', bubble);\r\n return;\r\n } else if(item.mid === mid) {\r\n log && log.warn('wow what', item, mid);\r\n return;\r\n }\r\n\r\n if(sequential) {\r\n const group = item.group;\r\n const newItem = this.bubbleGroups.createItem(bubble, message);\r\n // newItem.mid = item.mid;\r\n const _items = this.bubbleGroups.itemsArr.slice();\r\n indexOfAndSplice(_items, item);\r\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\r\n if(\r\n group === foundItem?.group ||\r\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\r\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\r\n ) {\r\n log && log('item has correct position', item);\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n }\r\n\r\n // return;\r\n\r\n // await fastRafPromise();\r\n // if(this.bubbles[mid] !== bubble) return;\r\n\r\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\r\n this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\r\n // log && log('group has collapsed', item);\r\n\r\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\r\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\r\n // const siblingGroup = siblingGroups[i];\r\n // const siblingItems = siblingGroup.items;\r\n // const nextGroup = siblingGroups[i + 1];\r\n // const nextItems = nextGroup.items;\r\n\r\n // let _break = false, moved = false;\r\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\r\n // const siblingItem = siblingItems[j];\r\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\r\n // if(!foundItem) {\r\n // _break = true;\r\n // break;\r\n // }\r\n\r\n // log('will move item', siblingItem, nextGroup);\r\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\r\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\r\n // moved = true;\r\n // }\r\n\r\n // if(moved) {\r\n // nextGroup.mount();\r\n // }\r\n\r\n // if(_break) {\r\n // break;\r\n // }\r\n // }\r\n // }\r\n\r\n const {groups} = this.groupBubbles([{bubble, message}]);\r\n this.bubbleGroups.mountUnmountGroups(groups);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n log && log('end');\r\n\r\n // this.bubbleGroups.findIncorrentPositions();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\r\n const {storageKey, tempId, tempMessage, mid, message} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.messagesStorageKey !== storageKey) {\r\n return;\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n const _bubble = bubbles[tempId];\r\n if(_bubble) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n bubble.dataset.mid = '' + mid;\r\n delete bubbles[tempId];\r\n\r\n fastRaf(() => {\r\n const mid = +bubble.dataset.mid;\r\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\r\n bubble.classList.remove('is-sending', 'is-outgoing');\r\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n\r\n if(!_bubble) {\r\n return;\r\n }\r\n\r\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\r\n const mids = messages.map(({mid}) => mid);\r\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\r\n return;\r\n }\r\n\r\n if(bubbles[mid] !== _bubble) {\r\n return;\r\n }\r\n\r\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\r\n } else {\r\n messages = [message];\r\n tempIds = [tempId];\r\n }\r\n\r\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\r\n if(reactionsElements.length) {\r\n reactionsElements.forEach((reactionsElement) => {\r\n reactionsElement.changeMessage(message as Message.message);\r\n });\r\n }\r\n\r\n (messages as Message.message[]).forEach((message, idx) => {\r\n if(!message) {\r\n return;\r\n }\r\n\r\n const tempId = tempIds[idx];\r\n const mid = message.mid;\r\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\r\n\r\n if(message._ !== 'message') {\r\n return;\r\n }\r\n\r\n if(message.replies) {\r\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\r\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\r\n const poll = (media as MessageMedia.messageMediaPoll).poll;\r\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\r\n if(doc) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\r\n getHeavyAnimationPromise().then(async() => {\r\n const timeSpan = div.querySelector('.time');\r\n const newDiv = await wrapDocument({message});\r\n div.replaceWith(newDiv);\r\n\r\n if(timeSpan) {\r\n newDiv.querySelector('.document').append(timeSpan);\r\n }\r\n });\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = '' + doc.id;\r\n (element as any).doc = doc;\r\n }\r\n }\r\n } else if(poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', '' + poll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n } else if(webPage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, bubble);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(groupedId) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n const bubble = this.bubbles[message.mid];\r\n if(!bubble) return;\r\n\r\n await getHeavyAnimationPromise();\r\n if(this.bubbles[message.mid] !== bubble) return;\r\n\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n const mids = messages.map(({mid}) => mid);\r\n const oldMids = mids.concat(Array.from(deletedMids));\r\n const wasMainMid = getMainMidForGrouped(oldMids);\r\n const bubble = this.bubbles[wasMainMid];\r\n if(!bubble) {\r\n return;\r\n }\r\n\r\n const mainMid = getMainMidForGrouped(mids);\r\n const message = messages.find((message) => message.mid === mainMid);\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\r\n if(peerId.isUser()) {\r\n const middleware = this.getMiddleware();\r\n const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\r\n if(!middleware()) return;\r\n\r\n const isPremium = user?.pFlags?.premium;\r\n const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\r\n groups.forEach((group) => {\r\n group.avatar.classList.toggle('is-premium', isPremium);\r\n group.avatar.classList.toggle('tgico-star', isPremium);\r\n });\r\n }\r\n });\r\n\r\n if(this.chat.type !== 'scheduled' && !DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\r\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\r\n let scrollSaver: ScrollSaver;\r\n\r\n const a = arr.map(async({message, changedResults}) => {\r\n if(this.peerId !== message.peerId) {\r\n return;\r\n }\r\n\r\n const result = await this.getMountedBubble(message.mid, message);\r\n if(!result) {\r\n return;\r\n }\r\n\r\n return {bubble: result.bubble, message, changedResults};\r\n });\r\n\r\n let top: number;\r\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\r\n if(!scrollSaver) {\r\n scrollSaver = this.createScrollSaver(false);\r\n scrollSaver.save();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n const set = REACTIONS_ELEMENTS.get(key);\r\n if(set) {\r\n for(const element of set) {\r\n element.update(message, changedResults);\r\n }\r\n } else if(!message.reactions || !message.reactions.results.length) {\r\n return;\r\n } else {\r\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\r\n }\r\n });\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n }\r\n\r\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n await getHeavyAnimationPromise();\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach((mid) => {\r\n const needUpdate = this.needUpdate;\r\n const filtered: typeof needUpdate[0][] = [];\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n this.needUpdate.splice(idx, 1)[0];\r\n filtered.push(obj);\r\n }\r\n });\r\n\r\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n });\r\n });\r\n });\r\n\r\n attachStickerViewerListeners({listenTo: this.scrollable.container, listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\r\n if(e.button !== 0) return;\r\n\r\n const code: HTMLElement = findUpTag(e.target, 'CODE');\r\n if(code) {\r\n cancelEvent(e);\r\n copyFromElement(code);\r\n toastNew({langPackKey: 'TextCopied'});\r\n return;\r\n }\r\n });\r\n\r\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n const dateBubble = dateMessage.div;\r\n\r\n // dateMessage.container.classList.add('has-sticky-dates');\r\n\r\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\r\n // if(this.previousStickyDate) {\r\n // dateBubble.classList.add('kek');\r\n // }\r\n\r\n dateBubble.classList.toggle('is-sticky', stuck);\r\n if(stuck) {\r\n this.previousStickyDate = dateBubble;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(this.previousStickyDate) {\r\n // fastRaf(() => {\r\n // this.bubblesContainer.classList.add('has-sticky-dates');\r\n // });\r\n }\r\n });\r\n\r\n if(!IS_SAFARI) {\r\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\r\n }\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced.clearTimeout();\r\n // }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n\r\n // if(this.sliceViewportDebounced) {\r\n // this.sliceViewportDebounced();\r\n // }\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n private constructBubbles() {\r\n const container = this.container = document.createElement('div');\r\n container.classList.add('bubbles', 'scrolled-down');\r\n\r\n const chatInner = this.chatInner = document.createElement('div');\r\n chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n container.append(this.scrollable.container);\r\n }\r\n\r\n public attachContainerListeners() {\r\n const container = this.container;\r\n\r\n this.chat.contextMenu.attachTo(container);\r\n this.chat.selection.attachListeners(container, new ListenerSetter());\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(container)('dblclick', async(e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', await this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(this.chat.type !== 'pinned' && this.chat.type !== 'scheduled') {\r\n if(!IS_MOBILE) {\r\n this.listenerSetter.add(container)('dblclick', async(e) => {\r\n if(this.chat.selection.isSelecting ||\r\n !(await this.chat.canSend())) {\r\n return;\r\n }\r\n\r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ?\r\n target :\r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = await this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n\r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n } else if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: container,\r\n verifyTouchTarget: async(e) => {\r\n if(this.chat.selection.isSelecting || !(await this.chat.canSend())) {\r\n return false;\r\n }\r\n\r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n\r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n\r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n\r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n\r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n\r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n\r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n\r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n }\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\r\n if(storageKey !== this.chat.messagesStorageKey) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessage(message, true);\r\n }\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n const gradientRenderer = this.chat.gradientRenderer;\r\n if(gradientRenderer) {\r\n gradientRenderer.toNextPosition();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\r\n if(this.peerId !== message.peerId) return;\r\n this.renderNewMessage(message);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.updateUnreadByDialog();\r\n });\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs.has(this.peerId)) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = await this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n const callbacks = await Promise.all([\r\n this.finishPeerChange(),\r\n this.chat.input.finishPeerChange()\r\n ]);\r\n\r\n callbacks.forEach((callback) => callback());\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\r\n if(key === 'settings.emoji.big') {\r\n const middleware = this.getMiddleware();\r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n const m = mids.map(async(mid) => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n return {bubble, message: await this.chat.getMessage(mid)};\r\n }\r\n });\r\n\r\n const awaited = await Promise.all(m);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n awaited.filter(Boolean).forEach(({bubble, message}) => {\r\n if(this.bubbles[message.mid] !== bubble) {\r\n return;\r\n }\r\n\r\n this.safeRenderMessage(message, true, bubble);\r\n });\r\n }\r\n });\r\n\r\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\r\n fastRaf(() => {\r\n let scrollSaver: ScrollSaver;\r\n for(const {peerId, views, mid} of arr) {\r\n if(this.peerId !== peerId) continue;\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) continue;\r\n\r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(!postViewsElements.length) continue;\r\n\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach((postViews) => {\r\n if(different || postViews.textContent !== str) {\r\n if(!scrollSaver) {\r\n scrollSaver = this.createScrollSaver(true);\r\n scrollSaver.save();\r\n }\r\n\r\n different = true;\r\n postViews.textContent = str;\r\n }\r\n });\r\n }\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n }\r\n });\r\n });\r\n\r\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\r\n\r\n this.listenerSetter.add(this.chat.appImManager)('chat_changing', ({to}) => {\r\n const freeze = to !== this.chat;\r\n\r\n const cb = () => {\r\n this.observer.toggleObservingNew(freeze);\r\n };\r\n\r\n if(!freeze) {\r\n setTimeout(() => {\r\n cb();\r\n }, 400);\r\n } else {\r\n cb();\r\n }\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n }\r\n\r\n private get peerId() {\r\n return this.chat.peerId;\r\n }\r\n\r\n private createScrollSaver(reverse = true) {\r\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\r\n return scrollSaver;\r\n }\r\n\r\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n };\r\n\r\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), sponsoredMessage.random_id);\r\n }\r\n }\r\n }\r\n };\r\n\r\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\r\n if(entry.isIntersecting) {\r\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\r\n\r\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\r\n getHeavyAnimationPromise().then(() => {\r\n if(isInDOM(attachmentDiv)) {\r\n simulateClickEvent(attachmentDiv);\r\n }\r\n });\r\n }\r\n };\r\n\r\n private createResizeObserver() {\r\n if(!('ResizeObserver' in window) || this.resizeObserver) {\r\n return;\r\n }\r\n\r\n const container = this.scrollable.container;\r\n let wasHeight = 0/* container.offsetHeight */;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n // let skipNext = true;\r\n\r\n const onResizeEnd = () => {\r\n const height = container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n // this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries: ResizeObserverCallback = (entries) => {\r\n /* if(skipNext) {\r\n skipNext = false;\r\n return;\r\n } */\r\n\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n\r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n\r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n // if(isSafari) { // * fix opening keyboard while ESG is active\r\n part = -realDiff;\r\n // }\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.setScrollTopSilently(needScrollTop);\r\n }\r\n\r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(container);\r\n }\r\n\r\n private destroyResizeObserver() {\r\n const resizeObserver = this.resizeObserver;\r\n if(!resizeObserver) {\r\n return;\r\n }\r\n\r\n resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n private onBubblesMouseMove = async(e: MouseEvent) => {\r\n const content = findUpClassName(e.target, 'bubble-content');\r\n if(content && !this.chat.selection.isSelecting) {\r\n const bubble = findUpClassName(content, 'bubble');\r\n if(!this.chat.selection.canSelectBubble(bubble)) {\r\n this.unhoverPrevious();\r\n return;\r\n }\r\n\r\n let {hoverBubble, hoverReaction} = this;\r\n if(bubble === hoverBubble) {\r\n return;\r\n }\r\n\r\n this.unhoverPrevious();\r\n\r\n hoverBubble = this.hoverBubble = bubble;\r\n hoverReaction = this.hoverReaction;\r\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\r\n if(!hoverReaction) {\r\n hoverReaction = this.hoverReaction = document.createElement('div');\r\n hoverReaction.classList.add('bubble-hover-reaction');\r\n\r\n const stickerWrapper = document.createElement('div');\r\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\r\n hoverReaction.append(stickerWrapper);\r\n\r\n content.append(hoverReaction);\r\n\r\n let message = (await this.chat.getMessage(+bubble.dataset.mid)) as Message.message;\r\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\r\n\r\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\r\n Promise.all([\r\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\r\n pause(400)\r\n ]).then(([availableReactions]) => {\r\n const availableReaction = availableReactions[0];\r\n if(!availableReaction) {\r\n hoverReaction.remove();\r\n return;\r\n }\r\n\r\n wrapSticker({\r\n div: stickerWrapper,\r\n doc: availableReaction.select_animation,\r\n width: 18,\r\n height: 18,\r\n needUpscale: true,\r\n middleware,\r\n group: CHAT_ANIMATION_GROUP,\r\n withThumb: false,\r\n needFadeIn: false\r\n }).then(({render}) => render).then((player) => {\r\n assumeType(player);\r\n\r\n player.addEventListener('firstFrame', () => {\r\n if(!middleware()) {\r\n // debugger;\r\n return;\r\n }\r\n\r\n hoverReaction.dataset.loaded = '1';\r\n this.setHoverVisible(hoverReaction, true);\r\n }, {once: true});\r\n\r\n attachClickEvent(hoverReaction, (e) => {\r\n cancelEvent(e); // cancel triggering selection\r\n\r\n this.managers.appReactionsManager.sendReaction(message, availableReaction.reaction);\r\n this.unhoverPrevious();\r\n }, {listenerSetter: this.listenerSetter});\r\n }, noop);\r\n });\r\n } else if(hoverReaction.dataset.loaded) {\r\n this.setHoverVisible(hoverReaction, true);\r\n }\r\n } else {\r\n this.unhoverPrevious();\r\n }\r\n };\r\n\r\n public setReactionsHoverListeners() {\r\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\r\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\r\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\r\n }\r\n\r\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\r\n SetTransition(hoverReaction, 'is-visible', visible, 200, visible ? undefined : () => {\r\n hoverReaction.remove();\r\n }, 2);\r\n }\r\n\r\n private unhoverPrevious = () => {\r\n const {hoverBubble, hoverReaction} = this;\r\n if(hoverBubble) {\r\n this.setHoverVisible(hoverReaction, false);\r\n this.hoverBubble = undefined;\r\n this.hoverReaction = undefined;\r\n }\r\n };\r\n\r\n public setStickyDateManually() {\r\n return;\r\n\r\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.observer.unobserve(target, this.unreadedObserverCallback);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = idleController.getFocusPromise().then(async() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = await this.chat.getMessage(mid);\r\n if(isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n\r\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = async() => {\r\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\r\n if(message.peerId !== this.peerId) return;\r\n\r\n this.renderNewMessage(message);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = async(e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n\r\n if(!bubble && !this.chat.selection.isSelecting) {\r\n const avatar = findUpClassName(target, 'user-avatar');\r\n if(!avatar) {\r\n return;\r\n }\r\n\r\n const peerId = avatar.dataset.peerId.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n return;\r\n }\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n // console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n // this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\r\n if(buyButton) {\r\n cancelEvent(e);\r\n\r\n const message = await this.chat.getMessage(+bubble.dataset.mid);\r\n if(!message) {\r\n return;\r\n }\r\n\r\n new PopupPayment(\r\n message as Message.message,\r\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\r\n );\r\n return;\r\n }\r\n\r\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\r\n if(reactionElement) {\r\n cancelEvent(e);\r\n if(reactionElement.classList.contains('is-inactive')) {\r\n return;\r\n }\r\n\r\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\r\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\r\n\r\n const message = reactionsElement.getMessage();\r\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message1 = await this.chat.getMessage(bubbleMid);\r\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\r\n const replies = message.replies;\r\n if(replies) {\r\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion',\r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n\r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n if(target.classList.contains('is-receipt-link')) {\r\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\r\n if(message) {\r\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\r\n new PopupPayment(message as Message.message, inputInvoice);\r\n }\r\n } else {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(),\r\n lastMsgId: +mid\r\n });\r\n }\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = await this.chat.getMessage(messageId);\r\n\r\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\r\n target.classList.contains('album-item') ||\r\n // || isVideoComponentElement\r\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\r\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\r\n target.classList.contains('canvas-thumbnail')) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\r\n if(preloader) {\r\n simulateClickEvent(preloader);\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = await this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\r\n\r\n const message = await this.chat.getMessage(mid);\r\n const media = getMediaFromMessage(message);\r\n\r\n return media && f(media) && mid;\r\n }))).filter(Boolean).sort((a, b) => a - b);\r\n\r\n ids.forEach((id) => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n const albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n const idx = targets.findIndex((t) => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n\r\n // appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n\r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n\r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n // //this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(),\r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\r\n });\r\n // appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n\r\n let isReplyClick = false;\r\n\r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n\r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId,\r\n lastMsgId: replyToMid,\r\n type: this.chat.type,\r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n // this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n\r\n // console.log('chatInner click', e);\r\n };\r\n\r\n public async onGoDownClick() {\r\n if(!this.replyFollowHistory.length) {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n\r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n\r\n return;\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const slice = this.replyFollowHistory.slice();\r\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\r\n if(!middleware()) return;\r\n\r\n slice.forEach((mid, idx) => {\r\n const message = messages[idx];\r\n\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else if(message) {\r\n bad = false;\r\n }\r\n\r\n if(bad) {\r\n this.replyFollowHistory.splice(this.replyFollowHistory.indexOf(mid), 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public async getGroupedBubble(groupId: string) {\r\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of mids) {\r\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\r\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid],\r\n mid: mid\r\n // message: await this.chat.getMessage(maxId) as Message.message\r\n };\r\n }\r\n }\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\r\n if(message === undefined) {\r\n message = await this.chat.getMessage(mid);\r\n }\r\n\r\n if(!message) {\r\n return;\r\n }\r\n\r\n const groupedId = (message as Message.message).grouped_id;\r\n if(groupedId) {\r\n const a = await this.getGroupedBubble(groupedId);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\r\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\r\n\r\n let filterCallback: (_mid: number) => boolean;\r\n if(prev) filterCallback = (_mid) => _mid < mid;\r\n else filterCallback = (_mid) => mid < _mid;\r\n\r\n const foundMid = mids.find((_mid) => {\r\n if(!filterCallback(_mid)) return false;\r\n return !!this.bubbles[_mid]?.parentElement;\r\n });\r\n\r\n return this.bubbles[foundMid];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n // this.log('loadMoreHistory', top);\r\n if(\r\n !this.peerId ||\r\n /* TEST_SCROLL || */\r\n this.chat.setPeerPromise ||\r\n this.isHeavyAnimationInProgress ||\r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n // some messages can have negative id (such as sponsored message)\r\n const history = Object.keys(this.bubbles)\r\n .map((id) => +id)\r\n .filter((id) => id > 0 && !this.skippedMids.has(id))\r\n .sort((a, b) => a - b);\r\n if(!history.length) return;\r\n\r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n // const historyMaxId = await this.chat.getHistoryMaxId();\r\n\r\n // // if scroll down after search\r\n // if(history.indexOf(historyMaxId) !== -1) {\r\n // this.setLoaded('bottom', true);\r\n // return;\r\n // }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions) => {\r\n // return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.sliceViewportDebounced) {\r\n this.sliceViewportDebounced.clearTimeout();\r\n }\r\n\r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.scrolledDown && !ignoreHeavyAnimation) {\r\n return;\r\n }\r\n } else {\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\r\n }\r\n\r\n if(this.sliceViewportDebounced) {\r\n this.sliceViewportDebounced();\r\n }\r\n\r\n this.setStickyDateManually();\r\n }\r\n\r\n // lottieLoader.checkAnimations(false, 'chat');\r\n\r\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\r\n return;\r\n }\r\n\r\n const distanceToEnd = scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\r\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions) {\r\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350 + (scrollDimensions?.duration ?? 0));\r\n }\r\n\r\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.container.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.container.classList.contains('scrolled-down')) {\r\n this.container.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n };\r\n\r\n public setScroll() {\r\n if(this.scrollable) {\r\n this.destroyScrollable();\r\n }\r\n\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false, false);\r\n this.setLoaded('bottom', false, false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300;\r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n // this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED && false) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public async updateUnreadByDialog() {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n\r\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n\r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n this.unreadOut.delete(msgId);\r\n\r\n if(bubble.classList.contains('is-outgoing')) {\r\n continue;\r\n }\r\n\r\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)\r\n bubble.classList.add('is-read');\r\n }\r\n }\r\n }\r\n }\r\n\r\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\r\n let deleted = false;\r\n mids.forEach((mid) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n deleted = true;\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n if(this.observer) {\r\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\r\n this.unreaded.delete(bubble);\r\n\r\n this.observer.unobserve(bubble, this.viewsObserverCallback);\r\n this.viewsMids.delete(mid);\r\n\r\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\r\n }\r\n\r\n if(this.emptyPlaceholderBubble === bubble) {\r\n this.emptyPlaceholderBubble = undefined;\r\n }\r\n\r\n // this.reactions.delete(mid);\r\n });\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.scrollable.ignoreNextScrollEvent();\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n\r\n if(!ignoreOnScroll) {\r\n this.scrollable.onScroll();\r\n // this.onScroll();\r\n }\r\n }\r\n\r\n private setTopPadding(middleware = this.getMiddleware()) {\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.setScrollTopSilently(scrollHeight);\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n return {\r\n isPaddingNeeded,\r\n unsetPadding: isPaddingNeeded ? () => {\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n } : undefined\r\n };\r\n }\r\n\r\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\r\n const promise = this._renderNewMessage(message, scrolledDown);\r\n this.renderNewPromises.add(promise);\r\n promise.catch(noop).finally(() => {\r\n this.renderNewPromises.delete(promise);\r\n });\r\n return promise;\r\n }\r\n\r\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n // this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise) {\r\n const middleware = this.getMiddleware();\r\n setPeerPromise.then(async() => {\r\n if(!middleware()) return;\r\n const newMessage = await this.chat.getMessage(message.mid);\r\n if(!middleware()) return;\r\n this.renderNewMessage(newMessage);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n const replyTo = message?.reply_to as MessageReplyHeader;\r\n if(!(replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId)) {\r\n return;\r\n }\r\n }\r\n\r\n if(this.bubbles[message.mid]) {\r\n return;\r\n }\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble ||\r\n this.scrollingToBubble === this.getLastBubble() ||\r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\r\n\r\n const promise = this.performHistoryResult({history: [message]}, false);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n // const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[message.mid];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n // it will be called only once even if was set multiple times (that won't happen)\r\n promise.then(unsetPadding);\r\n }\r\n\r\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public getLastBubble() {\r\n const group = this.bubbleGroups.getLastGroup();\r\n return group?.lastItem?.bubble;\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n if(!element.parentElement) {\r\n this.log.error('element is not connected', bubble);\r\n }\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end') {\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\r\n const dateGroup = item.group.container.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n const margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n const promise = this.scrollable.scrollIntoViewNew({\r\n element,\r\n position,\r\n margin,\r\n forceDirection,\r\n forceDuration,\r\n axis: 'y',\r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.container.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering,\r\n startCallback: (dimensions) => {\r\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\r\n this.onScroll(true, dimensions);\r\n }\r\n });\r\n\r\n // fix flickering date when opening unread chat and focusing message\r\n if(forceDirection === FocusDirection.Static) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n // private getLastDateGroup() {\r\n // let lastTime = 0, lastElem: HTMLElement;\r\n // for(const i in this.dateMessages) {\r\n // const dateMessage = this.dateMessages[i];\r\n // if(dateMessage.firstTimestamp > lastTime) {\r\n // lastElem = dateMessage.container;\r\n // lastTime = dateMessage.firstTimestamp;\r\n // }\r\n // }\r\n\r\n // return lastElem;\r\n // }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\r\n let dateElement: HTMLElement;\r\n\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n\r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n\r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n\r\n return bubble;\r\n }\r\n\r\n public getDateForDateContainer(timestamp: number) {\r\n const date = new Date(timestamp * 1000);\r\n date.setHours(0, 0, 0);\r\n return {date, dateTimestamp: date.getTime()};\r\n }\r\n\r\n public getDateContainerByTimestamp(timestamp: number) {\r\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\r\n if(!this.dateMessages[dateTimestamp]) {\r\n const bubble = this.createDateBubble(timestamp, date);\r\n // bubble.classList.add('is-sticky');\r\n const fakeBubble = this.createDateBubble(timestamp, date);\r\n fakeBubble.classList.add('is-fake');\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble, fakeBubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n const length = haveTimestamps.length;\r\n let i = 0, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n\r\n if(this.chatInner.parentElement) {\r\n this.container.classList.add('has-groups');\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n private destroyScrollable() {\r\n this.scrollable.destroy();\r\n }\r\n\r\n public destroy() {\r\n // this.chat.log.error('Bubbles destroying');\r\n\r\n this.destroyScrollable();\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.observer && this.observer.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.observer && delete this.observer;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n // //console.time('appImManager cleanup');\r\n this.setLoaded('top', false, false);\r\n this.setLoaded('bottom', false, false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n this.renderNewPromises.clear();\r\n\r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n this.chatInner.textContent = '';\r\n this.cleanupPlaceholders();\r\n }\r\n\r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n\r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n\r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n\r\n if(this.observer) {\r\n this.observer.disconnect();\r\n\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n\r\n this.viewsMids.clear();\r\n }\r\n\r\n this.middleware.clean();\r\n\r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.attachPlaceholderOnRender = undefined;\r\n this.emptyPlaceholderBubble = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n // //console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n this.renderingMessages.clear();\r\n this.bubblesToEject.clear();\r\n this.bubblesToReplace.clear();\r\n\r\n // this.reactions.clear();\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n\r\n this.container.classList.remove('has-sticky-dates');\r\n this.scrollable.cancelMeasure();\r\n }\r\n\r\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\r\n if(bubble) {\r\n bubble.remove();\r\n\r\n if(this.emptyPlaceholderBubble === bubble) {\r\n this.emptyPlaceholderBubble = undefined;\r\n }\r\n }\r\n }\r\n\r\n public async setPeer(samePeer: boolean, peerId: PeerId, lastMsgId?: number, startParam?: string): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\r\n const tempId = ++this.setPeerTempId;\r\n\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.preloader.detach();\r\n return null;\r\n }\r\n\r\n const perf = performance.now();\r\n const log = this.log.bindPrefix('setPeer');\r\n log.warn('start');\r\n\r\n const middleware = () => {\r\n return this.setPeerTempId === tempId;\r\n };\r\n\r\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\r\n\r\n if(!samePeer) {\r\n await m(this.chat.onChangePeer(m));\r\n }\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled' || this.chat.isRestricted) {\r\n lastMsgId = 0;\r\n }\r\n\r\n const historyStorage = await m(this.chat.getHistoryStorage());\r\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId)) : historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let followingUnread: boolean;\r\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n\r\n } else if(topMessage) {\r\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\r\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\r\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\r\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\r\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\r\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\r\n }\r\n\r\n followingUnread = !isTarget;\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n // lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\r\n\r\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\r\n startParam = BOT_START_PARAM;\r\n }\r\n\r\n if(samePeer) {\r\n const mounted = await m(this.getMountedBubble(lastMsgId));\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\r\n this.scrollToEnd();\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n\r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || await m(this.managers.appUsersManager.isBot(peerId))\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n this.destroyResizeObserver();\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\r\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\r\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const scrollFromDown = !fromUp && samePeer;\r\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\r\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\r\n\r\n this.setPeerOptions = {\r\n lastMsgId,\r\n topMessage\r\n };\r\n\r\n let result: Awaited>;\r\n if(!savedPosition) {\r\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult({history: savedPosition.mids}, true);\r\n }) as any,\r\n cached: true,\r\n waitPromise: Promise.resolve()\r\n };\r\n }\r\n\r\n this.setPeerCached = result.cached;\r\n\r\n log.warn('got history');// warning\r\n\r\n const {promise, cached} = result;\r\n\r\n if(!cached && !samePeer) {\r\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\r\n this.scrollable.container.textContent = '';\r\n // oldContainer.textContent = '';\r\n // oldChatInner.remove();\r\n this.preloader.attach(this.container);\r\n }\r\n\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n\r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = m(promise).then(async() => {\r\n log.warn('promise fulfilled');\r\n\r\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\r\n if(cached && !samePeer) {\r\n log.warn('finishing peer change');\r\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\r\n log.warn('finished peer change');\r\n }\r\n\r\n this.preloader.detach();\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n this.setPeerCached = undefined;\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n const scrollable = this.scrollable;\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollPosition = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\r\n\r\n if(oldPlaceholderBubble) {\r\n this.cleanupPlaceholders(oldPlaceholderBubble);\r\n }\r\n\r\n if(this.attachPlaceholderOnRender) {\r\n this.attachPlaceholderOnRender();\r\n }\r\n\r\n if(!isTarget && this.chat.type === 'chat' && this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(0);\r\n }\r\n\r\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\r\n\r\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n // fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n // });\r\n\r\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.setScrollTopSilently(savedPosition.top);\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if(haveToScrollToBubble) {\r\n let unsetPadding: () => void;\r\n if(scrollFromDown) {\r\n scrollable.setScrollTopSilently(99999);\r\n } else if(scrollFromUp) {\r\n const set = this.setTopPadding();\r\n if(set.isPaddingNeeded) {\r\n unsetPadding = set.unsetPadding;\r\n }\r\n\r\n scrollable.setScrollTopSilently(0);\r\n }\r\n\r\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\r\n }\r\n\r\n let promise: Promise;\r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n const lastBubble = this.getLastBubble();\r\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\r\n\r\n if(position === 'end' && lastBubble === bubble && samePeer) {\r\n promise = this.scrollToEnd();\r\n } else {\r\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\r\n }\r\n\r\n if(!followingUnread && isTarget) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n\r\n if(unsetPadding) {\r\n (promise || Promise.resolve()).then(() => {\r\n unsetPadding();\r\n });\r\n }\r\n } else {\r\n scrollable.setScrollTopSilently(99999);\r\n }\r\n\r\n // if(!cached) {\r\n this.onRenderScrollSet();\r\n // }\r\n\r\n this.onScroll();\r\n\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n\r\n // if(cached) {\r\n // this.onRenderScrollSet();\r\n // }\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n Promise.all([\r\n this.setFetchReactionsInterval(afterSetPromise),\r\n this.setFetchHistoryInterval({\r\n afterSetPromise,\r\n lastMsgId,\r\n samePeer,\r\n savedPosition,\r\n topMessage\r\n })\r\n ]).then(() => {\r\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n // if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n });\r\n\r\n if(chatType === 'chat') {\r\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\r\n if(dialog?.pFlags.unread_mark) {\r\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n }).catch((err) => {\r\n log.error('getHistory promise error:', err);\r\n if(!middleware()) {\r\n this.preloader.detach();\r\n }\r\n\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\r\n const middleware = this.getMiddleware();\r\n const needReactionsInterval = await this.managers.appPeersManager.isChannel(this.peerId);\r\n if(needReactionsInterval) {\r\n const fetchReactions = async() => {\r\n if(!middleware()) return;\r\n\r\n const mids: number[] = [];\r\n for(const mid in this.bubbles) {\r\n let message = await this.chat.getMessage(+mid);\r\n if(message?._ !== 'message') {\r\n continue;\r\n }\r\n\r\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\r\n mids.push(message.mid);\r\n }\r\n\r\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\r\n promise.then(() => {\r\n setTimeout(fetchReactions, 10e3);\r\n });\r\n };\r\n\r\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\r\n fetchReactions();\r\n });\r\n }\r\n }\r\n\r\n private async setFetchHistoryInterval({\r\n lastMsgId,\r\n topMessage,\r\n afterSetPromise,\r\n savedPosition,\r\n samePeer\r\n }: {\r\n lastMsgId: number,\r\n topMessage: number,\r\n afterSetPromise: Promise,\r\n savedPosition: ChatSavedPosition,\r\n samePeer: boolean\r\n }) {\r\n const middleware = this.getMiddleware();\r\n const peerId = this.peerId;\r\n\r\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n return;\r\n }\r\n\r\n await afterSetPromise;\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.setLoaded('bottom', false);\r\n this.scrollable.checkForTriggers();\r\n\r\n if(!needFetchInterval) {\r\n return;\r\n }\r\n\r\n const f = () => {\r\n this.fetchNewPromise = new Promise(async(resolve) => {\r\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\r\n resolve();\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\r\n if(!middleware() || !result) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const {isBottomEnd} = result;\r\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n\r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n\r\n public async onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const historyMaxId = await this.chat.getHistoryMaxId();\r\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public async finishPeerChange() {\r\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\r\n this.managers.appPeersManager.isChannel(this.peerId),\r\n this.chat.canSend(),\r\n this.chat.isAnyGroup\r\n ]);\r\n\r\n return () => {\r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n\r\n this.createResizeObserver();\r\n };\r\n }\r\n\r\n public renderMessagesQueue(options: ChatBubbles['messagesQueue'][0]) {\r\n this.messagesQueue.push(options);\r\n return this.setMessagesQueuePromise();\r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(!this.messagesQueue.length) return Promise.resolve();\r\n\r\n if(this.messagesQueuePromise) {\r\n return this.messagesQueuePromise;\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n const log = this.log.bindPrefix('queue');\r\n const possibleError = PEER_CHANGED_ERROR;\r\n const m = middlewarePromise(middleware, possibleError);\r\n\r\n const processQueue = async(): Promise => {\r\n log('start');\r\n\r\n // if(!this.chat.setPeerPromise) {\r\n // await pause(10000000);\r\n // }\r\n\r\n const renderQueue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const renderQueuePromises = renderQueue.map((promise) => {\r\n const perf = performance.now();\r\n promise.then((details) => {\r\n log('render message time', performance.now() - perf, details);\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n let loadQueue = await m(Promise.all(renderQueuePromises));\r\n const filterQueue = (queue: typeof loadQueue) => {\r\n return queue.filter((details) => {\r\n // message can be deleted during rendering\r\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\r\n });\r\n };\r\n\r\n loadQueue = filterQueue(loadQueue);\r\n\r\n log('messages rendered');\r\n\r\n const reverse = loadQueue[0]?.reverse;\r\n\r\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\r\n\r\n // if(groups.length > 2 && loadQueue.length === 1) {\r\n // debugger;\r\n // }\r\n\r\n const promises = loadQueue.reduce((acc, details) => {\r\n const perf = performance.now();\r\n\r\n const promises = details.promises.slice();\r\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\r\n Promise.all(timePromises).then((times) => {\r\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\r\n times.forEach((time, idx) => {\r\n log('media message time', time, idx, promises[idx]);\r\n });\r\n log.groupEnd();\r\n });\r\n\r\n // if(details.updatePosition) {\r\n // if(res) {\r\n // groups.add(res.group);\r\n // if(details.needAvatar) {\r\n // details.promises.push(res.group.createAvatar(details.message));\r\n // }\r\n // }\r\n // }\r\n\r\n acc.push(...details.promises);\r\n return acc;\r\n }, [] as Promise[]);\r\n\r\n promises.push(...avatarPromises);\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\r\n await m(Promise.all([...promises, this.setUnreadDelimiter()])); // не нашёл места лучше\r\n await m(fastRafPromise()); // have to be the last\r\n log('media promises end');\r\n\r\n loadQueue = filterQueue(loadQueue);\r\n\r\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\r\n // if(this.messagesQueueOnRender) {\r\n // this.messagesQueueOnRender();\r\n // }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n this.ejectBubbles();\r\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\r\n if(scrollSaver) {\r\n scrollSaver.replaceSaved(oldBubble, bubble);\r\n }\r\n\r\n if(!loadQueue.find((details) => details.bubble === bubble)) {\r\n continue;\r\n }\r\n\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n item.mounted = false;\r\n if(!groups.includes(item.group)) {\r\n groups.push(item.group);\r\n }\r\n\r\n this.bubblesToReplace.delete(bubble);\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n loadQueue.forEach(({bubble}) => {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n });\r\n }\r\n\r\n loadQueue.forEach(({message, bubble, updatePosition}) => {\r\n if(message.pFlags.local && updatePosition) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n });\r\n\r\n this.bubbleGroups.mountUnmountGroups(groups);\r\n // this.bubbleGroups.findIncorrentPositions();\r\n\r\n if(this.updatePlaceholderPosition) {\r\n this.updatePlaceholderPosition();\r\n }\r\n\r\n if(restoreScroll) {\r\n restoreScroll();\r\n }\r\n\r\n // this.setStickyDateManually();\r\n\r\n if(this.messagesQueue.length) {\r\n log('have new messages to render');\r\n return processQueue();\r\n } else {\r\n log('end');\r\n }\r\n };\r\n\r\n log('setting pause');\r\n const promise = this.messagesQueuePromise = m(pause(0)).then(processQueue).finally(() => {\r\n if(this.messagesQueuePromise === promise) {\r\n this.messagesQueuePromise = null;\r\n }\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n private ejectBubbles() {\r\n for(const bubble of this.bubblesToEject) {\r\n bubble.remove();\r\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\r\n }\r\n\r\n this.bubblesToEject.clear();\r\n }\r\n\r\n public groupBubbles(items: Array<{\r\n // Awaited> &\r\n bubble: HTMLElement,\r\n message: Message.message | Message.messageService\r\n }/* & {\r\n unmountIfFound?: boolean\r\n } */>) {\r\n let modifiedGroups: typeof groups;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n modifiedGroups = new Set();\r\n items.forEach(({bubble, message}) => {\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n const group = item?.group;\r\n if(group && item.message.date !== message.date) {\r\n this.bubbleGroups.removeItem(item);\r\n modifiedGroups.add(group);\r\n }\r\n });\r\n }\r\n\r\n items.forEach(({bubble, message}) => {\r\n this.bubbleGroups.prepareForGrouping(bubble, message);\r\n });\r\n\r\n const groups = this.bubbleGroups.groupUngrouped();\r\n\r\n const avatarPromises = Array.from(groups).map((group) => {\r\n if(group.avatar) return;\r\n const firstItem = group.firstItem;\r\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\r\n return group.createAvatar(firstItem.message);\r\n }\r\n }).filter(Boolean);\r\n\r\n if(modifiedGroups) {\r\n for(const group of modifiedGroups) {\r\n groups.add(group);\r\n }\r\n }\r\n\r\n return {\r\n groups: [...groups],\r\n avatarPromises\r\n };\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middleware.get(additionalCallback);\r\n }\r\n\r\n private async safeRenderMessage(\r\n message: Message.message | Message.messageService,\r\n reverse?: boolean,\r\n bubble?: HTMLElement,\r\n updatePosition = true,\r\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\r\n ) {\r\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\r\n return;\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n\r\n let result: Awaited> & {updatePosition: typeof updatePosition};\r\n try {\r\n this.renderingMessages.add(message.mid);\r\n\r\n // const groupedId = (message as Message.message).grouped_id;\r\n const newBubble = document.createElement('div');\r\n newBubble.dataset.mid = '' + message.mid;\r\n newBubble.dataset.peerId = '' + message.peerId;\r\n newBubble.dataset.timestamp = '' + message.date;\r\n\r\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\r\n // bubble: newBubble,\r\n // mids: new Set(),\r\n // groupedId\r\n // };\r\n\r\n // bubbleNew.mids.add(message.mid);\r\n\r\n if(bubble) {\r\n this.skippedMids.delete(message.mid);\r\n\r\n this.bubblesToEject.add(bubble);\r\n this.bubblesToReplace.delete(bubble);\r\n this.bubblesToReplace.set(newBubble, bubble);\r\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\r\n }\r\n\r\n bubble = this.bubbles[message.mid] = newBubble;\r\n let originalPromise = this.renderMessage(message, reverse, bubble);\r\n if(processResult) {\r\n originalPromise = processResult(originalPromise, bubble);\r\n }\r\n\r\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\r\n\r\n this.renderMessagesQueue(promise.catch(() => undefined));\r\n\r\n result = await promise;\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!result) {\r\n this.skippedMids.add(+message.mid);\r\n }\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.renderingMessages.delete(message.mid);\r\n return result;\r\n }\r\n\r\n // reverse means top\r\n private async renderMessage(\r\n message: Message.message | Message.messageService,\r\n reverse = false,\r\n bubble: HTMLElement\r\n ) {\r\n // if(DEBUG) {\r\n // this.log('message to render:', message);\r\n // }\r\n\r\n // if(!bubble && this.bubbles[message.mid]) {\r\n // return;\r\n // }\r\n\r\n // await pause(1000);\r\n\r\n const isMessage = message._ === 'message';\r\n const groupedId = isMessage && message.grouped_id;\r\n let albumMids: number[], reactionsMessage: Message.message;\r\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\r\n\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n\r\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\r\n albumMids = albumMessages.map((message) => message.mid);\r\n const mainMid = getMainMidForGrouped(albumMids);\r\n if(message.mid !== mainMid) {\r\n return;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n reactionsMessage = groupedId ? albumMessages[0] : message;\r\n }\r\n\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = this.chat.isOurMessage(message);\r\n\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n\r\n const contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n\r\n const bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n\r\n bubble.classList.add('bubble');\r\n contentWrapper.append(bubbleContainer);\r\n bubble.append(contentWrapper);\r\n\r\n const isInUnread = !our && !message.pFlags.out && (message.pFlags.unread ||\r\n isMentionUnread(message)/* ||\r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid) */);\r\n if(isInUnread && this.observer) {\r\n // this.log('not our message', message, message.pFlags.unread);\r\n this.observer.observe(bubble, this.unreadedObserverCallback);\r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n\r\n const loadPromises: Promise[] = [];\r\n const ret = {\r\n bubble,\r\n promises: loadPromises,\r\n message,\r\n reverse\r\n };\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n return;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n let promise: Promise;\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n const peerTitle = new PeerTitle();\r\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true)});\r\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n const peerTitle = new PeerTitle();\r\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true)});\r\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\r\n } else {\r\n s.append(await wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if((messageMedia as MessageMedia.messageMediaDocument)?.document &&\r\n !['video', 'gif'].includes(((messageMedia as MessageMedia.messageMediaDocument).document as MyDocument).type)) {\r\n // * just filter these cases for documents caption\r\n } else if(groupedId && albumMustBeRenderedFull) {\r\n const t = getAlbumText(albumMessages);\r\n messageMessage = t.message;\r\n // totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(((messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument)?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n // totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n } else {\r\n if(message.action._ === 'messageActionPhoneCall') {\r\n messageMedia = {\r\n _: 'messageMediaCall',\r\n action: message.action\r\n };\r\n }\r\n }\r\n\r\n /* let richText = wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n const richText = wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n const strLength = messageMessage.length;\r\n const emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\r\n\r\n if(emojiStrLength === strLength && emojiEntities.length <= 3 && totalEntities.length === emojiEntities.length) {\r\n if(rootScope.settings.emoji.big) {\r\n const sticker = await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n const attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n\r\n setInnerHTML(attachmentDiv, richText);\r\n\r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n\r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n\r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n\r\n const timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message,\r\n reactionsMessage\r\n });\r\n messageDiv.append(timeSpan);\r\n bubbleContainer.prepend(messageDiv);\r\n // bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(isMessage && message.views) {\r\n bubble.classList.add('channel-post');\r\n\r\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\r\n const forward = document.createElement('div');\r\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\r\n bubbleContainer.prepend(forward);\r\n bubble.classList.add('with-beside-button');\r\n }\r\n\r\n if(!message.pFlags.is_outgoing && this.observer) {\r\n this.observer.observe(bubble, this.viewsObserverCallback);\r\n }\r\n }\r\n\r\n const replyMarkup = isMessage && message.reply_markup;\r\n if(replyMarkup && replyMarkup._ === 'replyInlineMarkup' && replyMarkup.rows && replyMarkup.rows.length) {\r\n const rows = replyMarkup.rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n\r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n\r\n promise.then((peerId) => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n case 'keyboardButtonBuy': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-buy');\r\n\r\n if(messageMedia?._ === 'messageMediaInvoice') {\r\n if(messageMedia.receipt_msg_id) {\r\n text = i18n('Message.ReplyActionButtonShowReceipt');\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n\r\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\r\n if(typeof(text) === 'string') {\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n } else {\r\n buttonEl.append(text);\r\n }\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(\r\n !target ||\r\n target.classList.contains('is-link') ||\r\n target.classList.contains('is-switch-inline') ||\r\n target.classList.contains('is-buy')\r\n ) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n\r\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n\r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n if(isOutgoing) {\r\n bubble.classList.add('is-outgoing');\r\n }\r\n\r\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = this.chat.isOutMessage(message);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n\r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n\r\n let processingWebPage = false;\r\n\r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n // //////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n bubble.classList.add('photo');\r\n\r\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n messages: albumMessages,\r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload\r\n });\r\n\r\n break;\r\n }\r\n\r\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapPhoto({\r\n photo: photo as Photo.photo,\r\n message,\r\n container: attachmentDiv,\r\n withTail,\r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.photo\r\n });\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n\r\n const webPage: WebPage = messageMedia.webpage;\r\n // //////this.log('messageMediaWebPage', webpage);\r\n if(webPage._ !== 'webPage') {\r\n break;\r\n }\r\n\r\n bubble.classList.add('webpage');\r\n\r\n const box = document.createElement('div');\r\n box.classList.add('web');\r\n\r\n const quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webPage.photo as any;\r\n if(photo || webPage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n\r\n const quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n\r\n const doc = webPage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n // if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc,\r\n container: preview,\r\n message: message as Message.message,\r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n noInfo: message.mid < 0\r\n });\r\n // }\r\n } else {\r\n const docDiv = await wrapDocument({\r\n message: message as Message.message,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises,\r\n sizeType: 'documentName',\r\n searchContext: {\r\n useSearch: false,\r\n peerId: this.peerId,\r\n inputFilter: {\r\n _: 'inputMessagesFilterEmpty'\r\n }\r\n }\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n quoteTextDiv.classList.add('has-document');\r\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n // doc = null;\r\n }\r\n }\r\n\r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webPage.site_name) {\r\n const html = wrapRichText(webPage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n const title = wrapWebPageTitle(webPage);\r\n if(title.textContent) {\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, title);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n const description = wrapWebPageDescription(webPage);\r\n if(description.textContent) {\r\n const textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, description);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo,\r\n message,\r\n container: preview,\r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n autoDownloadSize: this.chat.autoDownload.photo\r\n });\r\n }\r\n\r\n box.append(quote);\r\n\r\n // bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n\r\n // this.log('night running', bubble.scrollHeight);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n // this.log('messageMediaDocument', doc, bubble);\r\n\r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n\r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n\r\n const sizes = mediaSizes.active;\r\n const isEmoji = bubble.classList.contains('emoji-big');\r\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.height);\r\n // let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\r\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\r\n // appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc,\r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n // play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: isEmoji ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises,\r\n isOut,\r\n noPremium: messageMedia?.pFlags?.nopremium\r\n });\r\n\r\n if(getStickerEffectThumb(doc) && (isInUnread || isOutgoing)/* || true */) {\r\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\r\n }\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n // this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(canHideNameIfMedia) {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n\r\n wrapAlbum({\r\n messages: albumMessages,\r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload\r\n });\r\n } else {\r\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapVideo({\r\n doc,\r\n container: attachmentDiv,\r\n message: message as Message.message,\r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height,\r\n withTail,\r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n autoDownload: this.chat.autoDownload,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n noInfo: message.mid < 0\r\n });\r\n }\r\n } else {\r\n const newNameContainer = await wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n autoDownloadSize: this.chat.autoDownload.file,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n sizeType: 'documentName'\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document, .audio');\r\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n lastContainer && lastContainer.append(timeSpan);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ?\r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n // this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const contactDetails = document.createElement('div');\r\n contactDetails.className = 'contact-details';\r\n const contactNameDiv = document.createElement('div');\r\n contactNameDiv.className = 'contact-name';\r\n contactNameDiv.append(\r\n wrapEmojiText([\r\n contact.first_name,\r\n contact.last_name\r\n ].filter(Boolean).join(' '))\r\n );\r\n\r\n const contactNumberDiv = document.createElement('div');\r\n contactNumberDiv.className = 'contact-number';\r\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\r\n\r\n contactDiv.append(contactDetails);\r\n contactDetails.append(contactNameDiv, contactNumberDiv);\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.updateWithOptions({\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n peerId: contact.user_id.toPeerId()\r\n });\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n\r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaInvoice': {\r\n const isTest = messageMedia.pFlags.test;\r\n const photo = messageMedia.photo;\r\n\r\n const priceEl = document.createElement(photo ? 'span' : 'div');\r\n const f = document.createDocumentFragment();\r\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\r\n l.classList.add('text-uppercase');\r\n const joiner = ' ‎';\r\n const p = document.createElement('span');\r\n p.classList.add('text-bold');\r\n p.textContent = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency) + joiner;\r\n f.append(p, l);\r\n if(isTest && messageMedia.receipt_msg_id) {\r\n const a = document.createElement('span');\r\n a.classList.add('text-uppercase', 'pre-wrap');\r\n a.append(joiner + '(Test)');\r\n f.append(a);\r\n }\r\n setInnerHTML(priceEl, f);\r\n\r\n if(photo) {\r\n const mediaSize = mediaSizes.active.invoice;\r\n wrapPhoto({\r\n photo,\r\n container: attachmentDiv,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height\r\n });\r\n\r\n bubble.classList.add('photo');\r\n\r\n priceEl.classList.add('video-time');\r\n attachmentDiv.append(priceEl);\r\n } else {\r\n attachmentDiv = undefined;\r\n }\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('bubble-primary-color');\r\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\r\n\r\n const richText = wrapEmojiText(messageMedia.description);\r\n messageDiv.prepend(...[titleDiv, !photo && priceEl, richText].filter(Boolean));\r\n\r\n bubble.classList.remove('is-message-empty');\r\n bubble.classList.add('is-invoice');\r\n\r\n break;\r\n }\r\n\r\n default:\r\n attachmentDiv = undefined;\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\r\n this.log.warn('unrecognized media type:', messageMedia._, message);\r\n break;\r\n }\r\n\r\n if(!processingWebPage && attachmentDiv) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n let savedFrom = '';\r\n\r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n\r\n const isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + (await this.managers.appUsersManager.getUser(message.viaBotId)).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n\r\n if(isHidden) {\r\n // /////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\r\n title.classList.add('peer-title');\r\n // title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n await MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n\r\n // this.log(title);\r\n\r\n let nameDiv: HTMLElement;\r\n if((fwdFromId || fwdFrom)) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n\r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n\r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\r\n const pFlags = (peer as User.user)?.pFlags;\r\n if(pFlags && (pFlags.scam || pFlags.fake)) {\r\n nameDiv.append(generateFakeIcon(pFlags.scam));\r\n }\r\n\r\n if(!our) {\r\n nameDiv.style.color = getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = '' + message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n\r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(isMessage) {\r\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\r\n }\r\n\r\n /* if(isMessage) {\r\n const reactionHover = document.createElement('div');\r\n reactionHover.classList.add('bubble-reaction-hover');\r\n contentWrapper.append(reactionHover);\r\n } */\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n private appendReactionsElementToBubble(bubble: HTMLElement, message: Message.message, reactionsMessage: Message.message, changedResults?: ReactionCount[]) {\r\n if(this.peerId.isUser()/* || true */) {\r\n return;\r\n }\r\n\r\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\r\n return;\r\n }\r\n\r\n // message = this.appMessagesManager.getMessageWithReactions(message);\r\n\r\n const reactionsElement = new ReactionsElement();\r\n reactionsElement.init(reactionsMessage, 'block');\r\n reactionsElement.render(changedResults);\r\n\r\n if(bubble.classList.contains('is-message-empty')) {\r\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\r\n } else {\r\n const messageDiv = bubble.querySelector('.message');\r\n if(bubble.classList.contains('is-multiple-documents')) {\r\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\r\n let documentMessageDiv = documentContainer.querySelector('.document-message');\r\n\r\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\r\n if(!timeSpan) {\r\n timeSpan = MessageRender.setTime({\r\n chatType: this.chat.type,\r\n message,\r\n reactionsMessage\r\n });\r\n }\r\n\r\n reactionsElement.append(timeSpan);\r\n\r\n if(!documentMessageDiv) {\r\n documentMessageDiv = document.createElement('div');\r\n documentMessageDiv.classList.add('document-message');\r\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\r\n }\r\n\r\n documentMessageDiv.append(reactionsElement);\r\n } else {\r\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\r\n reactionsElement.append(timeSpan);\r\n\r\n messageDiv.append(reactionsElement);\r\n }\r\n }\r\n }\r\n\r\n private prepareToSaveScroll(reverse?: boolean) {\r\n const isMounted = !!this.chatInner.parentElement;\r\n if(!isMounted) {\r\n return {};\r\n }\r\n\r\n const log = this.log.bindPrefix('prepareToSaveScroll');\r\n log('save');\r\n const scrollSaver = this.createScrollSaver(reverse);\r\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\r\n\r\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\r\n const viewportSlice = this.getViewportSlice();\r\n this.deleteViewportSlice(viewportSlice, true);\r\n }\r\n\r\n // scrollSaver.save(); // ! slicing will corrupt scroll position\r\n // const saved = scrollSaver.getSaved();\r\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\r\n\r\n return {\r\n restoreScroll: () => {\r\n log('restore');\r\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\r\n scrollSaver.restore(reverse);\r\n this.onRenderScrollSet(scrollSaver.getSaved());\r\n },\r\n scrollSaver\r\n };\r\n }\r\n\r\n public async performHistoryResult(historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]}, reverse: boolean) {\r\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\r\n log && log('start', this.chatInner.parentElement);\r\n\r\n let history = historyResult.history;\r\n history = history.slice(); // need\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (message: Message.message | Message.messageService) => {\r\n if(!message) {\r\n return;\r\n } else if(message.pFlags.local) {\r\n return this.processLocalMessageRender(message);\r\n } else {\r\n return this.safeRenderMessage(message, reverse);\r\n }\r\n };\r\n\r\n const messages = await Promise.all(history.map((mid) => {\r\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n }));\r\n\r\n const setLoadedPromises: Promise[] = [];\r\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\r\n let isEnd = (historyResult as HistoryResult).isEnd;\r\n if(!isEnd) {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n isEnd = {top: false, bottom: false, both: false};\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n isEnd.bottom = true;\r\n }\r\n\r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n isEnd.top = true;\r\n }\r\n }\r\n\r\n if(!isEnd.bottom && this.setPeerOptions) {\r\n const {lastMsgId, topMessage} = this.setPeerOptions;\r\n this.setPeerOptions = undefined;\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n isEnd.bottom = true;\r\n }\r\n }\r\n\r\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\r\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\r\n }\r\n\r\n await Promise.all(setLoadedPromises);\r\n\r\n // ! it is important to insert bubbles to group reversed way\r\n // const length = history.length, promises: Promise[] = [];\r\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\r\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\r\n const promises = messages.map(cb);\r\n\r\n // cannot combine them into one promise\r\n await Promise.all(promises);\r\n await this.messagesQueuePromise;\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n log && log('performHistoryResult end');\r\n }\r\n\r\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\r\n const className = 'has-sticky-dates';\r\n if(!this.container.classList.contains(className)) {\r\n const isLoading = !this.preloader.detached;\r\n\r\n if(isLoading ||\r\n (\r\n state ??= {\r\n scrollHeight: this.scrollable.scrollHeight,\r\n clientHeight: this.scrollable.container.clientHeight\r\n },\r\n state.scrollHeight !== state.clientHeight\r\n )\r\n ) {\r\n /* for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n dateMessage.div.classList.add('is-sticky');\r\n } */\r\n\r\n const middleware = this.getMiddleware();\r\n const callback = () => {\r\n if(!middleware()) return;\r\n this.container.classList.add(className);\r\n };\r\n\r\n if(this.willScrollOnLoad) {\r\n callback();\r\n } else {\r\n setTimeout(callback, 600);\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.willScrollOnLoad = undefined;\r\n }\r\n\r\n public onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n // console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n // const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n return this.managers.acknowledged.appMessagesManager.getSearch({\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterPinned'},\r\n maxId,\r\n limit: loadCount,\r\n backLimit\r\n }).then((ackedResult) => {\r\n return {\r\n cached: ackedResult.cached,\r\n result: Promise.resolve(ackedResult.result).then((value) => {\r\n return {history: value.history.map((m) => m.mid)};\r\n })\r\n };\r\n });\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {\r\n cached: ackedResult.cached,\r\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\r\n };\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n const log = this.log.bindPrefix('ladder');\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n log.warn('will be delayed');\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n log.warn('no bubbles');\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\r\n\r\n if(DEBUG) {\r\n log('targeting mid:', targetMid, maxId, additionMsgId,\r\n topIds.map((m) => getServerMessageId(m)),\r\n bottomIds.map((m) => getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble || this.skippedMids.has(mid)) {\r\n log.warn('no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n // lastMsDelay = (idx + offsetIndex) * delay;\r\n // lastMsDelay = (idx || 0.1) * 1000;\r\n\r\n const contentWrapper = bubble.lastElementChild as HTMLElement;\r\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\r\n const item = this.bubbleGroups.getItemByBubble(bubble);\r\n if(item && item.group.avatar && item.group.lastItem === item) {\r\n elementsToAnimate.push(item.group.avatar);\r\n }\r\n\r\n elementsToAnimate.forEach((element) => {\r\n element.classList.add('zoom-fade', 'can-zoom-fade');\r\n element.style.transitionDelay = lastMsDelay + 'ms';\r\n });\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n\r\n setBubbles.push(...elementsToAnimate);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach((element) => {\r\n element.classList.remove('zoom-fade');\r\n });\r\n });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => {\r\n fastRaf(() => {\r\n setBubbles.forEach((element) => {\r\n element.style.transitionDelay = '';\r\n element.classList.remove('can-zoom-fade');\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх,\r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n // if(!IS_SAFARI) {\r\n // this.needReflowScroll = true;\r\n // }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private async renderEmptyPlaceholder(\r\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\r\n bubble: HTMLElement,\r\n message: any,\r\n elements: (Node | string)[]\r\n ) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement;\r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n else if(type === 'restricted') {\r\n title = document.createElement('span');\r\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\r\n }\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n\r\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n await wrapSticker({\r\n doc,\r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n // play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n // this.renderMessagesQueue({\r\n // message,\r\n // bubble,\r\n // reverse: false,\r\n // promises: [loadPromise]\r\n // });\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map((elem) => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n\r\n if(type === 'group') {\r\n listElements.forEach((elem) => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach((elem) => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private async processLocalMessageRender(message: Message.message | Message.messageService, animate?: boolean) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const middleware = this.getMiddleware();\r\n const m = middlewarePromise(middleware);\r\n return this.safeRenderMessage(message, isSponsored ? false : true, undefined, isSponsored, async(result) => {\r\n const {bubble} = await m(result);\r\n if(!bubble) {\r\n return result;\r\n }\r\n\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n const updatePosition = () => {\r\n if(this.updatePlaceholderPosition === updatePosition) {\r\n this.updatePlaceholderPosition = undefined;\r\n }\r\n\r\n appendTo[method](bubble);\r\n };\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = await m(this.managers.appPeersManager.isBot(this.peerId));\r\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\r\n if(this.chat.isRestricted) {\r\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\r\n } else if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param || isBot) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n\r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId,\r\n lastMsgId: mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.observer.observe(button, this.viewsObserverCallback);\r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n return result;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n appendTo = this.chatInner;\r\n method = 'prepend';\r\n } else if(await m(this.managers.appPeersManager.isAnyGroup(this.peerId)) && (await m(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator) {\r\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\r\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n if(renderPromise) {\r\n await renderPromise;\r\n }\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\r\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\r\n if(noTransition) {\r\n const setOn = bubble.firstElementChild;\r\n setOn.classList.add('no-transition');\r\n\r\n if(this.chat.setPeerPromise) {\r\n this.chat.setPeerPromise.catch(noop).finally(() => {\r\n setOn.classList.remove('no-transition');\r\n });\r\n }\r\n }\r\n\r\n if(animate === undefined && !noTransition) {\r\n animate = true;\r\n }\r\n\r\n if(isWaitingForAnimation || animate) {\r\n this.updatePlaceholderPosition = updatePosition;\r\n\r\n this.onAnimateLadder = () => {\r\n // appendTo[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else if(this.chat.setPeerPromise) {\r\n this.attachPlaceholderOnRender = () => {\r\n this.attachPlaceholderOnRender = undefined;\r\n updatePosition();\r\n // appendTo[method](bubble);\r\n };\r\n } else {\r\n this.updatePlaceholderPosition = updatePosition;\r\n // appendTo[method](bubble);\r\n }\r\n\r\n if(!isWaitingForAnimation && animate) {\r\n await m(getHeavyAnimationPromise());\r\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\r\n indexOfAndSplice(additionMsgIds, message.mid);\r\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\r\n }\r\n\r\n // if(!isSponsored) {\r\n this.emptyPlaceholderBubble = bubble;\r\n // }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n let message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\r\n message = savedMessages[0];\r\n message.mid = mid;\r\n return message as any;\r\n }\r\n\r\n public getViewportSlice() {\r\n // this.log.trace('viewport slice');\r\n return getViewportSlice({\r\n overflowElement: this.scrollable.container,\r\n selector: '.bubbles-date-group .bubble:not(.is-date)',\r\n extraSize: Math.max(700, windowSize.height) * 2\r\n });\r\n }\r\n\r\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\r\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\r\n return;\r\n }\r\n\r\n const {invisibleTop, invisibleBottom} = slice;\r\n const invisible = invisibleTop.concat(invisibleBottom);\r\n if(!invisible.length) {\r\n return;\r\n }\r\n\r\n if(invisibleTop.length) {\r\n this.setLoaded('top', false);\r\n this.getHistoryTopPromise = undefined;\r\n }\r\n\r\n if(invisibleBottom.length) {\r\n this.setLoaded('bottom', false);\r\n this.getHistoryBottomPromise = undefined;\r\n }\r\n\r\n const mids = invisible.map(({element}) => +element.dataset.mid);\r\n\r\n let scrollSaver: ScrollSaver;\r\n if(!!invisibleTop.length !== !!invisibleBottom.length && !ignoreScrollSaving) {\r\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\r\n scrollSaver.save();\r\n }\r\n\r\n this.deleteMessagesByIds(mids, false, true);\r\n\r\n if(scrollSaver) {\r\n scrollSaver.restore();\r\n } else if(invisibleTop.length) {\r\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\r\n }\r\n }\r\n\r\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\r\n // Safari cannot reset the scroll.\r\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\r\n return;\r\n }\r\n\r\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\r\n // scrollSaver.save();\r\n const slice = this.getViewportSlice();\r\n // if(IS_SAFARI) slice.invisibleTop = [];\r\n this.deleteViewportSlice(slice);\r\n // scrollSaver.restore();\r\n }\r\n\r\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n const log = this.log.bindPrefix('setLoaded');\r\n log('change', side, value);\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n // return;\r\n\r\n if(!checkPlaceholders) {\r\n return;\r\n }\r\n\r\n if(!this.chat.isRestricted) {\r\n if(side === 'bottom' && await this.managers.appPeersManager.isBroadcast(this.peerId)/* && false */) {\r\n this.toggleSponsoredMessage(value);\r\n }\r\n\r\n if(side === 'top' && value && await this.managers.appPeersManager.isBot(this.peerId)) {\r\n return this.renderBotPlaceholder();\r\n }\r\n }\r\n\r\n return this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n private async toggleSponsoredMessage(value: boolean) {\r\n const _log = this.log.bindPrefix('sponsored');\r\n _log('checking');\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && !this.bubbles[mid] && this.getSponsoredMessagePromise === promise;\r\n });\r\n\r\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\r\n .then(async(sponsoredMessages) => {\r\n const sponsoredMessage = sponsoredMessages.messages[0];\r\n if(!sponsoredMessage) {\r\n _log('no message');\r\n return;\r\n }\r\n\r\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n\r\n return Promise.all([\r\n messagePromise,\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(([message]) => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n _log('rendering', message);\r\n const promise = this.performHistoryResult({history: [message]}, false);\r\n });\r\n }).finally(() => {\r\n this.getSponsoredMessagePromise = undefined;\r\n });\r\n } else {\r\n _log('clearing rendered', mid);\r\n this.deleteMessagesByIds([mid]);\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n }\r\n\r\n private async renderBotPlaceholder() {\r\n const _log = this.log.bindPrefix('bot placeholder');\r\n\r\n const middleware = this.getMiddleware();\r\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\r\n _log('getting profile, cached:', result.cached);\r\n const processPromise = result.result.then(async(userFull) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n _log.warn('no description');\r\n return this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n const message = await this.generateLocalFirstMessage(false, (message) => {\r\n const botInfo = userFull.bot_info;\r\n message.message = botInfo.description;\r\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document};\r\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo};\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n _log('rendering');\r\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\r\n _log('done');\r\n });\r\n\r\n return {renderPromise};\r\n });\r\n\r\n if(!result.cached) {\r\n return;\r\n }\r\n\r\n return processPromise;\r\n }\r\n\r\n public async checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top &&\r\n this.scrollable.loadedAll.bottom &&\r\n this.emptyPlaceholderBubble === undefined &&\r\n (\r\n this.chat.isRestricted ||\r\n !(await this.chat.getHistoryStorage()).count ||\r\n (\r\n !Object.keys(this.bubbles).length ||\r\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\r\n Object.keys(this.bubbles).length &&\r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = await this.generateLocalFirstMessage(true);\r\n return {renderPromise: this.processLocalMessageRender(message)};\r\n }\r\n }\r\n\r\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\r\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\r\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\r\n });\r\n\r\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\r\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n\r\n if(!justLoad) {\r\n // preload more\r\n // if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n // }\r\n }\r\n // }\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public async getHistory(\r\n maxId = 0,\r\n reverse = false,\r\n isBackLimit = false,\r\n additionMsgId = 0,\r\n justLoad = false,\r\n middleware?: () => boolean\r\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\r\n const peerId = this.peerId;\r\n\r\n const isBroadcast = await this.managers.appPeersManager.isBroadcast(peerId);\r\n // console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\r\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\r\n // const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n\r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\r\n }\r\n }\r\n\r\n // //console.time('render history total');\r\n\r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = await this.chat.getHistoryStorage();\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = await this.chat.getMessage(additionMsgIds[i]);\r\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ?\r\n {history: [additionMsgID]} :\r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: typeof result['result'];\r\n\r\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && !result.cached;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result.result;\r\n\r\n result = {\r\n cached: true,\r\n result: Promise.resolve({history: additionMsgIds})\r\n };\r\n\r\n // additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: Awaited) => {\r\n if((historyResult as HistoryResult).isEnd?.top) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\r\n historyResult.history.push(...mids.reverse());\r\n }\r\n\r\n // synchronize bot placeholder appearance\r\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\r\n\r\n // await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (historyResult: Awaited) => {\r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(historyResult);\r\n }).then(() => {\r\n if(!isAdditionRender && additionMsgId) {\r\n historyResult.history.unshift(additionMsgId);\r\n }\r\n\r\n return this.performHistoryResult(historyResult, reverse);\r\n });\r\n };\r\n\r\n const processPromise = (_promise: typeof result['result']) => {\r\n const promise = Promise.resolve(_promise).then((result) => {\r\n if(middleware && !middleware()) {\r\n throw PEER_CHANGED_ERROR;\r\n }\r\n\r\n if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n // fastRaf(() => {\r\n // this.scrollable.checkForTriggers();\r\n // });\r\n return;\r\n }\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n\r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(!result.cached) {\r\n cached = false;\r\n promise = processPromise(result.result);\r\n } else if(justLoad) {\r\n // нужно делать из-за ранней прогрузки\r\n this.scrollable.onScroll();\r\n return null;\r\n } else {\r\n cached = true;\r\n promise = sup(await result.result);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('messagesQueueOnRenderAdditional');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n\r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n return {cached, promise, waitPromise};\r\n }\r\n\r\n public async setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyMaxId = await this.chat.getHistoryMaxId();\r\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\r\n .map((i) => +i)\r\n .sort((a, b) => a - b)\r\n .find((i) => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n const bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyMaxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n if(!Object.keys(this.dateMessages).length) {\r\n this.container.classList.remove('has-groups');\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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 wrapRichText from '../../lib/richTextProcessor/wrapRichText';\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}: {\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}) {\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 });\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 const richText = wrapRichText(message.message, {\n entities: message.totalEntities\n });\n\n setInnerHTML(messageDiv, richText);\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 getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, selector, extraSize}: {\n overflowElement: HTMLElement,\n selector: string,\n extraSize?: number\n}) {\n // const perf = performance.now();\n const overflowRect = overflowElement.getBoundingClientRect();\n const elements = Array.from(overflowElement.querySelectorAll(selector));\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 PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport PeerTitle from '../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: [new PeerTitle({peerId}).element],\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas, 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.append(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} from '../../layer';\nimport {SettingSection} from '../sidebarLeft';\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';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\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 message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n\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 pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block');\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(!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 !== 'checks';\n const skipReactionsList = reactionCount.reaction === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction)) {\n reactionCount.reaction = undefined;\n }\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: 54,\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 const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24\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');\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon\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} 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';\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: string\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: 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport type Chat from './chat';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport PopupForward from '../popups/forward';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport {copyTextToClipboard} from '../../helpers/clipboard';\r\nimport PopupSendNow from '../popups/sendNow';\r\nimport {toast} from '../toast';\r\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\r\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\r\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction} from '../../layer';\r\nimport PopupReportMessages from '../popups/reportMessages';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport PopupSponsored from '../popups/sponsored';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport {getMiddleware} from '../../helpers/middleware';\r\nimport PeerTitle from '../peerTitle';\r\nimport StackedAvatars from '../stackedAvatars';\r\nimport {IS_APPLE} from '../../environment/userAgent';\r\nimport PopupReactedList from '../popups/reactedList';\r\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\r\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\r\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\r\nimport contextMenuController from '../../helpers/contextMenuController';\r\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\r\nimport filterAsync from '../../helpers/array/filterAsync';\r\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\r\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private isSponsored: boolean;\r\n private isOverBubble: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n private reactionsMenu: ChatReactionsMenu;\r\n private listenerSetter: ListenerSetter;\r\n private attachListenerSetter: ListenerSetter;\r\n\r\n private viewerPeerId: PeerId;\r\n private middleware: ReturnType;\r\n private canOpenReactedList: boolean;\r\n\r\n constructor(\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.attachListenerSetter = new ListenerSetter();\r\n this.middleware = getMiddleware();\r\n }\r\n\r\n public attachTo(element: HTMLElement) {\r\n this.attachListenerSetter.removeAll();\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(element, (e) => {\r\n if(this.chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n this.chat.log('touchend', e);\r\n\r\n const badSelectors = [\r\n '.name',\r\n '.peer-title',\r\n '.reply',\r\n '.document',\r\n 'audio-element',\r\n 'avatar-element',\r\n 'a',\r\n '.bubble-beside-button',\r\n 'replies-element',\r\n '[data-saved-from]:not(.bubble)',\r\n 'poll-element',\r\n '.attachment',\r\n '.reply-markup-button'\r\n ];\r\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\r\n if(good) {\r\n cancelEvent(e);\r\n // onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n this.onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.attachListenerSetter});\r\n } else attachContextMenuListener(element, this.onContextMenu, this.attachListenerSetter);\r\n }\r\n\r\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n let element = this.element;\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(element && element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n\r\n const r = async() => {\r\n const isSponsored = this.isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n // this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' ||\r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(this.chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = await this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\r\n mid :\r\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n this.isOverBubble = !!contentWrapper;\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = await this.chat.getMessage(this.mid);\r\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n\r\n const initResult = await this.init();\r\n if(!initResult) {\r\n return;\r\n }\r\n\r\n element = initResult.element;\r\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\r\n let isReactionsMenuVisible = false;\r\n if(reactionsMenu) {\r\n const className = 'is-visible';\r\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\r\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\r\n\r\n if(reactionsMenuPosition === 'horizontal') {\r\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\r\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\r\n const INNER_CONTAINER_PADDING = 8;\r\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\r\n const nextVisiblePart = visibleLength % 1;\r\n const MIN_NEXT_VISIBLE_PART = 0.65;\r\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\r\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\r\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\r\n }\r\n // }\r\n }\r\n }\r\n\r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n // bubble.parentElement.append(element);\r\n // appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\r\n\r\n if(reactionsMenu) {\r\n reactionsMenu.widthContainer.style.top = element.style.top;\r\n reactionsMenu.widthContainer.style.left = element.style.left;\r\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\r\n element.parentElement.append(reactionsMenu.widthContainer);\r\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\r\n }\r\n\r\n contextMenuController.openBtnMenu(element, () => {\r\n if(reactionsMenu) {\r\n reactionsMenu.container.classList.remove('is-visible');\r\n }\r\n\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n this.viewerPeerId = undefined;\r\n this.canOpenReactedList = undefined;\r\n cleanup();\r\n\r\n setTimeout(() => {\r\n destroy();\r\n }, 300);\r\n });\r\n\r\n if(isReactionsMenuVisible) {\r\n reactionsMenu.container.classList.add('is-visible');\r\n }\r\n };\r\n\r\n r();\r\n };\r\n\r\n public cleanup() {\r\n this.listenerSetter.removeAll();\r\n this.reactionsMenu && this.reactionsMenu.cleanup();\r\n this.middleware.clean();\r\n }\r\n\r\n public destroy() {\r\n this.cleanup();\r\n this.attachListenerSetter.removeAll();\r\n }\r\n\r\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\r\n if(this.isSponsored) {\r\n return buttons.filter((button) => {\r\n return button.isSponsored;\r\n });\r\n } else {\r\n return filterAsync(buttons, async(button) => {\r\n let good: boolean;\r\n\r\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(this.chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\r\n await button.verify() :\r\n button.notDirect && await button.verify() && button.notDirect();\r\n }\r\n\r\n return !!good;\r\n });\r\n }\r\n }\r\n\r\n private setButtons() {\r\n const verifyFavoriteSticker = async(toAdd: boolean) => {\r\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\r\n if(!(doc as MyDocument)?.sticker) {\r\n return false;\r\n }\r\n\r\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\r\n if(!favedStickers.cached) {\r\n return false;\r\n }\r\n\r\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\r\n return toAdd ? !found : found;\r\n };\r\n\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: async() => await this.chat.canSend() &&\r\n !this.message.pFlags.is_outgoing &&\r\n !!this.chat.input.messageInput &&\r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'favourites',\r\n text: 'AddToFavorites',\r\n onClick: this.onFaveStickerClick.bind(this, false),\r\n verify: () => verifyFavoriteSticker(true)\r\n }, {\r\n icon: 'favourites',\r\n text: 'DeleteFromFavorites',\r\n onClick: this.onFaveStickerClick.bind(this, true),\r\n verify: () => verifyFavoriteSticker(false)\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: async() => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\r\n for(const mid of mids) {\r\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\r\n if(!!message.message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: async() => !this.message.pFlags.is_outgoing &&\r\n this.message._ !== 'messageService' &&\r\n !this.message.pFlags.pinned &&\r\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\r\n this.chat.type !== 'scheduled'\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n appDownloadManager.downloadToDisc({media: (this.message as any).media.document});\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n\r\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\r\n if(!doc) return false;\r\n\r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video'/* , 'sticker' */] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: async() => {\r\n const poll = (this.message as any).media?.poll;\r\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn &&\r\n this.isSelected &&\r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n onClick: () => {\r\n if(this.viewerPeerId) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: this.viewerPeerId\r\n });\r\n } else if(this.canOpenReactedList) {\r\n new PopupReactedList(this.message as Message.message);\r\n } else {\r\n return false;\r\n }\r\n },\r\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\r\n notDirect: () => true\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }];\r\n }\r\n\r\n private async init() {\r\n this.cleanup();\r\n this.setButtons();\r\n\r\n const filteredButtons = await this.filterButtons(this.buttons);\r\n if(!filteredButtons.length) {\r\n return;\r\n }\r\n\r\n const element = this.element = ButtonMenu(filteredButtons, this.listenerSetter);\r\n element.id = 'bubble-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n const viewsButton = filteredButtons.find((button) => !button.icon);\r\n if(viewsButton) {\r\n const reactions = (this.message as Message.message).reactions;\r\n const recentReactions = reactions?.recent_reactions;\r\n const isViewingReactions = !!recentReactions?.length;\r\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ? ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count : undefined;\r\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\r\n\r\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\r\n const i18nElem = new I18n.IntlElement({\r\n key: isViewingReactions ? (\r\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\r\n ) : 'NobodyViewed',\r\n args: isViewingReactions ? (\r\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\r\n ) : undefined,\r\n element: viewsButton.textElement\r\n });\r\n\r\n let fakeText: HTMLElement;\r\n if(isViewingReactions) {\r\n if(participantsCount === undefined) {\r\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\r\n } else {\r\n fakeText = i18n(\r\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\r\n [recentReactions.length, participantsCount]\r\n );\r\n }\r\n } else {\r\n fakeText = i18n('Loading');\r\n }\r\n\r\n fakeText.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeText);\r\n\r\n const AVATAR_SIZE = 22;\r\n const MAX_AVATARS = 3;\r\n const PADDING_PER_AVATAR = 1.125;\r\n i18nElem.element.style.visibility = 'hidden';\r\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\r\n const middleware = this.middleware.get();\r\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(fakeText) {\r\n fakeText.remove();\r\n }\r\n\r\n const reactions = result.combined;\r\n const reactedLength = participantsCount === undefined ?\r\n result.reactionsCount :\r\n (\r\n isViewingReactions ?\r\n reactions.filter((reaction) => reaction.reaction).length :\r\n reactions.length\r\n );\r\n\r\n let fakeElem: HTMLElement;\r\n if(reactions.length === 1) {\r\n fakeElem = new PeerTitle({\r\n peerId: reactions[0].peerId,\r\n onlyFirstName: true,\r\n dialog: false\r\n }).element;\r\n\r\n if(!isViewingReactions || result.readParticipants.length <= 1) {\r\n this.viewerPeerId = reactions[0].peerId;\r\n }\r\n } else if(isViewingReactions) {\r\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\r\n fakeElem = i18n(\r\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\r\n isFull ? [reactedLength] : [reactedLength, reactions.length]\r\n );\r\n } else {\r\n if(!reactions.length) {\r\n i18nElem.element.style.visibility = '';\r\n } else {\r\n fakeElem = i18n('MessageSeen', [reactions.length]);\r\n }\r\n }\r\n\r\n if(fakeElem) {\r\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\r\n fakeElem.classList.add('btn-menu-item-text-fake');\r\n viewsButton.element.append(fakeElem);\r\n }\r\n\r\n if(reactions.length) {\r\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\r\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\r\n viewsButton.element.append(avatars.container);\r\n\r\n // if(reactions.length > 1) {\r\n // if(isViewingReactions) {\r\n this.canOpenReactedList = true;\r\n // }\r\n }\r\n });\r\n }\r\n\r\n let menuPadding: MenuPositionPadding;\r\n let reactionsMenu: ChatReactionsMenu;\r\n let reactionsMenuPosition: 'horizontal' | 'vertical';\r\n if(this.message._ === 'message' && !this.chat.selection.isSelecting && !this.message.pFlags.is_outgoing && !this.message.pFlags.is_scheduled) {\r\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\r\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\r\n // element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 36;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n const paddingLeft = 0, paddingRight = 0;\r\n if(reactionsMenuPosition === 'vertical') {\r\n menuPadding = {\r\n top: paddingLeft,\r\n // bottom: 36, // positionMenu will detect it itself somehow\r\n left: totalSize\r\n };\r\n } else {\r\n menuPadding = {\r\n top: totalSize,\r\n right: paddingRight,\r\n left: paddingLeft\r\n };\r\n }\r\n }\r\n\r\n this.chat.container.append(element);\r\n\r\n return {\r\n element,\r\n cleanup: () => {\r\n this.cleanup();\r\n reactionsMenu && reactionsMenu.cleanup();\r\n },\r\n destroy: () => {\r\n element.remove();\r\n reactionsMenu && reactionsMenu.widthContainer.remove();\r\n },\r\n menuPadding,\r\n reactionsMenu,\r\n reactionsMenuPosition\r\n };\r\n }\r\n\r\n private onSendScheduledClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onFaveStickerClick = (unfave?: boolean) => {\r\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\r\n this.managers.appStickersManager.faveSticker(docId, unfave);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = async() => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ?\r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\r\n [this.mid];\r\n\r\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n return message?.message ? message.message + '\\n' : '';\r\n }));\r\n\r\n const str = parts.join('');\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n // cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = async() => {\r\n let threadMessage: Message.message;\r\n const {peerId, mid} = this;\r\n const threadId = this.chat.threadId;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\r\n }\r\n\r\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\r\n const msgId = getServerMessageId(mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.managers.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.managers.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const peerId = this.peerId;\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = async() => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport contextMenuController from '../../helpers/contextMenuController';\r\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport rootScope from '../../lib/rootScope';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n\r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n\r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach((button) => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n\r\n cancelEvent(e);\r\n contextMenuController.openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from '../chat/chat';\r\nimport PopupElement from '.';\r\nimport CheckboxField from '../checkboxField';\r\nimport InputField from '../inputField';\r\nimport RadioField from '../radioField';\r\nimport Scrollable from '../scrollable';\r\nimport SendContextMenu from '../chat/sendContextMenu';\r\nimport I18n, {_i18n} from '../../lib/langPack';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport whichChild from '../../helpers/dom/whichChild';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport {Poll} from '../../layer';\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n protected scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\r\n this.construct();\r\n }\r\n\r\n private async construct() {\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion',\r\n name: 'question',\r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm\r\n });\r\n\r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n\r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous',\r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n\r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice',\r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz',\r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder',\r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach((el) => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter((v) => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n\r\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public async send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n\r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n // poll.id = randomIDS;\r\n\r\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n // console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n ...this.chat.getMessageSendingParams()\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption',\r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId,\r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '',\r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n\r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement,\r\n position: 'center'\r\n });\r\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from './schedulers/pause';\r\nimport {makeMediaSize} from './mediaSize';\r\nimport scaleMediaElement from './canvas/scaleMediaElement';\r\nimport preloadVideo from './preloadVideo';\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media,\r\n mediaSize: makeMediaSize(width, height),\r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n\r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video)\r\n ]);\r\n}\r\n\r\n\r\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 type Chat from '../chat/chat';\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport Scrollable from '../scrollable';\nimport {toast} from '../toast';\nimport {wrapDocument} from '../wrappers';\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 {MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\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 inputField: InputField;\n private captionLengthMax: number;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true, title: true});\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n const config = await this.managers.apiManager.getConfig();\n this.captionLengthMax = config.caption_length_max;\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 this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n\n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: this.captionLengthMax,\n withLinebreaks: true\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\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 appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems',\n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n\n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n\n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n\n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\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 if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.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.inputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n // console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n\n sendFileDetails.forEach((d) => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map((d) => d.file), Object.assign({\n ...sendingParams,\n caption,\n isMedia: isMedia,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private async attachMedia(params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = createVideo();\n const source = document.createElement('source');\n source.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 promise = onMediaLoad(video).then(async() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n itemDiv.append(img);\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n 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 resolve();\n });\n } else {\n resolve();\n }\n };\n });\n\n img.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n return promise;\n }\n\n private async attachDocument(params: SendFileParams, itemDiv: HTMLElement): ReturnType {\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 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: '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 const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n\n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n finish();\n };\n\n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params, itemDiv) : this.attachDocument(params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\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.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(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\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 willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && 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: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from '../fastSmoothScroll';\r\nimport cancelEvent from './cancelEvent';\r\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\r\nimport findUpAsChild from './findUpAsChild';\r\nimport findUpClassName from './findUpClassName';\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport type ListNavigationOptions = {\r\n list: HTMLElement,\r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean | Promise,\r\n once: boolean,\r\n waitForKey?: string[]\r\n};\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\r\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\r\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS));\r\n\r\n let target: Element;\r\n const getCurrentTarget = () => {\r\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\r\n };\r\n\r\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\r\n if(target === _target) {\r\n return;\r\n }\r\n\r\n let hadTarget = false;\r\n if(target) {\r\n hadTarget = true;\r\n target.classList.remove(ACTIVE_CLASS_NAME);\r\n }\r\n\r\n target = _target;\r\n if(!target) return;\r\n target.classList.add(ACTIVE_CLASS_NAME);\r\n\r\n if(hadTarget && scrollable && scrollTo) {\r\n fastSmoothScroll({\r\n container: scrollable,\r\n element: target as HTMLElement,\r\n position: 'center',\r\n forceDuration: 100,\r\n axis: type === 'x' ? 'x' : 'y'\r\n });\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = async(target: Element) => {\r\n const canContinue = await onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n let attached = false;\r\n const attach = () => {\r\n if(attached) return;\r\n attached = true;\r\n // const input = document.activeElement as HTMLElement;\r\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n list.addEventListener('mousemove', onMouseMove, {passive: true});\r\n attachClickEvent(list, onClick);\r\n };\r\n\r\n const detach = () => {\r\n if(!attached) return;\r\n attached = false;\r\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n list.removeEventListener('mousemove', onMouseMove);\r\n detachClickEvent(list, onClick);\r\n };\r\n\r\n const resetTarget = () => {\r\n if(waitForKeySet) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKeySet) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(waitForKeySet.has(e.key)) {\r\n cancelEvent(e);\r\n\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n onKeyDown = _onKeyDown;\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n\r\n waitForKeySet = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\r\n attach();\r\n\r\n return {\r\n attach,\r\n detach,\r\n resetTarget\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachListNavigation, {ListNavigationOptions} from '../../helpers/dom/attachListNavigation';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport {IS_MOBILE} from '../../environment/userAgent';\r\nimport rootScope from '../../lib/rootScope';\r\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\r\nimport SetTransition from '../singleTransition';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => void,\r\n hiding: () => void\r\n}> {\r\n protected hidden = true;\r\n protected container: HTMLElement;\r\n protected list: HTMLElement;\r\n protected resetTarget: () => void;\r\n protected attach: () => void;\r\n protected detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: ListNavigationOptions['onSelect'];\r\n protected waitForKey?: string[];\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller?: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n\r\n options.appendTo.append(this.container);\r\n\r\n this.attachNavigation();\r\n\r\n this.controller && this.controller.addHelper(this);\r\n }\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n if(enabled) {\r\n this.attach && this.attach();\r\n } else {\r\n this.detach && this.detach();\r\n }\r\n }\r\n\r\n protected onVisible = () => {\r\n if(this.detach) { // it can be so because 'visible' calls before animation's end\r\n this.detach();\r\n }\r\n\r\n const list = this.list;\r\n const {attach, detach, resetTarget} = attachListNavigation({\r\n list,\r\n type: this.listType,\r\n onSelect: this.onSelect,\r\n once: true,\r\n waitForKey: this.waitForKey\r\n });\r\n\r\n this.attach = attach;\r\n this.detach = detach;\r\n this.resetTarget = resetTarget;\r\n if(!IS_MOBILE && !this.navigationItem) {\r\n this.navigationItem = {\r\n type: 'autocomplete-helper',\r\n onPop: () => {\r\n this.navigationItem = undefined;\r\n this.toggle(true);\r\n },\r\n noBlurOnPop: true\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n\r\n this.addEventListener('hidden', () => {\r\n this.resetTarget = undefined;\r\n this.attach = undefined;\r\n this.detach = undefined;\r\n\r\n list.innerHTML = '';\r\n detach();\r\n\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n }, {once: true});\r\n };\r\n\r\n protected attachNavigation() {\r\n this.addEventListener('visible', this.onVisible);\r\n }\r\n\r\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\r\n if(this.init) {\r\n return;\r\n }\r\n\r\n if(hide === undefined) {\r\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\r\n }\r\n\r\n if(this.hidden === hide) {\r\n if(!hide) {\r\n this.dispatchEvent('visible'); // reset target and listener\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.hidden = hide;\r\n\r\n if(!hide) {\r\n this.controller && this.controller.hideOtherHelpers(this);\r\n this.dispatchEvent('visible'); // fire it before so target will be set\r\n } else {\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n\r\n if(!fromController && this.controller) {\r\n this.controller.hideOtherHelpers();\r\n }\r\n\r\n if(this.detach) { // force detach here\r\n this.detach();\r\n }\r\n }\r\n\r\n const useRafs = this.controller || hide ? 0 : 2;\r\n\r\n if(hide) {\r\n this.dispatchEvent('hiding');\r\n }\r\n\r\n SetTransition(\r\n this.container,\r\n 'is-visible',\r\n !hide,\r\n rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0,\r\n () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n },\r\n useRafs\r\n );\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\r\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport {CHAT_ANIMATION_GROUP} from '../../lib/appManagers/appImManager';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport rootScope from '../../lib/rootScope';\r\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\r\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\r\nimport LazyLoadQueue from '../lazyLoadQueue';\r\nimport Scrollable from '../scrollable';\r\nimport attachStickerViewerListeners from '../stickerViewer';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n private listenerSetter: ListenerSetter;\r\n\r\n constructor(\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelperController,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo,\r\n controller,\r\n listType: 'xy',\r\n onSelect: async(target) => {\r\n return !(await EmoticonsDropdown.onMediaClick({target}, true));\r\n },\r\n waitForKey: ['ArrowUp', 'ArrowDown']\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n\r\n this.listenerSetter.removeAll();\r\n this.listenerSetter = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n preloadAnimatedEmojiSticker(emoticon);\r\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach((sticker) => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP, this.managers);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\r\nimport Button from '../button';\r\nimport PopupDatePicker from './datePicker';\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n // date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true,\r\n title: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MessageEntity} from '../../layer';\r\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\r\nimport getRichElementValue from './getRichElementValue';\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from './input';\r\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\r\nimport {ScrollableX} from '../scrollable';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelperController,\r\n chatInput: ChatInput,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo,\r\n controller,\r\n listType: 'x',\r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach((emoji) => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.render(emojis, firstChar !== ':');\r\n // console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport AvatarElement from '../avatar';\r\nimport PeerTitle from '../peerTitle';\r\nimport Scrollable from '../scrollable';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelperController,\r\n protected className: string,\r\n onSelect: (target: Element) => boolean | void\r\n ) {\r\n super({\r\n appendTo,\r\n controller,\r\n listType: 'y',\r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach((d) => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n if(!doNotShow) {\r\n this.toggle(!data.length);\r\n }\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: options.peerId\r\n });\r\n\r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n setInnerHTML(name, wrapEmojiText(options.name));\r\n }\r\n\r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n setInnerHTML(description, wrapEmojiText(options.description));\r\n div.append(description);\r\n }\r\n\r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type 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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getMiddleware} from '../../helpers/middleware';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach((helper) => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\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 if(user.username) {\n str = '@' + user.username;\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 const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from './input';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\r\nimport rootScope from '../../lib/rootScope';\r\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\r\nimport confirmationPopup from '../confirmationPopup';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private managers: AppManagers;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n managers: AppManagers,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n await this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', async() => {\r\n await this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n\r\n attachClickEvent(this.element, (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public async checkForceReply() {\r\n const replyMarkup = await this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden &&\r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private async getReplyMarkup() {\r\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\r\n if(replyMarkup === undefined) {\r\n replyMarkup = await this.getReplyMarkup() as any;\r\n }\r\n\r\n this.element.textContent = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n setInnerHTML(btn, wrapEmojiText(button.text));\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\r\n if(replyMarkup === undefined) {\r\n replyMarkup = await this.getReplyMarkup();\r\n }\r\n\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from './chat';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport {WebDocument} from '../../layer';\r\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport LazyLoadQueue from '../lazyLoadQueue';\r\nimport Scrollable from '../scrollable';\r\nimport {wrapPhoto} from '../wrappers';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport Button from '../button';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport GifsMasonry from '../gifsMasonry';\r\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\r\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\r\nimport renderImageWithFadeIn from '../../helpers/dom/renderImageWithFadeIn';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\r\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\r\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\r\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\r\nimport {AnimationItemGroup} from '../animationIntersector';\r\n\r\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private managers: AppManagers\r\n ) {\r\n super({\r\n appendTo,\r\n controller,\r\n listType: 'xy',\r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n ...this.chat.getMessageSendingParams(),\r\n clearDraft: true\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.managers.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n\r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n\r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n setInnerHTML(title, wrapEmojiText(item.title));\r\n\r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n setInnerHTML(description, wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n }));\r\n\r\n container.append(title, description);\r\n\r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n\r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n\r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container');\r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then((blob) => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then((dataURL) => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.animated) {\r\n this.superStickerRenderer.observeAnimated(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {AckedResult} from '../lib/mtproto/superMessagePort';\r\nimport {Modify} from '../types';\r\n\r\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\r\n return {\r\n cached: acked.cached,\r\n result: acked.cached ? await acked.result : acked.result\r\n };\r\n}\r\n\r\nexport function modifyAckedPromise(promise: Promise>) {\r\n return promise.then(modifyAckedResult);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport {getMiddleware} from '../../helpers/middleware';\r\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\r\nimport {ChatFull} from '../../layer';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\r\nimport {i18n} from '../../lib/langPack';\r\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\r\nimport rootScope from '../../lib/rootScope';\r\nimport AvatarElement from '../avatar';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport PeerTitle from '../peerTitle';\r\nimport SetTransition from '../singleTransition';\r\nimport getChatMembersString from '../wrappers/getChatMembersString';\r\n\r\nconst SEND_AS_ANIMATION_DURATION = 300;\r\n\r\nexport default class ChatSendAs {\r\n private avatar: AvatarElement;\r\n private container: HTMLElement;\r\n private closeBtn: HTMLElement;\r\n private btnMenu: HTMLElement;\r\n private sendAsPeerIds: PeerId[];\r\n private sendAsPeerId: PeerId;\r\n private updatingPromise: ReturnType;\r\n private middleware: ReturnType;\r\n private listenerSetter: ListenerSetter;\r\n private peerId: PeerId;\r\n private addedListener: boolean;\r\n\r\n constructor(\r\n private managers: AppManagers,\r\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\r\n private onChange: (sendAsPeerId: PeerId) => void\r\n ) {\r\n this.middleware = getMiddleware();\r\n this.listenerSetter = new ListenerSetter();\r\n this.construct();\r\n }\r\n\r\n private construct() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('new-message-send-as-container');\r\n\r\n this.closeBtn = document.createElement('div');\r\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\r\n\r\n const sendAsButtons: ButtonMenuItemOptions[] = [{\r\n text: 'SendMessageAsTitle',\r\n onClick: undefined\r\n }];\r\n\r\n let previousAvatar: HTMLElement;\r\n const onSendAsMenuToggle = (visible: boolean) => {\r\n if(visible) {\r\n previousAvatar = this.avatar;\r\n }\r\n\r\n const isChanged = this.avatar !== previousAvatar;\r\n const useRafs = !visible && isChanged ? 2 : 0;\r\n\r\n SetTransition(this.closeBtn, 'is-visible', visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n if(!isChanged) {\r\n SetTransition(previousAvatar, 'is-visible', !visible, SEND_AS_ANIMATION_DURATION, undefined, useRafs);\r\n }\r\n };\r\n\r\n ButtonMenuToggle({\r\n noRipple: true,\r\n listenerSetter: this.listenerSetter,\r\n container: this.container\r\n }, 'top-right', sendAsButtons, () => {\r\n onSendAsMenuToggle(true);\r\n }, () => {\r\n onSendAsMenuToggle(false);\r\n });\r\n\r\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\r\n this.btnMenu = this.container.firstElementChild as any;\r\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\r\n this.container.append(this.closeBtn);\r\n }\r\n\r\n private async updateButtons(peerIds: PeerId[]) {\r\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\r\n const textElement = document.createElement('div');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('btn-menu-item-subtitle');\r\n if(sendAsPeerId.isUser()) {\r\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\r\n } else if(sendAsPeerId === this.peerId) {\r\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\r\n } else {\r\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\r\n }\r\n\r\n textElement.append(\r\n new PeerTitle({peerId: sendAsPeerId}).element,\r\n subtitle\r\n );\r\n\r\n return {\r\n onClick: idx ? async() => {\r\n const currentPeerId = this.peerId;\r\n this.changeSendAsPeerId(sendAsPeerId);\r\n\r\n const middleware = this.middleware.get();\r\n const executeButtonsUpdate = () => {\r\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\r\n const peerIds = this.sendAsPeerIds.slice();\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateButtons(peerIds);\r\n };\r\n\r\n if(rootScope.settings.animationsEnabled) {\r\n setTimeout(executeButtonsUpdate, 250);\r\n } else {\r\n executeButtonsUpdate();\r\n }\r\n\r\n // return;\r\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\r\n } : undefined,\r\n textElement\r\n };\r\n });\r\n\r\n const buttons = await Promise.all(promises);\r\n const btnMenu = ButtonMenu(buttons/* , this.listenerSetter */);\r\n buttons.forEach((button, idx) => {\r\n const peerId = peerIds[idx];\r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\r\n avatar.updateWithOptions({peerId});\r\n\r\n if(!idx) {\r\n avatar.classList.add('active');\r\n }\r\n\r\n button.element.prepend(avatar);\r\n });\r\n\r\n Array.from(this.btnMenu.children).slice(1).forEach((node) => node.remove());\r\n this.btnMenu.append(...Array.from(btnMenu.children));\r\n }\r\n\r\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n const previousAvatar = this.avatar;\r\n if(previousAvatar) {\r\n if(previousAvatar.peerId === sendAsPeerId) {\r\n return;\r\n }\r\n }\r\n\r\n if(!previousAvatar) {\r\n skipAnimation = true;\r\n }\r\n\r\n const useRafs = skipAnimation ? 0 : 2;\r\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\r\n const avatar = this.avatar = new AvatarElement();\r\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\r\n await avatar.updateWithOptions({\r\n isDialog: false,\r\n peerId: sendAsPeerId\r\n });\r\n\r\n SetTransition(avatar, 'is-visible', true, duration, undefined, useRafs);\r\n if(previousAvatar) {\r\n SetTransition(previousAvatar, 'is-visible', false, duration, () => {\r\n previousAvatar.remove();\r\n }, useRafs);\r\n }\r\n\r\n this.container.append(avatar);\r\n }\r\n\r\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\r\n this.sendAsPeerId = sendAsPeerId;\r\n this.onChange(sendAsPeerId);\r\n return this.updateAvatar(sendAsPeerId, skipAnimation);\r\n }\r\n\r\n private getDefaultSendAs(): Promise> {\r\n // return rootScope.myId;\r\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\r\n return {\r\n cached: acked.cached,\r\n result: acked.result.then((channelFull) => {\r\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\r\n })\r\n };\r\n });\r\n }\r\n\r\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\r\n const peerId = this.peerId;\r\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\r\n return;\r\n }\r\n\r\n const middleware = this.middleware.get(() => {\r\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\r\n });\r\n\r\n const {container} = this;\r\n const chatId = peerId.toChatId();\r\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\r\n // const result = Promise.resolve(this.getDefaultSendAs());\r\n\r\n const wasSkippingAnimation = skipAnimation;\r\n if(result instanceof Promise) {\r\n skipAnimation = undefined;\r\n }\r\n\r\n const auto = wasSkippingAnimation && !skipAnimation;\r\n\r\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\r\n if(!middleware() || sendAsPeerId === undefined) return;\r\n\r\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\r\n if(!middleware()) return;\r\n\r\n this.managers.appChatsManager.getSendAs(chatId).then((peers) => {\r\n if(!middleware()) return;\r\n\r\n const peerIds = peers.map((peer) => getPeerId(peer));\r\n this.sendAsPeerIds = peerIds.slice();\r\n\r\n indexOfAndSplice(peerIds, sendAsPeerId);\r\n peerIds.unshift(sendAsPeerId);\r\n this.updateButtons(peerIds);\r\n });\r\n\r\n const callback = () => {\r\n this.onReady(container, skipAnimation);\r\n\r\n if(!this.addedListener) {\r\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\r\n if(this.peerId === peerId) {\r\n this.update();\r\n }\r\n });\r\n\r\n this.addedListener = true;\r\n }\r\n };\r\n\r\n if(auto) {\r\n callback();\r\n return;\r\n }\r\n\r\n return callback;\r\n });\r\n\r\n updatingPromise.finally(() => {\r\n if(this.updatingPromise === updatingPromise) {\r\n this.updatingPromise = undefined;\r\n }\r\n });\r\n\r\n if(!auto) {\r\n return updatingPromise;\r\n }\r\n }\r\n\r\n public update(skipAnimation?: boolean) {\r\n return this.updateManual(skipAnimation).then((callback) => callback && callback());\r\n }\r\n\r\n public setPeerId(peerId?: PeerId) {\r\n /* if(this.avatar) {\r\n this.avatar.remove();\r\n this.avatar = undefined;\r\n } */\r\n\r\n this.middleware.clean();\r\n this.updatingPromise = undefined;\r\n this.peerId = peerId;\r\n }\r\n\r\n public destroy() {\r\n this.container.remove();\r\n this.setPeerId();\r\n this.listenerSetter.removeAll();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\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.inputFake.innerHTML = this.input.innerHTML;\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');\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.setAttribute('contenteditable', 'true');\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.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition(this.input, className, true, transitionDuration, () => {\n this.input.classList.remove(className);\n });\n }\n\n public setValueSilently(value: string, fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.inputFake.innerHTML = value;\n if(!fromSet) {\n this.onFakeInput();\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\r\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\r\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\n// import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from '../../lib/opusDecodeController';\r\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\r\nimport emoticonsDropdown from '../emoticonsDropdown';\r\nimport PopupCreatePoll from '../popups/createPoll';\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport {toast} from '../toast';\r\nimport {wrapReply} from '../wrappers';\r\nimport InputField from '../inputField';\r\nimport {MessageEntity, DraftMessage, WebPage, Message, ChatFull, UserFull} from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\r\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\r\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\r\nimport {generateTail} from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport {MarkdownType, markdownTags} from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport {putPreloader} from '../putPreloader';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport {fastRaf} from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport ChatBotCommands from './botCommands';\r\nimport copy from '../../helpers/object/copy';\r\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\r\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\r\nimport PopupElement from '../popups';\r\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\r\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\r\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\r\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\r\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\r\nimport wrapDraft from '../wrappers/draft';\r\nimport wrapMessageForReply from '../wrappers/messageForReply';\r\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport contextMenuController from '../../helpers/contextMenuController';\r\nimport {emojiFromCodePoints} from '../../vendor/emoji';\r\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\r\nimport ChatSendAs from './sendAs';\r\nimport filterAsync from '../../helpers/array/filterAsync';\r\nimport InputFieldAnimated from '../inputFieldAnimated';\r\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\r\nimport PopupStickers from '../popups/stickers';\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputFieldAnimated;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean | Promise})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n };\r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void | Promise;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n\r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n private botCommandsToggle: HTMLElement;\r\n private botCommands: ChatBotCommands;\r\n private botCommandsIcon: HTMLDivElement;\r\n private hasBotCommands: boolean;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n private sendAs: ChatSendAs;\r\n public sendAsPeerId: PeerId;\r\n\r\n constructor(\r\n private chat: Chat,\r\n private appImManager: AppImManager,\r\n private managers: AppManagers\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input', 'hide');\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n\r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n\r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach((group) => {\r\n const container = RadioForm(group.elements.map((e) => {\r\n return {\r\n container: e,\r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId).then((mid) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(mid) {\r\n this.chat.setMessageId(mid);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n managers: this.managers,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n\r\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\r\n this.botCommandsToggle = document.createElement('div');\r\n this.botCommandsToggle.classList.add('new-message-bot-commands');\r\n\r\n const scaler = document.createElement('div');\r\n scaler.classList.add('new-message-bot-commands-icon-scale');\r\n\r\n const icon = this.botCommandsIcon = document.createElement('div');\r\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\r\n scaler.append(icon);\r\n this.botCommandsToggle.append(scaler);\r\n\r\n attachClickEvent(this.botCommandsToggle, (e) => {\r\n cancelEvent(e);\r\n const isShown = icon.classList.contains('state-back');\r\n if(isShown) {\r\n this.botCommands.toggle(true);\r\n icon.classList.remove('state-back');\r\n } else {\r\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\r\n icon.classList.add('state-back');\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.botCommands.addEventListener('visible', () => {\r\n icon.classList.add('state-back');\r\n });\r\n\r\n this.botCommands.addEventListener('hiding', () => {\r\n icon.classList.remove('state-back');\r\n });\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n // this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.managers);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n\r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs.has(this.chat.peerId)) {\r\n if(this.startParam === BOT_START_PARAM) {\r\n this.setStartParam();\r\n } else { // updateNewMessage comes earlier than dialog appers\r\n this.center(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n // encoderBitRate: 32,\r\n // encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n const files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n\r\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n\r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n\r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n // let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then((result) => {\r\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n\r\n opusDecodeController.setKeepAlive(false);\r\n\r\n // тут objectURL ставится уже с audio/wav\r\n this.managers.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n\r\n if(scale < 1) {\r\n const br = 12;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n // scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform,\r\n borderRadius,\r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer &&\r\n neededFakeContainer.classList.contains('chat-input-control') &&\r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom,\r\n widthTo\r\n };\r\n }\r\n\r\n public async center(animate = false) {\r\n return this._center(await this.getNeededFakeContainer(), animate);\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public async getNeededFakeContainer(startParam = this.startParam) {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(\r\n startParam !== undefined ||\r\n !(await this.chat.canSend()) ||\r\n this.chat.type === 'pinned' ||\r\n await this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const popups = PopupElement.getPopups(PopupStickers);\r\n popups.forEach((popup) => popup.hide());\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public async setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n\r\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true),\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n // this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.classList.add('hide');\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n\r\n if(!draft) {\r\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n const wrappedDraft = wrapDraft(draft);\r\n\r\n if(this.messageInputField.value === wrappedDraft && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n private createSendAs() {\r\n this.sendAsPeerId = undefined;\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n let firstChange = true;\r\n this.sendAs = new ChatSendAs(\r\n this.managers,\r\n (container, skipAnimation) => {\r\n let useRafs = 0;\r\n if(!container.parentElement) {\r\n this.newMessageWrapper.prepend(container);\r\n useRafs = 2;\r\n }\r\n\r\n this.updateOffset('as', true, skipAnimation, useRafs);\r\n },\r\n (sendAsPeerId) => {\r\n this.sendAsPeerId = sendAsPeerId;\r\n\r\n // do not change placeholder earlier than finishPeerChange does\r\n if(firstChange) {\r\n firstChange = false;\r\n return;\r\n }\r\n\r\n this.getPlaceholderKey().then((key) => {\r\n this.updateMessageInputPlaceholder(key);\r\n });\r\n }\r\n );\r\n } else {\r\n this.sendAs = undefined;\r\n }\r\n\r\n return this.sendAs;\r\n }\r\n\r\n public async finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\r\n\r\n const previousSendAs = this.sendAs;\r\n const sendAs = this.createSendAs();\r\n\r\n const [\r\n isBroadcast,\r\n canPinMessage,\r\n isBot,\r\n canSend,\r\n neededFakeContainer,\r\n ackedPeerFull,\r\n ackedScheduledMids,\r\n setSendAsCallback,\r\n filteredAttachMenuButtons\r\n ] = await Promise.all([\r\n this.managers.appPeersManager.isBroadcast(peerId),\r\n this.managers.appPeersManager.canPinMessage(peerId),\r\n this.managers.appPeersManager.isBot(peerId),\r\n this.chat.canSend(),\r\n this.getNeededFakeContainer(startParam),\r\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\r\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\r\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\r\n this.filterAttachMenuButtons()\r\n ]);\r\n\r\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\r\n\r\n return () => {\r\n // console.warn('[input] finishpeerchange start');\r\n\r\n chatInput.classList.remove('hide');\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', canPinMessage);\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled && ackedScheduledMids) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n callbackify(ackedScheduledMids.result, (mids) => {\r\n if(!middleware() || !mids) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(this.newMessageWrapper) {\r\n this.updateOffset(null, false, true);\r\n }\r\n\r\n if(botCommandsToggle) {\r\n this.hasBotCommands = undefined;\r\n this.botCommands.toggle(true, undefined, true);\r\n this.updateBotCommandsToggle(true);\r\n botCommandsToggle.remove();\r\n if(isBot) {\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const result = ackedPeerFull.result;\r\n callbackify(result, (userFull) => {\r\n if(!middleware()) return;\r\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\r\n });\r\n }\r\n }\r\n\r\n if(previousSendAs) {\r\n previousSendAs.destroy();\r\n }\r\n\r\n if(setSendAsCallback) {\r\n setSendAsCallback();\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n\r\n if(this.messageInput) {\r\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n\r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n\r\n this.startParam = startParam;\r\n\r\n this._center(neededFakeContainer, false);\r\n\r\n // console.warn('[input] finishpeerchange ends');\r\n };\r\n }\r\n\r\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\r\n if(type) {\r\n this.newMessageWrapper.dataset.offset = type;\r\n } else {\r\n delete this.newMessageWrapper.dataset.offset;\r\n }\r\n\r\n SetTransition(this.newMessageWrapper, 'has-offset', forwards, skipAnimation ? 0 : 300, undefined, useRafs);\r\n }\r\n\r\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\r\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\r\n this.updateBotCommandsToggle(skipAnimation);\r\n }\r\n\r\n private updateBotCommandsToggle(skipAnimation?: boolean) {\r\n const {botCommandsToggle, hasBotCommands} = this;\r\n\r\n const show = !!hasBotCommands && this.isInputEmpty();\r\n if(!hasBotCommands) {\r\n if(!botCommandsToggle.parentElement) {\r\n return;\r\n }\r\n\r\n botCommandsToggle.remove();\r\n }\r\n\r\n const forwards = show;\r\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\r\n\r\n if(!botCommandsToggle.parentElement) {\r\n this.newMessageWrapper.prepend(botCommandsToggle);\r\n }\r\n\r\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\r\n }\r\n\r\n private async getPlaceholderKey() {\r\n const {peerId, threadId} = this.chat;\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if(\r\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\r\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\r\n ) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n return key;\r\n }\r\n\r\n private updateMessageInputPlaceholder(key: LangPackKey) {\r\n // console.warn('[input] update placeholder');\r\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\r\n if(!i) {\r\n return;\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n\r\n private filterAttachMenuButtons() {\r\n if(!this.attachMenuButtons) return;\r\n const {peerId, threadId} = this.chat;\r\n return filterAsync(this.attachMenuButtons, (button) => {\r\n return button.verify(peerId, threadId);\r\n });\r\n }\r\n\r\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canSend;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canSend);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n this.updateMessageInputPlaceholder(placeholderKey);\r\n\r\n this.attachMenuButtons && this.attachMenuButtons.forEach((button) => {\r\n button.element.classList.toggle('hide', !visible.includes(button));\r\n });\r\n\r\n if(!canSend) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n\r\n if(attachMenu) {\r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputFieldAnimated({\r\n placeholder: 'Message',\r\n name: 'message',\r\n withLinebreaks: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n\r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n\r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n // this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) {\r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const MONOSPACE_FONT = 'var(--font-monospace)';\r\n const SPOILER_FONT = 'spoiler';\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n // type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\r\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const checkType = (type: MarkdownType) => {\r\n let haveThisType = false;\r\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n return haveThisType;\r\n };\r\n\r\n // * monospace can't be combined with different types\r\n if(type === 'monospace' || type === 'spoiler') {\r\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const haveThisType = checkType(type);\r\n // executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(this.resetCurrentFontFormatting());\r\n } else {\r\n if(type === 'monospace' || checkType('monospace')) {\r\n executed.push(this.resetCurrentFormatting());\r\n }\r\n\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n if(checkType('monospace')) {\r\n executed.push(this.resetCurrentFormatting());\r\n }\r\n\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n // checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private resetCurrentFormatting() {\r\n return document.execCommand('removeFormat', false, null);\r\n }\r\n\r\n private resetCurrentFontFormatting() {\r\n return document.execCommand('fontName', false, 'Roboto');\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace',\r\n 'KeyP': 'spoiler'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n\r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n // return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n // console.log('messageInput input', this.messageInput.innerText);\r\n // const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n\r\n // const entities = parseEntities(value);\r\n const value = parseMarkdown(richValue, markdownEntities, true);\r\n const entities = mergeEntities(markdownEntities, parseEntities(value));\r\n\r\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n // console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n // console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n\r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n const isEmpty = !richValue.trim();\r\n if(isEmpty) {\r\n if(this.lastTimeType) {\r\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n\r\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\r\n // * so have to reset formatting\r\n if(document.activeElement === this.messageInput) {\r\n // document.execCommand('styleWithCSS', false, 'true');\r\n setTimeout(() => {\r\n if(document.activeElement === this.messageInput) {\r\n this.resetCurrentFontFormatting();\r\n }\r\n }, 0);\r\n // document.execCommand('styleWithCSS', false, 'false');\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n\r\n if(this.botCommands) {\r\n this.botCommands.toggle(true);\r\n }\r\n }\r\n\r\n if(this.botCommands) {\r\n this.updateBotCommandsToggle();\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = parseEntities(fullValue);\r\n mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach((entity) => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n // const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\r\n this.messageInputField.setValueSilently(value);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n // saveExecuted();\r\n\r\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n // return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = parseMarkdown(value, entities, true);\r\n entities = mergeEntities(entities, parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n\r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper &&\r\n rootScope.settings.stickers.suggest &&\r\n await this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\r\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n\r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n\r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n\r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n\r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = async(e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend('send_media'))) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n\r\n this.setRecording(true);\r\n opusDecodeController.setKeepAlive(true);\r\n\r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n // analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n const r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach((value) => {\r\n sum += value;\r\n });\r\n\r\n const percents = Math.min(1, (sum / max) + min);\r\n // console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n const diff = Date.now() - this.recordStartTime;\r\n const ms = diff % 1000;\r\n\r\n const formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\r\n\r\n this.recordTimeEl.innerText = formatted;\r\n\r\n fastRaf(r);\r\n };\r\n\r\n r();\r\n }).catch((e: Error) => {\r\n switch(e.name as string) {\r\n case 'NotAllowedError': {\r\n toast('Please allow access to your microphone');\r\n break;\r\n }\r\n\r\n case 'NotReadableError': {\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n default:\r\n console.error('Recorder start error:', e, e.name, e.message);\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = async(e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n // if(this.helperFunc) {\r\n await this.helperFunc();\r\n // }\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n contextMenuController.openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const forwarding = copy(this.forwarding);\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(forwarding, () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n // this.messageInput.innerText = '';\r\n } else {\r\n // this.attachMessageInputField();\r\n // this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = await this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter((entity) => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach((entity) => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {peerId} = chat;\r\n const {noWebPage} = this;\r\n const sendingParams = this.chat.getMessageSendingParams();\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n // return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.managers.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.managers.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n ...sendingParams,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n clearDraft: true\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.onMessageSent(true);\r\n } else {\r\n this.onMessageSent(false, false);\r\n }\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n // setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n ...sendingParams,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n // }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public async sendMessageWithDocument(\r\n document: MyDocument | DocId,\r\n force = false,\r\n clearDraft = false,\r\n silent = false\r\n ) {\r\n document = await this.managers.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\r\n return false;\r\n }\r\n\r\n if(!document) {\r\n return false;\r\n }\r\n\r\n if(getStickerEffectThumb(document) && !rootScope.premium) {\r\n return false;\r\n }\r\n\r\n this.managers.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n ...this.chat.getMessageSendingParams(),\r\n isMedia: true,\r\n clearDraft: clearDraft || undefined,\r\n silent\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.unshiftRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public async initMessageEditing(mid: number) {\r\n const message = (await this.chat.getMessage(mid)) as Message.message;\r\n\r\n let input = documentFragmentToHTML(wrapDraftText(message.message, {entities: message.totalEntities}));\r\n const f = async() => {\r\n const replyFragment = await wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = async() => {\r\n // const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n const p = fromPeerIds.map(async(fromPeerId) => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n const promises = mids.map(async(mid) => {\r\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n await Promise.all(promises);\r\n\r\n length += mids.length;\r\n });\r\n\r\n await Promise.all(p);\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map((smth) => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\r\n\r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = await wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles,\r\n delimiter,\r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'),\r\n delimiter,\r\n senderTitles\r\n );\r\n }\r\n\r\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n\r\n f();\r\n }\r\n\r\n public async initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n\r\n let message = await this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(!message) { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.managers.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(!message) {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n\r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType,\r\n callerFunc: () => void,\r\n title: Parameters[0] = '',\r\n subtitle: Parameters[1] = '',\r\n input?: string,\r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n\r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const {container} = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(container);\r\n } else {\r\n replyParent.insertBefore(container, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n container.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return container;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\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) {\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 documentFragmentToHTML(wrapDraftText(draft.message, {entities: totalEntities}));\n}\n","/*\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 setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from './chat';\r\nimport type ChatTopbar from './topbar';\r\nimport mediaSizes from '../../helpers/mediaSizes';\r\nimport DivAndCaption from '../divAndCaption';\r\nimport ripple from '../ripple';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport {Message} from '../../layer';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\n\r\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\r\nconst CLASSNAME_BASE = 'pinned-container';\r\nconst HEIGHT = 52;\r\n\r\nexport default class PinnedContainer {\r\n public wrapperUtils: HTMLElement;\r\n public btnClose: HTMLElement;\r\n protected wrapper: HTMLElement;\r\n\r\n protected topbar: ChatTopbar;\r\n protected chat: Chat;\r\n protected listenerSetter: ListenerSetter;\r\n public className: string;\r\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\r\n\r\n protected floating = false;\r\n\r\n public onClose?: () => void | Promise;\r\n\r\n constructor(options: {\r\n topbar: PinnedContainer['topbar'],\r\n chat: PinnedContainer['chat'],\r\n listenerSetter: PinnedContainer['listenerSetter'],\r\n className: PinnedContainer['className'],\r\n divAndCaption: PinnedContainer['divAndCaption'],\r\n onClose?: PinnedContainer['onClose'],\r\n floating?: PinnedContainer['floating']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n const {divAndCaption, className} = this;\r\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\r\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\r\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\r\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\r\n\r\n this.btnClose = document.createElement('button');\r\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\r\n ripple(this.wrapper);\r\n\r\n this.wrapperUtils = document.createElement('div');\r\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\r\n this.wrapperUtils.append(this.btnClose);\r\n\r\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\r\n\r\n divAndCaption.container.append(this.wrapper/* , this.close */);\r\n\r\n this.attachOnCloseEvent(this.btnClose);\r\n }\r\n\r\n public attachOnCloseEvent(elem: HTMLElement) {\r\n attachClickEvent(elem, (e) => {\r\n cancelEvent(e);\r\n\r\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\r\n if(needClose) {\r\n this.toggle(true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public toggle(hide?: boolean) {\r\n const isHidden = this.divAndCaption.container.classList.contains('hide');\r\n if(hide === undefined) {\r\n hide = !isHidden;\r\n } else if(hide === isHidden) {\r\n return;\r\n }\r\n\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n\r\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\r\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\r\n\r\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\r\n this.divAndCaption.container.classList.toggle('hide', hide);\r\n\r\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\r\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\r\n\r\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\r\n // const maxActive = hide ? 0 : 1;\r\n\r\n // * not sure when it became unneeded\r\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\r\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\r\n // }\r\n\r\n this.topbar.setFloating();\r\n this.topbar.setUtilsWidth();\r\n }\r\n\r\n public isVisible() {\r\n return !this.divAndCaption.container.classList.contains('hide');\r\n }\r\n\r\n public isFloating() {\r\n return this.divAndCaption.container.classList.contains('is-floating');\r\n }\r\n\r\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 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","// 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from './topbar';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport PinnedContainer from './pinnedContainer';\r\nimport PinnedMessageBorder from './pinnedMessageBorder';\r\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\r\nimport rootScope from '../../lib/rootScope';\r\nimport Chat from './chat';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\r\nimport {i18n} from '../../lib/langPack';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport throttle from '../../helpers/schedulers/throttle';\r\nimport {AppManagers} from '../../lib/appManagers/managers';\r\nimport {Message} from '../../layer';\r\nimport {logger} from '../../lib/logger';\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n\r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n // this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\r\n const byDecimal = Array.from('' + number).map((n) => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n // const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n // this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n private static LOAD_COUNT = 50;\r\n private static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n private pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n private pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n private wasPinnedIndex = 0;\r\n private wasPinnedMediaIndex = 0;\r\n\r\n public locked = false;\r\n private waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n private mids: number[] = [];\r\n private offsetIndex = 0;\r\n\r\n private loading = false;\r\n private loadedBottom = false;\r\n private loadedTop = false;\r\n\r\n private animatedSubtitle: AnimatedSuper;\r\n private animatedMedia: AnimatedSuper;\r\n private animatedCounter: AnimatedCounter;\r\n\r\n private listenerSetter: ListenerSetter;\r\n private scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n private getCurrentIndexPromise: Promise = null;\r\n private btnOpen: HTMLButtonElement;\r\n\r\n private setPinnedMessage: () => void;\r\n\r\n private isStatic: boolean;\r\n\r\n private debug: boolean;\r\n\r\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\r\n\r\n private log: ReturnType;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\r\n this.listenerSetter = new ListenerSetter();\r\n this.log = logger('PM');\r\n this.debug = true;\r\n this.isStatic = false;\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar,\r\n chat,\r\n listenerSetter: this.listenerSetter,\r\n className: 'message',\r\n divAndCaption: dAC,\r\n onClose: async() => {\r\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\r\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.chat.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.chat.peerId) {\r\n // this.wasPinnedIndex = 0;\r\n // setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n // }, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.chat.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n // return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n // const perf = performance.now();\r\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n // return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n // this.log('setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n\r\n // if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n // this.log('testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n // currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n // const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\r\n log && log('start', mid, correctAfter);\r\n\r\n let gotRest = false;\r\n const promises = [\r\n this.managers.appMessagesManager.getSearch({\r\n peerId: this.chat.peerId,\r\n inputFilter: {_: 'inputMessagesFilterPinned'},\r\n maxId: mid,\r\n limit: ChatPinnedMessage.LOAD_COUNT,\r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then((r) => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n\r\n if(!this.pinnedMaxMid) {\r\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId).then((p) => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n // this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n\r\n promises.push(promise as any);\r\n }\r\n\r\n const result = (await Promise.all(promises))[0];\r\n\r\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n\r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map((message) => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n\r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n\r\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.log.error('getCurrentIndex error', err);\r\n }\r\n\r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n // return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.log('handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n\r\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.log('handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.log.error('handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = await this.chat.getMessage(mid);\r\n if(!message) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n // ///this.log('setting pinned message', message);\r\n // return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n // const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = await this.chat.getMessage(this.pinnedMid);\r\n\r\n // this.animatedCounter.prepareNumber(count);\r\n\r\n // setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n // }, 100);\r\n\r\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = await wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: (message as Message.message).message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n // }\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n // });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from '../listenerSetter';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n // alert('isDown: ' + !!isDown);\r\n };\r\n\r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n // this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {time: number, langKey: LangPackKey}[] = [{\n time: ONE_HOUR,\n langKey: 'ChatList.Mute.1Hour'\n}, {\n time: ONE_HOUR * 4,\n langKey: 'ChatList.Mute.4Hours'\n}, {\n time: ONE_HOUR * 8,\n langKey: 'ChatList.Mute.8Hours'\n}, {\n time: ONE_HOUR * 24,\n langKey: 'ChatList.Mute.1Day'\n}, {\n time: ONE_HOUR * 24 * 3,\n langKey: 'ChatList.Mute.3Days'\n}, {\n time: -1,\n langKey: 'ChatList.Mute.Forever'\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer(peerId, time === -1 ? MUTE_UNTIL : tsNow(true) + time);\n }\n }],\n body: true\n });\n\n const name = 'mute-time';\n const rows = times.map((time) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: time.langKey,\n name,\n value: '' + time.time\n })\n });\n\n return row;\n });\n\n let time: number;\n const radioForm = RadioFormFromRows(rows, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\n\n rows[rows.length - 1].radioField.checked = true;\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\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\r\n\r\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\r\n\r\nlet audioAsset: AudioAssetPlayer;\r\nexport default function getGroupCallAudioAsset() {\r\n return audioAsset ??= new AudioAssetPlayer([\r\n 'group_call_connect.mp3',\r\n 'group_call_end.mp3',\r\n 'group_call_start.mp3',\r\n 'voip_onallowtalk.mp3'\r\n ]);\r\n}\r\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: DisplayMediaStreamConstraints = {\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: DisplayMediaStreamConstraints) {\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","/*\n * 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: DisplayMediaStreamConstraints,\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","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\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 * 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","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 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","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 * 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 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 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\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","/*\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\r\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\r\nimport {AppManagers} from '../appManagers/managers';\r\nimport {logger} from '../logger';\r\nimport rootScope from '../rootScope';\r\nimport GroupCallInstance from './groupCallInstance';\r\nimport GROUP_CALL_STATE from './groupCallState';\r\nimport createMainStreamManager from './helpers/createMainStreamManager';\r\nimport {generateSsrc} from './localConferenceDescription';\r\nimport {WebRTCLineType} from './sdpBuilder';\r\nimport StreamManager from './streamManager';\r\nimport {Ssrc} from './types';\r\n\r\nconst IS_MUTED = true;\r\n\r\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\r\n return [\r\n makeSsrcFromParticipant(participant, 'audio', participant.source),\r\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\r\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\r\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\r\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\r\n ].filter(Boolean);\r\n};\r\n\r\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\r\n return generateSsrc(type, source, endpoint);\r\n}\r\n\r\nexport function generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\r\n return source && {\r\n _: 'groupCallParticipantVideo',\r\n pFlags: {},\r\n endpoint: '',\r\n source_groups: source.sourceGroups,\r\n audio_source: audioSource\r\n };\r\n}\r\n\r\nexport class GroupCallsController extends EventListenerBase<{\r\n instance: (instance: GroupCallInstance) => void\r\n}> {\r\n private audioAsset: ReturnType;\r\n private log: ReturnType;\r\n private currentGroupCall: GroupCallInstance;\r\n private managers: AppManagers;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.audioAsset = getGroupCallAudioAsset();\r\n this.log = logger('GCC');\r\n\r\n rootScope.addEventListener('group_call_update', (groupCall) => {\r\n const {currentGroupCall} = this;\r\n if(currentGroupCall?.id === groupCall.id) {\r\n currentGroupCall.groupCall = groupCall;\r\n\r\n if(groupCall._ === 'groupCallDiscarded') {\r\n currentGroupCall.hangUp(false, false, true);\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\r\n const {currentGroupCall} = this;\r\n if(currentGroupCall?.id === groupCallId) {\r\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\r\n }\r\n });\r\n }\r\n\r\n get groupCall() {\r\n return this.currentGroupCall;\r\n }\r\n\r\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\r\n this.currentGroupCall = groupCall;\r\n\r\n if(groupCall) {\r\n this.dispatchEvent('instance', groupCall);\r\n }\r\n }\r\n\r\n public startConnectingSound() {\r\n this.stopConnectingSound();\r\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\r\n }\r\n\r\n public stopConnectingSound() {\r\n this.audioAsset.stopSound();\r\n this.audioAsset.cancelDelayedPlay();\r\n }\r\n\r\n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\r\n this.audioAsset.createAudio();\r\n\r\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\r\n\r\n let streamManager: StreamManager;\r\n if(rejoin) {\r\n streamManager = this.currentGroupCall.connections.main.streamManager;\r\n } else {\r\n streamManager = await createMainStreamManager(muted, joinVideo);\r\n }\r\n\r\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\r\n }\r\n\r\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\r\n const log = this.log.bindPrefix('joinGroupCallInternal');\r\n log('start', groupCallId);\r\n\r\n const type: GroupCallConnectionType = 'main';\r\n\r\n let {currentGroupCall} = this;\r\n if(currentGroupCall && rejoin) {\r\n // currentGroupCall.connections.main.connection = connection;\r\n currentGroupCall.handleUpdateGroupCallParticipants = false;\r\n currentGroupCall.updatingSdp = false;\r\n log('update currentGroupCall', groupCallId, currentGroupCall);\r\n } else {\r\n currentGroupCall = new GroupCallInstance({\r\n chatId,\r\n id: groupCallId,\r\n managers: this.managers\r\n });\r\n\r\n currentGroupCall.fixSafariAudio();\r\n\r\n currentGroupCall.addEventListener('state', (state) => {\r\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\r\n this.setCurrentGroupCall(null);\r\n this.stopConnectingSound();\r\n this.audioAsset.playSound('group_call_end.mp3');\r\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\r\n }\r\n });\r\n\r\n currentGroupCall.groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\r\n\r\n const connectionInstance = currentGroupCall.createConnectionInstance({\r\n streamManager,\r\n type,\r\n options: {\r\n type,\r\n isMuted: muted,\r\n joinVideo,\r\n rejoin\r\n }\r\n });\r\n\r\n const connection = connectionInstance.createPeerConnection();\r\n connection.addEventListener('negotiationneeded', () => {\r\n connectionInstance.negotiate();\r\n });\r\n\r\n connection.addEventListener('track', (event) => {\r\n log('ontrack', event);\r\n currentGroupCall.onTrack(event);\r\n });\r\n\r\n connection.addEventListener('iceconnectionstatechange', () => {\r\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\r\n\r\n const {iceConnectionState} = connection;\r\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\r\n this.startConnectingSound();\r\n } else {\r\n this.stopConnectingSound();\r\n }\r\n\r\n switch(iceConnectionState) {\r\n case 'checking': {\r\n break;\r\n }\r\n\r\n case 'closed': {\r\n currentGroupCall.hangUp();\r\n break;\r\n }\r\n\r\n case 'completed': {\r\n break;\r\n }\r\n\r\n case 'connected': {\r\n if(!currentGroupCall.joined) {\r\n currentGroupCall.joined = true;\r\n this.audioAsset.playSound('group_call_start.mp3');\r\n this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'disconnected': {\r\n break;\r\n }\r\n\r\n case 'failed': {\r\n // TODO: replace with ICE restart\r\n currentGroupCall.hangUp();\r\n // connection.restartIce();\r\n break;\r\n }\r\n\r\n case 'new': {\r\n break;\r\n }\r\n }\r\n });\r\n\r\n connectionInstance.createDescription();\r\n connectionInstance.createDataChannel();\r\n\r\n connectionInstance.appendStreamToConference();\r\n\r\n this.setCurrentGroupCall(currentGroupCall);\r\n log('set currentGroupCall', groupCallId, currentGroupCall);\r\n\r\n this.startConnectingSound();\r\n\r\n return connectionInstance.negotiate();\r\n }\r\n }\r\n}\r\n\r\nconst groupCallsController = new GroupCallsController();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\r\nexport default groupCallsController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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","/*\n * 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';\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: (ButtonMenuItemOptions & {verify: ButtonToVerify['verify']})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: 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 = 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({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\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 deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n if(isMenuOpen) {\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons : []);\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()) 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.getChatTyped(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(this.peerId, false))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute(this.peerId);\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted(this.peerId, false))\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: '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 if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware()) 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\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n\n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\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 if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n if(this.chatAudio) {\n this.chatAudio.destroy();\n }\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 = this.peerId;\n\n let newAvatar: AvatarElement;\n if(this.avatarElement) {\n newAvatar = this.constructAvatar();\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}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(isAnyChat) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !chat?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(newAvatar) {\n this.avatarElement.replaceWith(newAvatar);\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.chat.wasAlreadyUsed) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n\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 }\n\n setTitleCallback();\n setStatusCallback && setStatusCallback();\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const peerId = this.peerId;\n const middleware = () => this.peerId === peerId;\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, this.chat.threadId);\n if(result.cached) {\n const historyResult = await result.result;\n count = historyResult.count;\n } else result.result.then((historyResult) => this.setTitle(historyResult.count));\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: true\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, false);\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 && 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) return;\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus(\n peerId,\n this.subtitle,\n needClear,\n false,\n () => peerId === this.peerId\n );\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n if(callback) {\n callback();\n }\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from '..';\r\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\r\nimport AppSearch, {SearchGroup} from '../../appSearch';\r\nimport ButtonIcon from '../../buttonIcon';\r\nimport InputSearch from '../../inputSearch';\r\nimport PopupElement from '../../popups';\r\nimport PopupDatePicker from '../../popups/datePicker';\r\nimport {SliderSuperTab} from '../../slider';\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n\r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n\r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from './topbar';\r\nimport AppSearch, {SearchGroup} from '../appSearch';\r\nimport PopupDatePicker from '../popups/datePicker';\r\nimport ripple from '../ripple';\r\nimport InputSearch from '../inputSearch';\r\nimport type Chat from './chat';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport whichChild from '../../helpers/dom/whichChild';\r\nimport replaceContent from '../../helpers/dom/replaceContent';\r\nimport {i18n} from '../../lib/langPack';\r\nimport ListenerSetter from '../../helpers/listenerSetter';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\r\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\r\nimport PopupElement from '../popups';\r\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n\r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n\r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.container.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n\r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.container.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.container.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\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 img: HTMLImageElement;\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.img = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => img);\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 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 img = this.img;\n\n let imageWidth = img.width, imageHeight = img.height;\n // if(imageHeight < height) {\n let patternHeight = 1480 * canvas.dpr;\n // * correct\n // if(+canvas.dataset.originalHeight !== height) hhh *= 2 / 3;\n // * but have to make it good\n if(+canvas.dataset.originalHeight !== height) patternHeight *= .875;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n // }\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(img, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = height / 2 - 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 type {AppImManager} from '../../lib/appManagers/appImManager';\nimport type {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 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} from '../../layer';\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | '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 isAnyGroup: boolean;\n public isMegagroup: boolean;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\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.error('Chat construction');\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\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\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 = theme.background.intensity && theme.background.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 if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\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));\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(item, 'is-visible', true, !skipAnimation ? 200 : 0, prev ? () => {\n if(previousPatternRenderer) {\n previousPatternRenderer.cleanup(previousPatternCanvas);\n }\n\n if(previousGradientRenderer) {\n previousGradientRenderer.cleanup();\n }\n\n prev.remove();\n } : null, 2);\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 if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n if(this.type !== 'scheduled' && !IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.classList.add('type-' + this.type);\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(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\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.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 async onChangePeer(m: ReturnType) {\n const {peerId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n const [noForwards, isRestricted, isAnyGroup, _, isMegagroup] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId)\n ]));\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\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, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\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.peerId === peerId;\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer(false, peerId);\n this.appImManager.dispatchEvent('peer_changed', peerId);\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(samePeer, peerId, lastMsgId, startParam);\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 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(this.peerId, messageId);\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 sharedMediaTab.loadSidebarMedia(true);\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam)\n ]);\n\n const [callbacks] = await Promise.all([\n callbacksPromise,\n sharedMediaTab.fillProfileElements()\n ]);\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.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', peerId);\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 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() {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n sendSilent: 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","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\r\nimport appNavigationController from '../appNavigationController';\r\nimport {_i18n} from '../../lib/langPack';\r\nimport cancelEvent from '../../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\r\nimport getSelectedNodes from '../../helpers/dom/getSelectedNodes';\r\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\r\nimport {MarkdownType, markdownTags} from '../../helpers/dom/getRichElementValue';\r\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\r\nimport clamp from '../../helpers/number/clamp';\r\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\r\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\r\n// import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n // private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n // this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n\r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach((c) => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e);\r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n\r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n // this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n // this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n // input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n // this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n\r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n\r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n\r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n // return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n // document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\r\n // if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach((node) => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n\r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\r\n\r\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\r\n\r\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\r\n\r\n const sizesRect = currentTools.getBoundingClientRect();\r\n const top = selectionTop - sizesRect.height - 8;\r\n\r\n const minX = inputRect.left;\r\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\r\n let left: number;\r\n if(isLinkToggle) {\r\n const containerRect = this.container.getBoundingClientRect();\r\n left = clamp(containerRect.left, minX, maxX);\r\n } else {\r\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\r\n left = clamp(x, minX, maxX);\r\n }\r\n\r\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\r\n\r\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\r\n\r\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n }\r\n\r\n public show() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(isSelectionEmpty()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(this.hideTimeout !== undefined) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if(this.container.classList.contains('is-visible')) {\r\n return;\r\n }\r\n\r\n this.setActiveMarkupButton();\r\n\r\n this.container.classList.remove('is-link');\r\n const isFirstShow = this.container.classList.contains('hide');\r\n if(isFirstShow) {\r\n this.container.classList.remove('hide');\r\n this.container.classList.add('no-transition');\r\n }\r\n\r\n this.setTooltipPosition();\r\n\r\n if(isFirstShow) {\r\n void this.container.offsetLeft; // reflow\r\n this.container.classList.remove('no-transition');\r\n }\r\n\r\n this.container.classList.add('is-visible');\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'markup',\r\n onPop: () => {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n // this.log('selection', selectionRect, activeButton);\r\n }\r\n\r\n /* private onMouseUp = (e: Event) => {\r\n this.log('onMouseUp');\r\n if(findUpClassName(e.target, 'markup-tooltip')) return;\r\n\r\n this.hide();\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n }; */\r\n\r\n private onMouseUpSingle = (e?: Event) => {\r\n // this.log('onMouseUpSingle');\r\n this.waitingForMouseUp = false;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n e && cancelEvent(e);\r\n if(this.mouseUpCounter++ === 0) {\r\n this.resetSelection(this.savedRange);\r\n } else {\r\n this.hide();\r\n return;\r\n }\r\n }\r\n\r\n this.show();\r\n\r\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\r\n };\r\n\r\n public setMouseUpEvent() {\r\n if(this.waitingForMouseUp) return;\r\n this.waitingForMouseUp = true;\r\n\r\n // this.log('setMouseUpEvent');\r\n\r\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\r\n }\r\n\r\n public cancelClosening() {\r\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n document.addEventListener('mouseup', (e) => {\r\n cancelEvent(e);\r\n this.mouseUpCounter = 1;\r\n this.waitingForMouseUp = false;\r\n this.setMouseUpEvent();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n public handleSelection() {\r\n if(this.addedListener) return;\r\n this.addedListener = true;\r\n document.addEventListener('selectionchange', (e) => {\r\n // this.log('selectionchange');\r\n\r\n if(document.activeElement === this.linkInput) {\r\n return;\r\n }\r\n\r\n const messageInput = this.appImManager.chat.input.messageInput;\r\n if(document.activeElement !== messageInput) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const selection = document.getSelection();\r\n if(isSelectionEmpty(selection)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n if(IS_APPLE) {\r\n this.show();\r\n this.setTooltipPosition(); // * because can skip this in .show();\r\n } else {\r\n if(this.mouseUpCounter === 2) {\r\n this.mouseUpCounter = 0;\r\n return;\r\n }\r\n\r\n this.savedRange = selection.getRangeAt(0);\r\n this.setMouseUpEvent();\r\n /* document.addEventListener('touchend', (e) => {\r\n cancelEvent(e);\r\n this.resetSelection(range);\r\n this.show();\r\n }, {once: true, passive: false}); */\r\n }\r\n } else if(this.container && this.container.classList.contains('is-visible')) {\r\n this.setTooltipPosition();\r\n } else if(messageInput.matches(':active')) {\r\n this.setMouseUpEvent();\r\n } else {\r\n this.show();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n\r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n\r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter((node) => !!node);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// generate a path's arc data parameter\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport generatePathData from '../../helpers/generatePathData';\r\nimport {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n // SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n // SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n // const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {doubleRaf} from '../schedulers';\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach((el) => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach((el) => el.classList.remove('no-transition'));\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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 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","/*\n * 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.checkAnimations(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 {GroupCallParticipant} from '../../layer';\nimport appDialogsManager, {DialogDom, AppDialogsManager} 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 = 54;\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 lazyLoadQueue: this.lazyLoadQueue\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 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 {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 type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\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 ButtonMenu, {ButtonMenuItemOptions} 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: HTMLDivElement;\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 = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, async(e: any) => {\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 }, listenerSetter);\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.peerId !== peerId) {\n peerTitle.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: (e: TouchEvent | MouseEvent) => boolean;\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 xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\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\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 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(this.partyMutedState, 'is-visible', !!outputState?.muted, 300);\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\r\n\r\nexport type CallAudioAssetName = 'call_busy.mp3' | 'call_connect.mp3' | 'call_end.mp3' | 'call_incoming.mp3' | 'call_outgoing.mp3' | 'voip_failed.mp3' | 'voip_connecting.mp3';\r\n\r\nlet audioAsset: AudioAssetPlayer;\r\nexport default function getCallAudioAsset() {\r\n return audioAsset ??= new AudioAssetPlayer([\r\n 'call_busy.mp3',\r\n 'call_connect.mp3',\r\n 'call_end.mp3',\r\n 'call_incoming.mp3',\r\n 'call_outgoing.mp3',\r\n 'voip_failed.mp3'\r\n ]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\r\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\r\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport {PhoneCallProtocol} from '../../layer';\r\nimport {CallId} from '../appManagers/appCallsManager';\r\nimport {AppManagers} from '../appManagers/managers';\r\nimport {logger} from '../logger';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\r\nimport rootScope from '../rootScope';\r\nimport CallInstance from './callInstance';\r\nimport CALL_STATE from './callState';\r\n\r\nconst CALL_REQUEST_TIMEOUT = 45e3;\r\n\r\nexport class CallsController extends EventListenerBase<{\r\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\r\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\r\n incompatible: (userId: UserId) => void,\r\n}> {\r\n private log: ReturnType;\r\n private managers: AppManagers;\r\n private audioAsset: AudioAssetPlayer;\r\n private instances: Map;\r\n private sortedInstances: Array;\r\n private tempId: number;\r\n\r\n public construct(managers: AppManagers) {\r\n this.managers = managers;\r\n this.log = logger('CC');\r\n\r\n if(!IS_CALL_SUPPORTED) {\r\n return;\r\n }\r\n\r\n this.audioAsset = getCallAudioAsset();\r\n this.tempId = 0;\r\n this.instances = new Map();\r\n this.sortedInstances = [];\r\n\r\n rootScope.addEventListener('call_update', async(call) => {\r\n let instance = this.instances.get(call.id);\r\n\r\n if(instance) {\r\n instance.setPhoneCall(call);\r\n }\r\n\r\n switch(call._) {\r\n case 'phoneCallDiscarded': {\r\n if(instance) {\r\n instance.hangUp(call.reason?._, true);\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'phoneCallAccepted': {\r\n if(instance) {\r\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\r\n instance.hangUp('phoneCallDiscardReasonDisconnect');\r\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\r\n break;\r\n } */\r\n\r\n instance.confirmCall();\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'phoneCallRequested': {\r\n if(!instance) {\r\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\r\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\r\n break;\r\n } */\r\n\r\n instance = this.createCallInstance({\r\n isOutgoing: false,\r\n interlocutorUserId: call.admin_id\r\n });\r\n\r\n instance.overrideConnectionState(CALL_STATE.PENDING);\r\n instance.setPhoneCall(call);\r\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'phoneCall': {\r\n if(!instance || instance.encryptionKey) {\r\n break;\r\n }\r\n\r\n const g_a = instance.dh.g_a = call.g_a_or_b;\r\n const dh = instance.dh;\r\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\r\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\r\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\r\n break;\r\n }\r\n\r\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\r\n if(call.key_fingerprint !== key_fingerprint) {\r\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\r\n instance.hangUp('phoneCallDiscardReasonDisconnect');\r\n break;\r\n }\r\n\r\n instance.encryptionKey = key;\r\n instance.joinCall();\r\n\r\n break;\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\r\n const instance = this.instances.get(callId);\r\n if(instance?.id !== callId) {\r\n return;\r\n }\r\n\r\n instance.onUpdatePhoneCallSignalingData(data);\r\n });\r\n }\r\n\r\n public get currentCall() {\r\n return this.sortedInstances[0];\r\n }\r\n\r\n public getCallByUserId(userId: UserId) {\r\n for(const [callId, instance] of this.instances) {\r\n if(instance.interlocutorUserId === userId) {\r\n return instance;\r\n }\r\n }\r\n }\r\n\r\n private createCallInstance(options: {\r\n isOutgoing: boolean,\r\n interlocutorUserId: UserId,\r\n protocol?: PhoneCallProtocol\r\n }) {\r\n const call = new CallInstance({\r\n managers: this.managers,\r\n ...options\r\n });\r\n\r\n call.addEventListener('state', (state) => {\r\n const currentCall = this.currentCall;\r\n if(state === CALL_STATE.CLOSED) {\r\n this.instances.delete(call.id);\r\n indexOfAndSplice(this.sortedInstances, call);\r\n } else {\r\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\r\n }\r\n\r\n if(state === CALL_STATE.EXCHANGING_KEYS) {\r\n call.wasTryingToJoin = true;\r\n }\r\n\r\n const hasConnected = call.connectedAt !== undefined;\r\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\r\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\r\n } else {\r\n call.clearHangUpTimeout();\r\n }\r\n\r\n if(currentCall === call || !currentCall) {\r\n if(state === CALL_STATE.CLOSED) {\r\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\r\n this.audioAsset.stopSound();\r\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\r\n this.audioAsset.playSound('voip_failed.mp3');\r\n } else {\r\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\r\n }\r\n } else if(state === CALL_STATE.PENDING) {\r\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\r\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\r\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\r\n } else if(state === CALL_STATE.CONNECTING) {\r\n if(call.duration) {\r\n this.audioAsset.playSound('voip_connecting.mp3', true);\r\n }\r\n } else {\r\n this.audioAsset.stopSound();\r\n }\r\n }\r\n });\r\n\r\n call.addEventListener('id', (id, prevId) => {\r\n if(prevId !== undefined) {\r\n this.instances.delete(prevId);\r\n }\r\n\r\n const hasCurrent = !!this.currentCall;\r\n this.instances.set(id, call);\r\n\r\n if(prevId === undefined) {\r\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\r\n }\r\n });\r\n\r\n return call;\r\n }\r\n\r\n public async startCallInternal(userId: UserId, isVideo: boolean) {\r\n this.log('p2pStartCallInternal', userId, isVideo);\r\n\r\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\r\n if(!fullInfo) return;\r\n\r\n const {video_calls_available} = fullInfo.pFlags;\r\n\r\n const call = this.createCallInstance({\r\n isOutgoing: true,\r\n interlocutorUserId: userId\r\n });\r\n\r\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\r\n\r\n call.overrideConnectionState(CALL_STATE.REQUESTING);\r\n call.setPhoneCall({\r\n _: 'phoneCallWaiting',\r\n access_hash: '',\r\n admin_id: NULL_PEER_ID,\r\n date: tsNow(true),\r\n id: --this.tempId,\r\n participant_id: userId,\r\n protocol: call.protocol,\r\n pFlags: {\r\n video: isVideo || undefined\r\n }\r\n });\r\n\r\n // return;\r\n this.managers.appCallsManager.generateDh().then(async(dh) => {\r\n call.dh = dh;\r\n\r\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\r\n }).then((phoneCall) => {\r\n call.overrideConnectionState(CALL_STATE.PENDING);\r\n call.setPhoneCall(phoneCall);\r\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\r\n });\r\n }\r\n}\r\n\r\nconst callsController = new CallsController();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\r\nexport default callsController;\r\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 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(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\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 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 faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"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({message, fwdCount, peerReaction, peerTypeNotifySettings}: {\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 = await this.managers.appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\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, undefined, undefined, true);\n\n if(peerReaction) {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(peerReaction.reaction), // 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 }\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 notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle(peerId, true, undefined, undefined, this.managers);\n if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle(notificationFromPeerId, true, undefined, undefined, 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});\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 = 'assets/img/favicon.ico') {\n if(this.prevFavicon === href) {\n return;\n }\n\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\n link.href = href;\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\n this.faviconEl = link;\n\n this.prevFavicon = href;\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 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} from '../../layer';\nimport {hslaStringToHex} from '../../helpers/color';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer 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 type {GroupCallId, MyGroupCall} from './appGroupCallsManager';\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 {Awaited, Modify, SendMessageEmojiInteractionData} from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\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 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 {getMiddleware} from '../../helpers/middleware';\nimport {wrapSticker} from '../../components/wrappers';\nimport windowSize from '../../helpers/windowSize';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../rlottie/rlottiePlayer';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport {STICKER_EFFECT_MULTIPLIER} from '../../components/wrappers/sticker';\n\nexport const CHAT_ANIMATION_GROUP: AnimationItemGroup = 'chat';\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};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (peerId: PeerId) => void,\n peer_changing: (chat: Chat) => 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 public tabId = -1;\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\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 if(theme.background.slug) {\n const url = 'assets/img/' + theme.background.slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\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\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations(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_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 !== 1\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') && bubble.classList.contains('sticker') && 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, 'message') || 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(parentElement, className, true, duration, () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition(parentElement, className, false, duration, () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n });\n }, showDuration);\n }, useRafs);\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', (options) => {\n if(this.chat.peerId === options.message.peerId && !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', (userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n new PeerTitle({peerId: userId.toPeerId()}).element\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 this.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 this.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 this.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 this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n this.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 this.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 this.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 this.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}) => {\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 link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.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}) => {\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, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.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 this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.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 this.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 }\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 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(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.hasAttribute('contenteditable') &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === 1) &&\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\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start\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.deleted) {\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 if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.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 const a = document.createElement('a');\n a.href = wrappedUrl;\n\n (window as any)[onclick](a);\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice',\n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any,\n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private 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 private onHashChange = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = this.parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n const {onclick} = wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\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 public openUsername(options: {\n userName: string,\n lastMsgId?: number,\n threadId?: number,\n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\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 openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return this.managers.appMessagesManager.wrapSingleMessage(peerId, threadId).then((message) => {\n // const message: Message = this.managers.appMessagesManager.getMessageByPeer(peerId, threadId);\n if(!message) {\n lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return this.managers.appMessagesManager.getDiscussionMessage(peerId, msgId).then((message) => {\n return this.openThread(message.peerId, commentId, message.mid);\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 confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [new PeerTitle({peerId: userId.toPeerId()}).element],\n button: {\n langKey: 'OK',\n isCancel: true\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 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: [\n new PeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}).element,\n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\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 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: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element,\n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\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 if(theme.background.slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * 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) => !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 document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\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 if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\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.checkAnimations(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(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\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: number, 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 === 0);\n\n const prevTabId = this.tabId;\n if(prevTabId !== -1) {\n this.overrideHash(id > 0 ? this.chat?.peerId : undefined);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false && mediaSizes.activeScreen !== ScreenSize.large) {\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 === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !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.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\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: ChatSetPeerOptions = {}, 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} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\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 && chat.peerId !== peerId) {\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(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(peerId, lastMsgId, options.startParam);\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(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(options.threadId) {\n options.type = 'discussion';\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex((chat) => chat.peerId === peerId && chat.type === type);\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 if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\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) {\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);\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): Promise> {\n const typingEl = 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) {\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) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId());\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean\n ) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\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);\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 ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback && callback());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","/*\n * 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 ButtonMenu 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] = 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 = ButtonMenu(buttons);\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(\n this.playbackRateButton,\n this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n undefined,\n 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_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 PeerTitle from './peerTitle';\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';\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 // console.log(xDiff, yDiff);\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 // * 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({onlyMobile: true}, '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.checkAnimations(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;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\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 }\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 renderImageFromUrl(el, url);\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 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 if(video.error.code !== 4) {\n this.log.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fillPropertyValue(str: string) {\r\n const splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent} 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 type {MyDocument} from '../lib/appManagers/appDocsManager';\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 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 {ButtonMenuItemOptions} 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: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\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', 'message'/* , '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: ButtonMenuItemOptions[] = [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 cantForwardMessage = message._ === 'messageService' || !this.managers.appMessagesManager.canForward(message);\n [this.buttons.forward, this.btnMenuForward.element].forEach((button) => {\n button.classList.toggle('hide', cantForwardMessage);\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantForwardMessage);\n\n const cantDownloadMessage = cantForwardMessage;\n [this.buttons.download, this.btnMenuDownload.element].forEach((button) => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = this.managers.appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach((button) => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\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 {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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from '../lib/rootScope';\r\nimport {Message, Photo} from '../layer';\r\nimport type LazyLoadQueue from './lazyLoadQueue';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport AppMediaViewer from './appMediaViewer';\r\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\r\nimport isObject from '../helpers/object/isObject';\r\nimport {ArgumentTypes} from '../types';\r\nimport putPhoto from './putPhoto';\r\nimport {recordPromise} from '../helpers/recordPromise';\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n (Array.from(document.querySelectorAll('avatar-element[data-peer-id=\"' + peerId + '\"]')) as AvatarElement[]).forEach((elem) => {\r\n // console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', async(peerId) => {\r\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(peerId))) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement,\r\n peerId: PeerId,\r\n middleware: () => boolean,\r\n message?: any,\r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await rootScope.managers.appMessagesManager.getSearch({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n maxId: 0,\r\n limit: 1\r\n }).then((value) => {\r\n // console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n\r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter}\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(\r\n photo.id,\r\n getTarget(),\r\n undefined,\r\n prevTargets ? f(prevTargets) : undefined,\r\n nextTargets ? f(nextTargets) : undefined\r\n );\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n public peerId: PeerId;\r\n public isDialog: boolean;\r\n public peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueue;\r\n public isBig: boolean;\r\n private addedToQueue = false;\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n public attachClickEvent() {\r\n let loading = false;\r\n attachClickEvent(this, async(e) => {\r\n cancelEvent(e);\r\n if(loading) return;\r\n // console.log('avatar clicked');\r\n const peerId = this.peerId;\r\n loading = true;\r\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\r\n loading = false;\r\n });\r\n }\r\n\r\n public updateOptions(options: Partial[0]>) {\r\n for(const i in options) {\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n public updateWithOptions(options: {\r\n peerId: PeerId,\r\n isDialog?: boolean,\r\n isBig?: boolean,\r\n peerTitle?: string,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n loadPromises?: Promise[]\r\n }) {\r\n const wasPeerId = this.peerId;\r\n this.updateOptions(options);\r\n const newPeerId = this.peerId;\r\n\r\n if(wasPeerId === newPeerId) {\r\n return;\r\n }\r\n\r\n this.peerId = /* rootScope.managers.appPeersManager.getPeerMigratedTo(newPeerId) || */newPeerId;\r\n this.dataset.peerId = '' + newPeerId;\r\n\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n return this.update();\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const promise = putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb, this.isBig);\r\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises.push(promise);\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n\r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n\r\n set.add(this);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this,\r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return this.r(true);\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n seen.add(this.peerId);\r\n\r\n const promise = this.r();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n\r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport rootScope from '../lib/rootScope';\nimport ButtonMenu, {ButtonMenuItemOptions} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport PopupPeer from './popups/peer';\nimport AppChatFoldersTab from './sidebarLeft/tabs/chatFolders';\nimport appSidebarLeft from './sidebarLeft';\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';\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\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() => !(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 const isPinned = 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 const isPinned = 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.selectedId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.selectedId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted(this.dialog.peerId));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(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.selectedId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n this.managers.appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n const config = await this.managers.apiManager.getConfig();\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n appSidebarLeft.createTab(AppChatFoldersTab).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute(this.selectedId, false);\n };\n\n private onMuteClick = () => {\n new PopupMute(this.selectedId);\n };\n\n private onUnreadClick = async() => {\n const selectedId = this.selectedId;\n const dialog = await this.managers.appMessagesManager.getDialogOnly(selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(selectedId, dialog.top_message);\n this.managers.appMessagesManager.markDialogUnread(selectedId, true);\n } else {\n this.managers.appMessagesManager.markDialogUnread(selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\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.filterId = appDialogsManager.filterId;\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = await this.managers.appMessagesManager.getDialogOnly(this.selectedId);\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 // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(await this.managers.appPeersManager.getDeleteButtonText(this.selectedId)));\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.selectedId = this.dialog = this.filterId = 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 {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\nexport function setSendingStatus(\n container: HTMLElement,\n message?: Message.message | Message.messageService,\n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../config/app';\r\nimport DEBUG from '../config/debug';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\nimport {logger} from '../lib/logger';\r\nimport rootScope from '../lib/rootScope';\r\nimport Button from './button';\r\nimport ProgressivePreloader from './preloader';\r\nimport SetTransition from './singleTransition';\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport {AppManagers} from '../lib/appManagers/managers';\r\nimport singleInstance from '../lib/mtproto/singleInstance';\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n\r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n const dcId = 2;\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: dcId,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-\" + dcId,\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n Promise.all([\r\n sessionStorage.get('dc'),\r\n rootScope.managers.rootScope.getConnectionStatus()\r\n ]).then(([baseDcId, connectionStatus]) => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n\r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n this.managers.apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n\r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n attachClickEvent(a, (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n if(singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n\r\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n // cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\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 : -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\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 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: Element;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor() {\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 = 54;\n this.marginVertical = 9;\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?: {width: number, height: number},\n getRectFrom?: HTMLElement,\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = 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.onRemove) {\n this.onRemove();\n this.onRemove = undefined;\n }\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n }\n\n private updateCanvasSize(rect: {width: number, height: number} = this.getRectFrom.getBoundingClientRect()) {\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.avatarSize + this.marginVertical * 2) * 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 drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n\n marginLeft += avatarSize + 10;\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\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","/*\n * 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, 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 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';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft, {SettingSection} 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 assumeType from '../../helpers/assumeType';\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 forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: 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 loadPromises?: Promise[]\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise = obj[key];\n if(oldPromise) {\n oldPromise.reject();\n }\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if(obj[key] === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => obj[key] === deferred);\n return {deferred, middleware};\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public managers: AppManagers,\n public list: HTMLUListElement,\n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (element) => managers.dialogsStorage.getDialogIndex(element.id, this.indexKey),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && 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 && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({peerId: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.textContent = '';\n super.clear();\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private loadDialogsPromise: Promise<{cached: boolean, renderPromise: AppDialogsManager['loadDialogsRenderPromise']}>;\n private loadDialogsRenderPromise: Promise;\n\n private scroll: Scrollable = null;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n private sortedList: SortedDialogList;\n public placeholders: {[filterId: number]: DialogsPlaceholder} = {};\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private 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 sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n\n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\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 constructor() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\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 /* 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 });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\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.loadedDialogsAtLeastOnce = false;\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.sortedList.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 = 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.sortedLists[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.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n const placeholder = this.placeholders[folderId];\n if(placeholder) {\n placeholder.remove();\n }\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.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n this.indexKey = getDialogIndexKey(REAL_FOLDERS.has(filterId) ? filterId as REAL_FOLDER_ID : localId);\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId);\n return this.onTabChange();\n }\n\n private 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(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', async(userId) => {\n // console.log('updating user:', user, dialog);\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && peerId !== rootScope.myId && !(await this.managers.appUsersManager.isBot(userId))) {\n const user = await this.managers.appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = await this.managers.appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, dialog] of dialogs) {\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setUnreadMessagesN({dialog});\n this.validateDialogForFilter(dialog);\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.validateDialogForFilter(dialog);\n this.setUnreadMessagesN({dialog}); // возможно это не нужно, но нужно менять is-muted\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n appImManager.addEventListener('peer_changed', (peerId) => {\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\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 this.setDialogActive(element, true);\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 } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\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 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 delete this.sortedLists[filter.id];\n delete this.scrollables[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 return {\n indexKey: await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n filter: await this.managers.filtersStorage.getFilter(filterId)\n };\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = indexKey;\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', async({peerId, typings}) => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\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 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 const loadDialogsPromise = this.onChatsScroll();\n await loadDialogsPromise;\n this.loadDialogsRenderPromise = undefined;\n\n addFiltersPromise && await addFiltersPromise;\n // this.folders.menu.children[0].classList.add('active');\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 this.showFiltersPromise;\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await 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 private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\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) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessageN({\n dialog,\n dom,\n setUnread: true\n });\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n return this.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 unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n unreadSpan.innerText = unreadCount ? '' + unreadCount : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog) {\n if(\n !dialog ||\n (!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id)\n // (filter && !(await this.managers.filtersStorage.testDialogForFilter(dialog, filter)))\n ) {\n return false;\n }\n\n return true;\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.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n this.managers,\n list,\n getDialogIndexKey(filter.localId),\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\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 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 = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter);\n\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.setListClickListener(ul, null, true);\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 if(!this.showFiltersPromise) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\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 resolve();\n }, 0);\n });\n }\n\n return this.showFiltersPromise;\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n this.log.warn('load', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scroll.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const {chatList, filterId, indexKey} = this;\n\n // return;\n\n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\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 // let offset = storage[storage.length - 1]?.index || 0;\n\n let placeholder = this.placeholders[filterId];\n try {\n const getConversationsResult = this.managers.acknowledged.appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n !this.loadedDialogsAtLeastOnce ||\n !(await getConversationsResult).cached\n )\n ) {\n placeholder = this.placeholders[filterId] = new DialogsPlaceholder();\n const getRectFrom = filterId === FOLDER_ID_ARCHIVE ? this.chatsContainer : this.folders.container;\n placeholder.attach({\n container: chatList.parentElement,\n getRectFrom,\n onRemove: () => {\n delete this.placeholders[filterId];\n },\n blockScrollable: this.scroll\n });\n\n cachedInfoPromise.resolve(false);\n }\n\n const a = await getConversationsResult;\n const result = await a.result;\n if(this.loadDialogsRenderPromise !== renderPromise) {\n reject();\n cachedInfoPromise.reject();\n return;\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.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n\n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n // const isBuggedDialog = !this.managers.appMessagesManager.getDialogOnly(dialog.peerId);\n // if(isBuggedDialog) {\n // return;\n // }\n\n const element = this.sortedList.add(dialog.peerId, true, /* undefined, false, */cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n loadPromises.push(fastRafPromise()); // it is needed here\n await Promise.all(loadPromises).finally();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n reject();\n cachedInfoPromise.reject();\n return;\n }\n\n callbacks.forEach((callback) => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, indexKey);\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n return this.loadDialogsPromise = cachedInfoPromise.then((cached) => ({\n cached,\n renderPromise\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.scroll.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 appSidebarLeft.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(this.filterId));\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 if(this.updateContactsLengthPromise) return this.updateContactsLengthPromise;\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.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.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: 42,\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 return await this.managers.appPeersManager.isContact(peerId) && !(await this.managers.appMessagesManager.getDialogOnly(peerId));\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.chatList.childElementCount || this.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.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.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.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\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.scroll.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 private async setOffsets() {\n const chatList = this.chatList;\n const firstDialog = await this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = await this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return this.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n }\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\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\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(elem) {\n if(onFound) onFound();\n\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\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(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', this.managers.appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\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: {\n dialog: Dialog,\n lastMessage?: Message.message | Message.messageService,\n dom?: DialogDom,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n const promise = this.setLastMessage(options.dialog, options.lastMessage, options.dom, options.highlightWord, options.isBatch, options.setUnread);\n return promise.catch(noop);\n }\n\n private async setLastMessage(\n dialog: Dialog,\n lastMessage: Message.message | Message.messageService,\n dom: DialogDom,\n highlightWord?: string,\n isBatch = false,\n setUnread = false\n ) {\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n return;\n }\n }\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft?._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n\n lastMessage = dialog.topMessage;\n if(!lastMessage || lastMessage.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n if(setUnread) {\n this.setUnreadMessagesN({dialog, dom, isBatch, setLastMessagePromise: promise});\n }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.textContent = '';\n dom.lastTimeSpan.textContent = '';\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const peerId = dialog.peerId;\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 bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n willPrepend.unshift(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const senderBold = document.createElement('b');\n\n if(lastMessage.fromId === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n willPrepend.unshift(senderBold);\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 senderBold.prepend(element);\n return senderBold;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n senderBold.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(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply(draftMessage));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, 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\n promise.resolve();\n }\n\n private setUnreadMessagesN(options: {\n dialog: Dialog,\n dom?: DialogDom,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n return this.setUnreadMessages(options.dialog, options.dom, options.isBatch, options.setLastMessagePromise).catch(() => {});\n }\n\n private async setUnreadMessages(\n dialog: Dialog,\n dom = this.getDialogDom(dialog.peerId),\n isBatch = false,\n setLastMessagePromise?: Promise\n ) {\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const isMuted = await middleware(this.managers.appNotificationsManager.isPeerLocalMuted(dialog.peerId, true));\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = await middleware(this.managers.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message));\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n const filter = await middleware(this.managers.filtersStorage.getFilter(this.filterId));\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = await middleware(this.managers.appMessagesManager.isDialogUnread(dialog));\n const hasUnreadBadge = isPinned || 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 : 200;\n\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, transitionDuration);\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\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 {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n deferred.resolve();\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private async getDialog(dialog: Dialog | PeerId) {\n if(typeof(dialog) !== 'object') {\n const 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 return originalDialog;\n }\n\n return dialog as Dialog;\n }\n\n private 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(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\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 promise = this.getDialog(options.peerId).then((dialog) => {\n const {peerId} = dialog;\n const promises: Promise[] = [];\n if(!peerId.isUser()) {\n promises.push(this.processDialogForCallStatus(dialog, ret.dom));\n }\n\n if(peerId !== rootScope.myId && peerId.isUser()) {\n promises.push(this.managers.appUsersManager.getUser(peerId).then((user) => {\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dom: ret.dom,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n if(options.loadPromises) {\n options.loadPromises.push(promise);\n }\n }\n\n return ret;\n }\n\n private async processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n\n const chat: Chat.chat | Chat.channel = await this.managers.appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\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.setLastMessage({_: 'dialog', peerId} as any, message, ret.dom, query);\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: {\n peerId: Parameters[0],\n container?: Parameters[1],\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean\n }) {\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 public addDialog(\n peerId: PeerId,\n container?: HTMLElement | Scrollable | DocumentFragment | false,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n append = true,\n avatarSize = 54,\n autonomous = !!container,\n lazyLoadQueue?: LazyLoadQueue,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean\n ) {\n // const dialog = await this.getDialog(_dialog);\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false,\n withIcons: !noIcons\n });\n\n if(loadPromises) {\n loadPromises.push(peerTitlePromise);\n }\n\n titleSpanContainer.append(peerTitle.element);\n // p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n // if(!container) {\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 = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n // captionDiv.append(titleSpan);\n // captionDiv.append(span);\n\n const li = document.createElement(DIALOG_LIST_ELEMENT_TAG);\n li.classList.add('chatlist-chat');\n if(!autonomous) (li as HTMLAnchorElement).href = '#' + peerId;\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\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 unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n }\n\n return {dom};\n }\n\n public async setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessageN({\n dialog,\n lastMessage: null,\n dom,\n setUnread: null\n });\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\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}])}));"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","CodeInputField","constructor","super","plainText","input","this","type","autocomplete","lastLength","addEventListener","e","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","PasswordMonkey","passwordInputField","size","needFrame","container","load","loadPromise","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","TrackingMonkey","inputField","max","playAnimation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","Promise","all","PasswordInputField","onVisibilityClick","toggleVisible","toggle","name","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","rippleClickId","ripple","callback","resolve","onEnd","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","elapsedTime","cb","delay","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","isRippleUnneeded","target","includes","tagName","touchEnd","touches","once","cancelBubble","stopPropagation","passive","dataset","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","cleanSearchText","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","toLowerCase","fixCyrillic","htmlToSpan","span","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","undefined","measure","mutate","mutateElement","element","isConnected","read","write","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","nameEl","clear","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","i","messages","setVirtualContainer","onChange","reset","searchMore","onScrolledBottom","trim","peerId","beginSearch","focus","maxId","inputFilter","_","limit","res","count","history","mid","shift","searchGroup","forEach","message","fromId","avatarSize","meAsSaved","err","console","error","replaceContent","catch","InputSearch","placeholder","prevValue","timeout","onInput","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","SliderSuperTab","slider","destroyable","_constructor","header","closeBtn","title","content","addTab","listenerSetter","close","closeTab","open","args","init","result","selectTab","onCloseAfterTimeout","tabs","delete","destroy","removeAll","setTitle","key","SliderSuperTabEventable","eventListener","dispatchEvent","cleanup","SidebarSlider","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","navigationType","id","animate","isNavigation","closingId","pop","onCloseTab","tab","_selectTab","safeAssign","Map","tabsContainer","sidebarEl","Array","from","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","onPop","canAnimate","push","removeTabFromHistory","indexOfAndSplice","sliceTabsUntilTab","tabConstructor","preserveTab","getTab","find","t","isTabExists","onClose","TRANSITION_TIME","createTab","ctor","doNotAppend","managers","AvatarEdit","getContext","clearRect","months","days","ONE_DAY","getWeekNumber","date","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToTodayNew","time","today","timestamp","hour","minute","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","textTransform","formatFullSentTime","fragment","createDocumentFragment","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","dates","q","indexOf","setFullYear","setHours","minDate","maxDate","dayOfWeek","c","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","getUserStatusString","user","pFlags","bot","support","status","was_online","diff","AppNewGroupTab","uploadAvatar","isGeoChat","avatarEdit","_upload","section","SettingSection","inputWrapper","groupNameInputField","label","maxLength","groupLocationInputField","canBeEdited","valueCheck","userLocationCoords","userLocationAddress","nextBtn","appChatsManager","createChannel","about","geo_point","address","megagroup","chatId","inputFile","editPhoto","peerIds","inviteToChannel","createChat","map","toUserId","toPeerId","chatsSection","nameArgs","new","startLocating","userId","dom","rippleEnabled","lastMessageSpan","appUsersManager","getUser","navigator","geolocation","getCurrentPosition","location","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","set","change","visible","item","getVisible","clearVisible","isVisible","disconnect","refresh","targets","keys","observe","refreshVisible","unobserve","unlock","unlockAndRefresh","lock","findAndSpliceAll","array","verify","out","idx","findIndex","splice","LazyLoadQueueIntersector","parallelLimit","queue","inProcess","Set","intersector","loadItem","addElement","method","setProcessQueueTimeout","intersectorTimeout","processQueue","unshift","LazyLoadQueue","wasSeen","getItem","findAndSplice","processItem","hasOwnProperty","choosePhotoSize","photo","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","sizes","thumbs","concat","w","h","photoSize","calcImageInBox","accumulate","arr","initialValue","reduce","acc","Layouter","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","static","ratio","join","cropRatios","clamp","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","optimalCounts","optimalHeights","rowCount","index","row","colCount","lineHeight","col","prepareAlbum","widthItem","heightItem","children","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","loadedURLs","url","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","useCache","isImage","loader","Image","renderImageFromUrlPromise","renderImageWithFadeIn","image","needFadeIn","aspecter","thumbImage","SetTransition","forwards","onTransitionEnd","useRafs","onTransitionStart","cancelAnimationFrame","afterTimeout","ProgressivePreloader","tempId","detached","isUpload","cancelable","streamable","tryAgainOnFail","attachMethod","onClick","cancelEvent","preloader","loadFunc","cancel","constructContainer","color","bold","constructDownloadIcon","construct","totalLength","downloadSvg","cancelSvg","previousElementSibling","circle","firstElementChild","setDownloadFunction","func","setManual","setProgress","attachPromise","notify","notifyAll","detach","attach","addNotifyListener","details","percents","done","total","isInDOM","getTotalLength","strokeDasharray","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","results","reject","f","start","performance","possiblePromise","process","apply","context","realResult","timedChunk","finally","requireBlurPromise","fastBlurFunc","processBlurNext","img","radius","iterations","ctx","alpha","filter","drawImage","m","default","cache","dataUri","cached","onload","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewURLFromBytes","bytes","isSticker","mimeType","Uint8Array","IS_SAFARI","btoa","String","fromCharCode","bytesToDataURL","getPreviewURLFromThumb","thumb","getImageFromStrippedThumb","useBlur","getStrippedThumbIfNeeded","cacheContext","ignoreCache","downloaded","setAttachmentSize","noZoom","_isWebDocument","isWebDocument","isDocument","boxSize","aspect","isFit","aspectCovered","reply_to_mid","media","webpage","replies","comments","channel_id","toChatId","wrapPhoto","withTail","isOut","lazyLoadQueue","middleware","withoutPreloader","loadPromises","autoDownloadSize","noBlur","noThumb","noFadeIn","blurAfter","isWebDoc","full","images","noAutoDownload","mediaSizes","loadThumbPromise","isGif","mime_type","thumbsStorage","getCacheContext","gotThumb","uploadingFileName","appDownloadManager","renderOnLoad","onLoad","toDataURL","canAttachPreloader","haveToDownload","queueId","onlyCache","getDownloadPromise","renderPromise","download","render","createVideo","video","pip","disablePictureInPicture","toHHMMSS","str","leadZero","sec_num","hours","floor","minutes","seconds","FontFamily","getTextWidth","font","measureText","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","sizeType","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","capture","MiddleEllipsisElement","HTMLElement","connectedCallback","disconnectedCallback","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","formatBytes","decimals","strictDecimals","log","_decimals","dm","fixed","pow","toFixed","parseFloat","attachGrabListeners","onStart","onMove","onMouseMove","event","pageX","pageY","onMouseUp","onMouseDown","onTouchMove","preventDefault","isTouch","onTouchEnd","onTouchStart","customElements","define","RangeSelector","mousedown","events","withTransition","useTransform","vertical","scrub","seek","setFilled","onScrub","filled","step","stepStr","setHandlers","setListeners","_removeListeners","addProgress","transform","rectMax","offsetAxisValue","bottom","removeListeners","MediaProgressLine","progressRAF","onLoadedData","onEnded","onPlay","paused","setLoadProgress","onTimeUpdate","onProgress","setMedia","filledLoad","currentTime","wasPlaying","setSeekMax","scrubTime","appMediaPlaybackController","buf","buffered","numRanges","nearestStart","end","getMessageSenderPeerIdOrName","fromName","fwd_from","from_name","generateFakeIcon","isScam","generateTitleIcons","elements","peer","verified","svg","createElementNS","use","use2","generateVerifiedIcon","fake","scam","premium","generatePremiumIcon","weakMap","WeakMap","peerTitle","update","PeerTitle","onlyFirstName","dialog","setOptions","hasInner","limitSymbols","setInnerHTML","wrapEmojiText","icons","getPeerTitle","withIcons","inner","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","constructDownloadPreloader","mids","attr","findMediaTargets","anchor","anchorMid","prev","next","isBubbles","findUpClassName","justAudioSelector","selectors","prefix","s","selector","mediaItems","reverse","AudioElement","withTime","voiceAsMusic","showSender","doc","getMediaFromMessage","isRealVoice","isVoice","isOutgoing","is_outgoing","durationStr","downloadDiv","media_unread","onTypeLoad","audioEl","waveform","attributes","attribute","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","progress","audio","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","wrapVoiceMessage","descriptionEl","audioAttribute","parts","performer","titleEl","middleEllipsisEl","file_name","subtitleDiv","launched","progressLine","supportsStreaming","lastChild","replaceWith","wrapAudio","audioTimeDiv","autoload","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","togglePlay","hadSearchContext","searchContext","useSearch","imgs","wrapped","autoDownload","shouldPlay","is_scheduled","onDownloadInit","pauseListener","deferred","Error","playListener","roundVideoCircumference","wrapVideo","noInfo","group","onlyPreview","noPlayButton","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","muted","divRound","halfSize","strokeWidth","PI","strokeDashoffset","globalVideo","onPaused","onFrame","throttle","foreignObject","getAttributeNS","uploadFileName","renderDeferred","code","isFulfilled","onMediaLoad","animationIntersector","loadPhotoThumbFunc","apiFileManager","downloadMediaURL","wrapAlbum","attachmentDiv","uploading","chat","thumbPromise","to","wrapDocument","audioElement","extSplitted","split","ext","isArray","docDiv","docId","icoDiv","icoTextEl","hadContext","hasThumb","fileName","wrapPlainText","bytesContainer","descriptionParts","b","bytesMaxEl","visibility","nameDiv","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","position","format","_d","save","isTrusted","canOpenAfter","downloadFileName","getDownloadMediaDetails","downloadId","isDownloading","uploadPromise","savingLottiePreview","saveLottiePreview","toneIndex","saving","toBlob","blob","OverlayClickHandler","withOverlay","findUpAsChild","listenerOptions","overlay","IS_MOBILE_SAFARI","toastEl","hideToast","toast","body","offsetLeft","toastNew","langPackKey","langPackArguments","diffX","right","diffY","isOpened","openBtnMenu","ButtonMenuItem","checkboxField","noCheckboxClickListener","textElement","textArgs","regularText","keepOpen","menu","checked","buttons","filterAsync","Boolean","positionMenu","side","additionalPadding","getScrollWidthFromElement","scrollWidth","menuWidth","scrollHeight","menuHeight","windowWidth","windowHeight","paddingTop","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","bind","removeManual","IS_APPLE","onCancel","EditPeer","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","updateWithOptions","doNotEditAvatar","lockWithPromise","unlockOnSuccess","RadioForm","radios","form","Row","freezed","radioField","subtitle","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","titleRightSecondary","noWrap","titleRightEl","navigationTab","createMedia","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","select","execCommand","removeChild","fallbackCopyTextToClipboard","RadioField","alignRight","stateKey","state","getDeepProperty","main","langKey","Event","bubbles","isUsernameValid","username","test","UsernameInputField","checkUsernameDebounced","debounce","checkUsername","getValue","originalValue","setState","I","setError","invalidText","head","checkUsernamePromise","available","availableText","takenText","isValidToChange","PopupPeer","overlayClosable","avatarEl","AvatarElement","isDialog","noTitle","titleLangArgs","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","original","nextElementSibling","AppChatTypeTab","isBroadcast","random","privateRow","publicRow","a","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","toggleDisability","appProfileManager","getChatInviteLink","show","caption","noDelimiter","linkInputField","applyBtn","migrateChat","channelId","updateUsername","setOriginalValue","toggleNoForwards","onChatUpdate","noforwards","ScrollableLoader","loading","loaded","getPromise","checkForTriggers","windowSize","visualViewport","innerWidth","innerHeight","numberThousandSplitter","toString","getChatMembersString","getCachedFullChat","participants_count","participants","broadcast","AppSelectPeers","chatsContainer","selected","folderId","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","cachedContacts","getMoreResults","renderResultsFunc","renderResults","splitUp","notRendered","has","filterPeerTypeBy","isPeerId","appPeersManager","getPeer","deleted","innerContainer","topContainer","selectedContainer","selectedScrollable","li","sectionNameLangPackKey","noShadow","findUpAttribute","checkbox","debouncedInput","generateDelimiter","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","dialogs","archived","pageCount","appMessagesManager","getConversations","newOffsetIndex","getDialogIndex","chatRightsAction","filterByRights","isEnd","contacts","getMoreContacts","isUser","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","filterUnique","getMoreChannelParticipants","channelParticipants","getChannelParticipants","participant","getParticipantPeerId","isNonContactUser","containerEl","subtitleEl","isAnyChat","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","getSelected","addInitial","values","forceDirection","PopupPickUser","closable","onSelect","hide","peerTypes","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","takeOut","deepEqual","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","v","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","copy","defaultRights","combineParticipantBannedRights","restrictionText","info","mainFlag","restriction","until_date","flag","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","DIALOG_LIST_ELEMENT_TAG","setSubtitle","bannedRights","cantWhat","getPeerId","listEl","setLength","exceptionsCount","setLoader","isChannel","migrateFrom","migrateTo","onScroll","PopupDeleteDialog","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","isDanger","AppChatReactionsTab","availableReactions","appReactionsManager","getActiveAvailableReactions","getChatFull","originalReactions","available_reactions","enabledReactions","toggleSection","toggleCheckboxField","toggleRow","reactionsSection","checkboxFields","availableReaction","reaction","saveReactionsDebounced","wrapStickerToRow","static_icon","every","saveReactions","newReactions","sort","setChatAvailableReactions","AppEditChatTab","_init","chatUpdateListeners","addChatUpdateListener","canChangeType","canChangePermissions","chatNameInputField","descriptionInputField","editPeer","chatTypeRow","setChatTypeSubtitle","reactionsRow","setReactionsLength","availableReactionsLength","getAvailableReactions","inactive","reactions","permissionsRow","setPermissionsLength","getChatTyped","editTitle","editAbout","race","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","formatUserPhone","phone","formatPhoneNumber","formatted","AppEditContactTab","isNew","isContact","nameInputField","lastNameInputField","setDraftValue","first_name","last_name","notificationsCheckboxField","togglePeerMute","enabled","appNotificationsManager","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","AppAddMembersTab","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","DialogColorsFg","DialogColors","DialogColorsMap","getPeerColorById","pic","getAbbreviation","onlyFirst","splitted","last","putAvatar","onlyThumb","renderThumbPromise","isFullLoaded","stripped_thumb","putPhoto","isBig","myId","getPeerPhoto","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","abbr","getPeerInitials","getEvent","attachGlobalListenerTo","RESET_GLOBAL","SwipeHandler","cursor","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","setProperty","onFirstSwipe","onSwipeResult","onSwipe","setCursor","PeerProfileAvatars","photoId","avatar","BASE_CLASS","avatars","appPhotosManager","getPhoto","action","draggable","loadCallback","intersectionObserver","loadCallbacks","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","SWITCH_ZONE","freeze","listLoader","previous","current","prevTargets","nextTargets","openAvatarViewer","toRight","go","cancelNextClick","lastDiffX","minX","swipeHandler","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","loadCount","loadMore","older","getUserPhotos","photos","getSearch","Number","MAX_SAFE_INTEGER","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","onJump","activeTab","photo_id","wrapPeerTitle","setText","PeerProfile","setPeerStatus","needClear","attachClickEvent","bio","getProfileByPeerId","notifications","setMoreDetails","fillUsername","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","cleanupHTML","clearSetMoreDetailsTimeout","canBeDetailed","oldAvatars","getPeerUsername","fillNotifications","fillRows","fillProfileElements","cleaned","_setMoreDetails","peerFull","wrapRichText","exportedInvite","setMoreDetailsTimeout","override","isRestricted","acknowledged","setPromise","clearInterval","historiesStorage","AppSharedMediaTab","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","profile","onAdditionalScroll","searchSuper","nav","setIsSharedMedia","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","renderNewMessages","msgs","deleteDeletedMessages","AppSearchSuper","mediaTabs","onChangeTab","mediaTab","btnAddMembers","scrollStartCallback","showConfirmation","onError","addChatUser","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","setLoadMutex","loadMutex","peerChanged","setQuery","historyStorage","loadSidebarMedia","single","justLoad","RIGHT_COLUMN_ACTIVE_CLASSNAME","appSidebarRight","getElementById","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","proportion","documentElement","enable","active","willChange","animationPromise","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","addSentinel","sentinel","observeStickyHeaderChanges","headerSentinel","getEmojiEntityFromEmoji","emoji","unicode","appendEmoji","unify","spanEmoji","kek","entities","wrapSingleEmoji","fixEmoji","opacity","getEmojiFromElement","nodeType","nodeValue","getAttribute","EmojiTab","closeScrollTop","onContentClick","blurActiveElement","categories","divs","sorted","category","emojis","titleDiv","itemsDiv","unified","emojiScroll","appEmojiManager","getRecentEmojis","recent","hasRecent","activeId","EmoticonsDropdown","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","LazyLoadQueueRepeat2","spliced","GifsMasonry","scrollPromise","processInvisibleDiv","processVisibleDiv","appDocsManager","getDoc","gifWidth","gifHeight","willUseWidth","GifsTab","gifsContainer","onMediaClick","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","LazyLoadQueueRepeat","_queue","positionElementByIndex","pos","prevPos","whichChild","confirmationPopup","cancelButton","isCancel","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","overflow","horizontal","hasViewer","attachStickerViewerListeners","listenTo","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","getStickerEffectThumb","mediaRect","fitted","aspectFitted","bubble","transformer","stickerContainer","stickerEmoji","stickerEmojiRaw","margin","STICKER_EFFECT_MULTIPLIER","visibleRect","scaleX","scaleY","transformX","transformY","player","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","lottieLoader","ready","onMousePreMove","newMediaContainer","clean","_previousTransformer","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","withLock","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTab","mounted","categoriesMap","localCategories","setFavedLimit","appConfig","stickers_faved_limit_premium","stickers_faved_limit_default","createCategory","stickerSet","_title","menuTab","menuTabPadding","categoriesIntersector","categoryAppendStickers","documents","isCategoryVisible","superStickerRenderer","setCategoryItemsHeight","containerWidth","stickerSize","itemsPerRow","minHeight","renderStickerSet","appStickersManager","getStickerSet","wrapStickerSetThumb","menuWrapper","menuScroll","setTyping","intersectionOptions","clearCategoryItems","PopupStickers","access_hash","createLocalCategory","toggleLocalCategory","onCategoryStickers","stickers","ids","forEachReverse","deleteSticker","unshiftSticker","spliceExceed","favedCategory","recentCategory","clearButton","clearRecentStickers","premiumCategory","apiManager","getAppConfig","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","sets","getPremiumStickers","isPremium","rendererLazyLoadQueue","faved","resizeCategories","createStickersContextMenu","verifyRecent","notMounted","onLocalCategoryUpdate","batch","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","warn","inputSearch","search","gifsDiv","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","sticker","toggleStickerSet","installed_date","renderSet","countDiv","stickersDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","covered","searchStickerSets","DropdownHover","forceClose","inited","ignoreMouseOut","onMouseOut","isActive","displayTimeout","toElement","willBeActive","dispatchResultableEvent","attachButtonListener","onmouseout","onmouseover","setIgnoreMouseOut","ignore","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","savedRange","getGoodRange","emojiTab","stickersTab","gifsTab","horizontalMenu","HIDE_EMOJI_TAB","IS_APPLE_MOBILE","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","overlayCounter","getElement","clearDraft","silent","emoticonsDropdown","addLazyLoadQueueRepeat","getSavedRange","getSelection","rangeCount","activeElement","getRangeAt","prevId","jumpedTo","stuck","which","axis","offsetTop","sendDocId","isStickerPack","verifyFavoriteSticker","toAdd","favedStickers","found","some","_doc","findElement","filterButtons","attachListenerSetter","_element","initResult","filteredButtons","createContextMenu","stickerSetInput","ANIMATION_GROUP","onStickersClick","stickersFooter","btn","loadStickerSet","wrapStickerAnimation","skipRatio","fullThumb","withRandomOffset","animationDiv","unmountAnimation","stickerPromise","assumeType","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","locksUrls","needUpscale","asStatic","noPremium","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","willHaveLock","lockUrl","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","path","num","getPathFromBytes","ns","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","middlewareError","makeError","animationData","setLockColor","dpr","skipx","skipy","imageData","getImageData","data","sr","sg","sb","sa","outCanvas","outContext","Uint8ClampedArray","rgba","fillStyle","fillRect","computeLockColor","sendInteractionThrottled","preloadAnimatedEmojiStickerAnimation","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","msg_id","getServerMessageId","emoticon","interaction","JSON","stringify","isSavingLottiePreview","preloadSticker","playing","onclick","attachStickerEffectHandler","AppPollResultsTab","resultsDiv","poll","appPollsManager","getPoll","quiz","question","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","getVotes","option","votesList","votes","vote","user_id","showMore","down","CLASS_NAME","StackedAvatars","avatarContainer","AVATAR_CLASS_NAME","updateOptions","parentNode","lineTotalLength","minIndex","minRemainder","remainder","maxRemainder","pollElement","isClosed","closed","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","period","closeTime","quizInterval","timeLeft","stroke","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","textEl","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","setResults","recent_voters","stackedAvatars","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","times","votersCount","DivAndCaption","fill","border","htmlToDocumentFragment","DocumentFragment","template","platforms","getRestrictionReason","reasons","reason","platform","escapeRegExp","isMessageRestricted","restriction_reason","CALL_DURATION_LANG_KEYS","formatCallDuration","plain","showLast","modulus","formatDuration","strings","paymentsWrapCurrencyAmount","amount","currency","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","n","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","symbol","space_between","symbol_left","splitter","wrapJoinVoiceChatAnchor","wrapUrl","call","href","wrapLinkToMessage","savedFrom","dir","wrapMessageForReply","wrapMessageActionTextNew","unsafeMessage","noLinebreaks","getNameDivHTML","endsWith","post","users","schedule_date","daysToStart","tomorrowDate","pinnedMessage","getMessageByPeer","fetchMessageReplyTo","joined","anchorHTML","domain","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","total_amount","invoiceMessage","reply_to","reply_to_peer_id","langPack","waited","wrapMessageActionTextNewUnsafe","usingMids","highlightWord","withoutMediaType","hasAlbumKey","addPart","part","totalEntities","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","game","actionWrapped","match","regExp","sortEntities","messageWrapped","noLinks","noTextFormat","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","isRound","mediaChildren","CHAT_ANIMATION_GROUP","child","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","fillPromise","hex","g","downloadOptions","getStickerSetThumbDownloadOptions","videos","URL","createObjectURL","previousMedia","_size","SortedList","updateElementWith","updateListWith","_updateList","onSort","updateList","canUpdate","getAll","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","insertInDescendSortedArray","SortedUserList","getUserStatusForSort","onListLengthChange","willChangeLength","createChatListOptions","doTimeout","good","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","PopupForward","peerIdMids","overrideOnSelect","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","_hasRights","canRevoke","PopupSendNow","sendScheduledMessages","cancelSelection","empty","removeAllRanges","accumulateMapSet","AppSelection","selectedMids","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","getElementFromTarget","verifyMouseMoveTarget","listenElement","documentListenerOptions","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","attachListeners","selectedText","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","toggleElementCheckbox","hasCheckbox","getCheckboxInputFromElement","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","isScheduled","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","lastMsgId","obj","fromPeerId","isPrivate","transitionElement","ChatSelection","recording","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","skippedMids","isGrouped","groupedCheckboxInput","wrapWebPageDescription","webPage","shortDescriptionText","wrapWebPageTitle","shortTitle","author","site_name","SearchContextMenu","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","withSelection","canForward","canDeleteMessage","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","searchContextMenu","navScrollable","tabsMenu","unlockScroll","lockers","lockTouchScroll","searchGroupMedia","canLoadMediaTab","tabContent","skipScroll","startCallback","newMediaTab","fromMediaTab","rect2","targetClassName","AppMediaViewer","setSearchContext","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","filterMessagesByInputFilter","processEmptyFilter","setLastMessagePromise","lastMessage","processPhotoVideoFilter","processDocumentFilter","processUrlFilter","entity","display_url","sliced","matchUrl","same","hostname","hash","previewDiv","subtitleFragment","HTMLAnchorElement","decodeURIComponent","firstChild","elemsToAppend","sharedMediaDiv","processCallback","awaited","monthContainer","getMonthContainerByTimestamp","afterPerforming","loadChats","inputMessagesFilterEmpty","showMembersCount","titleSpan","arg","globalContacts","intlElement","isShort","renderRecentSearch","recentSearch","getTopPeers","peers","people","loadMembers","renderParticipants","membersList","LOAD_COUNT","loadType","used","slicedLength","notFilteredMessages","nextRate","next_rate","loadFirstTime","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","loadFirstTimePromise","toLoad","dateTimestamp","containers","dateElement","haveTimestamps","getObjectKeysAndSort","goFirst","revokeObjectURL","newInputFilter","ButtonMenuToggleHandler","openedMenu","btnMenu","getPrivacyRulesDetails","rules","types","allowPeers","chats","disallowPeers","rule","PrivacyType","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","appPrivacyManager","getPrivacy","inputKey","setRadio","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","anchorCopy","phoneSection","sCaption","wrapStickerEmoji","AppTwoStepVerificationSetTab","captionOld","inputContent","btnReturn","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","matchEmail","E","onContinueClick","btnContinue","btnSkip","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","has_password","labelText","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","country","date_active","date_created","midtitle","device_model","system_version","authorizations","session","btnTerminate","invokeApi","otherSection","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyAndSecurityTab","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","getGlobalPrivacySettings","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","averageColorFromCanvas","pixel","pixels","pixelsLength","outPixel","highlightningColor","l","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","onWheel","_animatingToNextPosition","_scrollDelta","deltaY","_onWheelRAF","drawOnWheel","changeTail","curPos","curPosition","_phase","_tail","drawGradient","drawNextPositionAnimated","frames","_frames","drawImageData","leftLength","_incrementalCurve","hexToRgb","getPositions","positions","getNextPositions","phase","curveMax","curve","distances","nextPos","tail","getGradientImageData","_hctx","createImageData","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","colors","_canvas","toNextPosition","tails","nextPhaseOnIdx","inc","curves","scrollAnimate","_addedScrollListener","createCanvas","gradientRenderer","ColorPicker","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","appStateManager","pushToState","onColorChange","applyColor","themeController","gridSection","grid","backgroundColor","isColored","scaleMediaElement","mediaSize","quality","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","file","files","click","requestFile","naturalWidth","naturalHeight","File","wallPaper","prepareWallPaperUpload","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","blur","onGridClick","wallpaper","saveToCache","_tempId","onReady","getPixelPromise","imageUrl","imageSource","averageColorFromImageSource","averageColor","create","getColorsFromWallPaper","getWallPaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","getWallPapers","wallPapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","AppQuickReactionTab","getQuickReaction","quickReaction","setDefaultReaction","RangeSettingSelector","minValue","writeValue","valueDiv","valueContainer","range","AppGeneralSettingsTab","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","runFirst","getNextTimeout","_callback","run","eachTimeout","eachMinute","toLocaleTimeString","suggestCheckboxField","bigCheckboxField","renderQuickReaction","loopCheckboxField","stickerSets","stickersContent","allStickers","AppEditProfileTab","firstNameInputField","bioInputField","about_length_limit_premium","about_length_limit_default","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","userFull","getProfile","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","originalFilter","AppEditFolderTab","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","loadAnimationPromise","onCreateOpen","onEditOpen","documentFragmentToHTML","wrapDraftText","ul","ignoreClick","hasPeer","getDialogOnly","renderMore","_length","exclude_peers","AppChatFoldersTab","filtersRendered","renderFolder","dialogFilter","Object","folder","channels","isAnyGroup","filterId","getFilter","localId","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","toggleAllChats","getSuggestedFilters","order","dialog_filters_limit_premium","dialog_filters_limit_default","getSuggestedDialogsFilters","suggestedFilters","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","invokeApiCacheable","lang_pack","languages1","languages2","rendered","webLangCodes","language","lang_code","native_name","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","setByKey","MIN","MAX_RANGE","MAX","upTo","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","onDisabledChange","gifsCheckboxField","videosCheckboxField","peerKeys","enabledKeys","isAll","logOut","edit","changeAvatarBtn","upload","updateChangeAvatarBtn","buttonsDiv","devicesRow","languageRow","buttonsSection","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","PopupCreateContact","withConfirm","btnConfirm","importContact","telInputField","validate","country_code","AppContactsTab","openContacts","sortedUserList","createList","IS_MOBILE","renderPage","AppArchivedTab","wasFilterId","chatList","AppPeopleNearbyTab","isLocationWatched","parseDistance","retryBtn","latestLocationSaved","accuracy","getLocated","updates","orderedPeers","groupsCounter","usersCounter","peopleSection","locatedPeers","sortedList","errorCategory","startWatching","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","formatNumber","LEFT_COLUMN_ACTIVE_CLASSNAME","fakeGradientDelimiter","captionArgs","delimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","sessionStorage","kz_version","toolsBtn","btnMenuFooter","rel","newBtnMenu","updateBtn","reload","initSearch","archivedCount","unreadPeerIds","navigationItem","noHistory","checkUpdateInterval","ok","hasUpdate","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","BubbleGroup","createAvatar","avatarLoadPromise","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","sortGroupItemsKey","insertGroup","removeItem","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","siblings","getSiblingsAtIndex","modifiedGroups","previousSibling","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","bad","partition","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","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","onPrevClick","selectedMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","lines","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","REACTIONS_ELEMENTS","ReactionsElement","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","availableReactionsResult","isReactionActive","totalReactions","can_see_list","reactionElementIdx","recent_reactions","handleChangedResults","childNodes","timeSpan","RepliesElement","updated","postKey","leftPart","recent_repliers","isUnread","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","reactionsElement","reactionsMessage","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","pinned","clonedArgs","_reactionsElement","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","elementFromPoint","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ScrollSaver","getSaved","clientHeight","findElements","containerRect","elementRect","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","setScrollTopSilently","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","callbacks","toggleObservingNew","isMentionUnread","mentioned","middlewarePromise","throwWhat","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","charCodeAt","buggedRegExp","getDistanceFromBuggedToNormal","char","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","source","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","iso2","IS_ANDROID","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","createVerificationIframe","iframe","allow","contentWindow","parse","PopupPaymentVerification","eventType","eventData","path_full","InputFieldCorrected","onKeyDown","lastKeyDown","deleting","lastTransformed","getPattern","pushRest","autocorrectComplete","selectionStart","selectionEnd","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","noPhoneCodes","onCountryChange","inputMode","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","placeCaretAtEnd","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","params","expiration_month","expiration_year","security_code","public_token","btnConfirmOnEnter","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","invoice","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","selectCountryByIso2","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","PopupPayment","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","isReceipt","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","bot_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","labelEl","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","HTMLInputElement","onSelectionChange","ignoreNextSelectionChange","onFocusOut","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","createRow","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","node","onContentUpdate","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueuePromise","messagesQueue","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getMiddleware","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","appImManager","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","messageId","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","ignoreHeavyAnimation","scrollDimensions","sliceViewportDebounced","topbar","setCorrectIndexThrottled","lastScrollDirection","setStickyDateManually","distanceToEnd","getDistanceToEnd","setPeerPromise","requestHistory","setMessageId","constructBubbles","bubbleGroups","sequential","messagesStorageKey","newItem","_items","groupBubbles","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","contextMenu","highlightBubble","replyAfter","shouldReply","canSend","_target","initMessageReply","constructPeerHelpers","renderNewMessage","setUnreadCount","updateUnreadByDialog","finishPeerChange","postViewsElements","different","postViews","incrementMessageViews","createResizeObserver","resizeObserver","wasHeight","resizing","skip","scrolled","rAF","onResizeEnd","offsetHeight","isScrolledDown","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","readMessages","readHistory","constructPinnedHelpers","constructScheduledHelpers","getScheduledMessagesStorage","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","setLoaded","onScrolledTop","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","permanent","ignoreOnScroll","emptyPlaceholderBubble","ignoreNextScrollEvent","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","_renderNewMessage","newMessage","replyTo","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","forceDuration","fallbackToElementStartWhenCentering","isChangingHeight","messageInput","getNormalSize","dimensions","lastScrollPosition","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","cancelMeasure","samePeer","startParam","perf","bindPrefix","onChangePeer","topMessage","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","unread_count","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","unread_mark","markDialogUnread","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","historyMaxId","canWrite","renderMessagesQueue","setMessagesQueuePromise","renderQueue","renderQueuePromises","loadQueue","filterQueue","avatarPromises","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","local","updatePlaceholderPosition","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","unread","chat_id","is_single","messageMessage","messageMedia","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","forward","replyMarkup","reply_markup","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","popup","switchInlineQuery","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","processingWebPage","quote","previewResizer","preview","quoteTextDiv","strong","textDiv","isSquare","isEmoji","nopremium","newNameContainer","getMidsByMid","wrapper","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","contactNumberDiv","phone_number","wrapPoll","priceEl","needName","titleVia","isHidden","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","getViewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","getHistory","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","generateMessageId","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","getOutputPeer","saveMessages","storage","extraSize","invisibleTop","invisibleBottom","foundVisible","minTop","maxBottom","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","_log","getSponsoredMessage","sponsoredMessages","messagePromise","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","buttonsEl","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","btnClose","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","dialogSize","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTION_CLASS_NAME","REACTIONS_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","animationGroup","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","selectWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","onContextMenu","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","noForwards","viewerPeerId","canOpenReactedList","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","closest","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","onMessageSent","canEditMessage","getMessageFromStorage","hasTarget","isGoodType","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","isFull","totalSize","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","questionInputField","sendSilent","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","getRichValue","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","videoWidth","videoHeight","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","confirmShortcutIsSendShortcut","attachFile","willAttach","shouldCompress","itemDiv","attachMedia","attachDocument","sendFileDetails","config","getConfig","captionLengthMax","caption_length_max","withLinebreaks","wasInputValue","messageInputField","attachFiles","appendDrops","appendGroupCheckboxField","groupCheckboxField","mediaCheckboxField","appendMediaCheckboxField","addFiles","toPush","_file","lastModified","isMedia","sendingParams","sendText","sendAlbum","assign","replyToMsgId","startsWith","objectURL","controls","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","isPhoto","isAudio","finish","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","albumContainer","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","hidden","onVisible","listType","noBlurOnPop","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","alt","getRichElementValue","caretPos","combineSameEntities","EmojiHelper","chatInput","onEmojiSelected","scrollLeft","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","helpers","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","separator","dcId","readBlobAsDataURL","dataURL","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","addedListener","InputFieldAnimated","inputFake","onFakeInput","setHeight","newHeight","currentHeight","transitionDuration","fromSet","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","shiftKey","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","draft","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","borderRadius","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","br","getNeededFakeContainer","hasMentions","unread_mentions_count","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","ctrlKey","metaKey","setStart","collapse","addRange","readAllHistory","commandsMap","italic","underline","strikethrough","monospace","spoiler","saveExecuted","executed","checkType","haveThisType","isCollapsed","tag","commonAncestorContainer","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","suffix","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","wrapSingleMessage","_message","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","VolumeSelector","onMuteClick","setVolume","volume","iconIndex","ICONS","ChatAudio","onPlaybackParams","playbackParams","fasterEl","playbackRate","repeatEl","onPause","toggleEl","onStop","onMediaPlay","isMusic","volumeSelector","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","cssText","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","getRow","animateFirst","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","debug","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","lastY","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ONE_HOUR","PopupMute","mutePeer","radioForm","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","audioAsset","getAudioConstraints","constraints","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","getScreenConstraints","skipAudio","frameRate","getScreenStream","screenStream","getDisplayMedia","getVideoTracks","contentHint","getStream","stream","getUserMedia","getTracks","getStreamCached","_cache","screen","isScreen","stopTrack","track","StringFromLineBuilder","newLine","word","addJoined","finalize","toTelegramSource","fromTelegramSource","fixMediaLineType","mediaType","getConnectionTypeForMediaType","generateMediaFirstLine","port","payloadIds","connectionType","SDPBuilder","addCandidate","foundation","component","protocol","priority","generation","performCandidate","addHeader","sId","bundleMids","bundle","addTransport","transport","skipCandidates","ufrag","pwd","fingerprint","fingerprints","setup","candidates","candidate","addSsrc","streamName","sourceGroups","addSource","ssrc","addMsid","ssrcGroup","sources","semantics","addSsrcEntry","isAnswer","isApplication","codec","isInactive","shouldBeSkipped","payloadTypes","hdrexts","hdrext","clockrate","parameters","fbs","fb","subtype","addConference","conference","sessionId","IS_FIREFOX","recvEntry","sendEntry","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","interval","getAmplitude","streamAnalyser","rms","analyse","filteredItems","audioItems","amplitudes","ANALYSER_LISTENER","AudioContext","webkitAudioContext","outputStream","MediaStream","inputStream","canCreateConferenceEntry","addStream","addTrack","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","hasInputTrackKind","substring","replaceInputAudio","oldTrack","timer","appendToConference","transceiverInit","streams","tracks","findEntry","createEntry","transceiver","createTransceiver","connection","mediaTrackType","trackIdx","sender","replaceTrack","CallInstanceBase","fixSafariAudio","isSharingAudio","streamManager","isSharingVideo","requestAudioSource","requestInputSource","isAudioGood","isVideoGood","onInputStream","requestScreen","endpoint","onTrack","tryAddTrack","saveInputVideoStream","isOutput","isVideo","elementEndpoint","useStream","srcObject","sinkId","outputDeviceId","setSinkId","setMuted","getAudioTracks","isClosing","ConferenceEntry","originalDirection","setPort","setEndpoint","addTransceiver","setSource","generateSsrc","LocalConferenceDescription","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","setData","deleteEntry","setEntrySource","setEntryPeerId","findFreeSendRecvEntry","isSending","getEntryByMid","getEntryBySource","getEntriesByPeerId","generateSdp","fromConference","CallConnectionInstanceBase","createPeerConnection","RTCPeerConnection","signalingState","connectionState","iceConnectionState","createDataChannel","dict","dataChannel","channel","createDescription","appendStreamToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","SDP","mediaSections","bundleLine","parsed","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","mediaLineParts","SDPAttributeInner","missed","exists","rest","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","mediaLine","isReceiving","lookupAttributeKeys","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","parseMediaSectionInfo","sdp","clientInfo","telegramSourceGroups","sdpLines","parseSourceGroups","raw","GROUP_CALL_STATE","GroupCallConnectionInstance","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","groupCall","groupCallId","processedChannels","processed","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","appGroupCallsManager","joinGroupCall","connections","extmap","performExtmap","filterServerCodecs","isNewConnection","originalOffer","createOffer","iceRestart","offer","hasMunged","skipAddingMulticast","generator","originalSsrcs","ssrcs","ssrcs2","ssrcsStrLines","ssrc2","addSimulcast","localMLine","codecIds","newData","newChannel","mungedSdp","fixLocalOffer","setLocalDescription","entriesToDelete","answerDescription","iceGatheringState","setRemoteDescription","updateConstraints","getTransceivers","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","can_self_unmute","getCachedParticipants","isSharingScreen","presentation","pinSource","unpinSource","unpinAll","getParticipantByPeerId","toggleMuted","changeUserMuted","editParticipant","getVideoElementFromParticipantByType","source_groups","clone","createConnectionInstance","changeRaiseHand","raise","raiseHand","startScreenSharingInternal","connectionInstance","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","toggleScreenSharing","startVideoSharingInternal","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","stopVideoSharing","toggleVideoSharing","hangUp","discard","rejoin","isDiscarded","isUpdatingMeInCurrentCall","raise_hand_rating","audio_source","audioSource","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","makeSsrcFromParticipant","makeSsrcsFromParticipant","modifiedTypes","oldSsrc","oldSource","oldEntry","GroupCallsController","currentGroupCall","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","createMainStreamManager","joinGroupCallInternal","getGroupCallFull","getGroupCallParticipants","handleUpdateGroupCallParticipants","updatingSdp","groupCallsController","ChatTopbar","verifyButtons","isMenuOpen","btnMore","deleteButtonText","getDeleteButtonText","menuButtons","buttonsToVerify","verifyVideoChatButton","call_active","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","onResize","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","constructDiscussionHelpers","byCurrent","newAvatar","setTitleCallback","setStatusCallback","setTitleManual","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","instance","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","objectUrl","imageWidth","imageHeight","patternHeight","originalHeight","mask","globalCompositeOperation","centerY","topY","endY","bottomY","setCanvasDimensions","Chat","backgroundEl","Log","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","patternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","beforeDestroy","cleanupBackground","searchTab","_isAnyGroup","setAutoDownloadMedia","destroySharedMediaTab","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","setPrefix","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","getActiveMarkupButton","nodes","getSelectedNodes","currentMarkups","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","draw","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","createLinearGradient","addColorStop","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","customProperties","computedStyle","getProperty","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","iconClassName","element2","actionClassName","GroupCallParticipantsList","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","ControlsHover","hideControls","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","canHideControls","showControls","toggleControls","ignoreClickClassName","relatedTarget","showOnLeaveToClassName","lockControls","callVideoCanvasBlur","renderFrame","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","setElementDisplay","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","isPinned","hasAnyVideo","participantElements","participantVideo","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","canManageCall","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","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","withoutOverlay","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","onScreenClick","btnScreen","onLeaveClick","onFullScreenChange","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","CALL_STATE","CallDescriptionElement","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","big","isPendingIncoming","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","isVertical","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","parseSignalingData","convertNumber","ssrcGroups","sourceGroup","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","feedbackTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","offerSent","initialSetup","sendCallSignalingData","CALL_REQUEST_TIMEOUT","CallsController","instances","sortedInstances","setPhoneCall","confirmCall","createCallInstance","admin_id","overrideConnectionState","setHangUpTimeout","encryptionKey","g_a","dh","g_a_or_b","g_a_hash","bytesCmp","key_fingerprint","appCallsManager","computeKey","joinCall","callId","onUpdatePhoneCallSignalingData","currentCall","getCallByUserId","CallInstance","hasConnected","clearHangUpTimeout","discardReason","hasCurrent","startCallInternal","fullInfo","participant_id","generateDh","requestCall","phoneCall","callsController","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","convertToUint8Array","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","stringBuilder","addExtmap","addPayloadTypes","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","userAgent","isSafari","j","fmtp","getOwnPropertyNames","pName","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","relAddress","tcpType","networkId","networkCost","generateOffer","generateAnswer","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","Proxy","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","sortIndex","wasStartingScreen","wasStartingVideo","isSharingVideoType","audioTrack","hangUpTimeout","canAccept","g_b","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","configuration","ipv6","urls","turn","stun","credential","p2p_allowed","getRtcConfiguration","sendIceCandidate","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","p2pParseCandidate","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","sdpDescription","videoTrack","onMutedChange","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","sendRecvEntry","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","TopbarCall","onState","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconEl","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","singleInstance","idle","toggleToggler","peerString","soundReset","unreadUnmutedPeerIds","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","isBlink","setFavicon","titleInterval","arc","fontSize","textBaseline","textAlign","fillText","prevFavicon","replaceChild","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","clipboardData","originalEvent","webkitGetAsEntry","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","onHashChange","saveState","parseUriParams","tgaddr","postId","openUsername","userName","setSettings","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","apiUpdatesManager","backgroundPromises","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typings","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","overrideHash","stateStorage","topbarCall","discardCurrentCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","INVOICE","makeLink","VOICE_CHAT","USER_PHONE_NUMBER","PRIVATE_POST","thread","comment","MESSAGE","attachKeydownListener","timeoutOperation","requests","request","isBad","activatingChat","IGNORE_KEYS","altKey","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","openUrl","wrappedUrl","noPathnameParams","pathname","noUriParams","openComment","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","prevTab","prevIdx","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","drop","transitionTime","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","dot","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","peerTitlePromise","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getUserStatus","ignoreSelf","getPeerStatus","useWhitespace","typingContainer","VideoPlayer","onPlaybackRackMenuToggle","onPip","onPipClose","playbackRateButton","skin","stylePlayer","setBtnMenuToggle","initDuration","buildControls","timeDuration","pipButton","fullScreenButton","timeElapsed","leftControls","requestPictureInPicture","debounceTime","debouncedPip","listener","pictureInPictureElement","toggleFullScreen","nextIdx","PLAYBACK_RATES","onFullScreen","setPlaybackRateIcon","pictureInPictureEnabled","rate","PLAYBACK_RATES_ICONS","webkitEnterFullscreen","enterFullscreen","AppMediaViewerBase","topButtons","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","classNames","ctrlKeyDown","changeZoom","onKeyUp","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","authorRight","zoom","onLoadedMore","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","zoomSwipeHandler","lastDiffY","btnMenuToggle","setMoverToTarget","appMediaViewer","removeGlobalListeners","toggleOverlay","toggleGlobalListeners","setGlobalListeners","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGForeignObjectElement","needOpacity","setFullAspect","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","setAuthorInfo","wrapTitlePromise","oldAvatar","_openMedia","setAuthorPromise","setTargets","useContainerAsTarget","padding","windowH","useController","moverVideo","canPlayThrough","createPlayer","ckin","otherMediaViewer","releaseSingleMedia","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","cancellablePromise","haveImage","captionTimeout","isForDocument","onAuthorClick","onEmptied","setCaptionTimeout","btnMenuForward","btnMenuDownload","btnMenuDelete","onCaptionClick","getScheduledMessageByPeer","setCaption","cantForwardMessage","cantDownloadMessage","AvatarListLoader","loadedAllUp","AppMediaViewerAvatar","onAvatarUpdate","getTarget","hadMessage","isObject","believeMe","addedToQueue","wasPeerId","newPeerId","DialogsContextMenu","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","SENDING_STATUS","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","rootScope","baseDcId","connectionStatus","setFirstConnectionTimeout","online","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","forceReconnectTimeout","setStateTimeout","statusContainer","easeInOutSine","roundRect","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","animations","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","shimmerColor","on","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","completed","elapsedRowTime","dialogHeight","createPattern","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","drawCircle","drawCircleFromStart","setPromiseMiddleware","oldPromise","SortedDialogList","indexKey","appDialogsManager","addListDialog","isBatch","AppDialogsManager","placeholders","sortedLists","scrollables","folders","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","onTabChange","loadDialogsRenderPromise","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","loadContacts","verifyPeerIdForContacts","processContact","added","setListClickListener","onChatsRegularScroll","sliceTimeout","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","getProxiedManagers","bottomPart","allChatsIntlElement","isFilterIdAvailable","clearCurrent","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","getDialogIndexKey","getDialogIndexKeyByFilterId","setOnlineStatus","hasClassName","initListeners","getDialogDom","processDialogForCallStatus","setFilterUnreadCount","setLastMessageN","setUnread","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessagesN","setDialogActive","getCachedDialogs","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","filtersArr","haveFilters","addFilters","addFiltersPromise","showFiltersPromise","getNotifyPeerTypeSettings","fillConversations","getOffsetIndex","isDialogMustBeInViewport","migratedTo","testDialogForFilter","topOffset","bottomOffset","unreadSpan","unreadUnmutedCount","unreadCount","getFolderUnreadCount","generateScrollable","sortedDialogList","createChatList","clientWidth","wasShowing","cachedInfoPromise","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","cccc","offsetDialog","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","setLastMessage","draftMessage","lastTimeSpan","willPrepend","videoTypes","playIcon","senderBold","setUnreadMessages","wasMuted","setStatusMessage","hasUnreadBadge","disableAnimationIfRippleFound","setSendingStatus","statusSpan","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","isMention","getDialog","originalDialog","setCallStatus","START_X","wasMounted","itemProgress","groupCallActiveIcon","addDialogNew","call_not_empty","addDialogAndSetLastMessage","addDialog","captionDiv","titleSpanContainer","titleP","rightSpan","oldTypingElement","newTypingElement","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","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function"],"sourceRoot":""} \ No newline at end of file diff --git a/public/960.7ae964ab6031f51a0275.bundle.js b/public/960.7ae964ab6031f51a0275.bundle.js deleted file mode 100644 index 5d7d52111..000000000 --- a/public/960.7ae964ab6031f51a0275.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[960],{410:(e,t,s)=>{s.d(t,{GO:()=>i,ZP:()=>o});const n=s(1267).Z.debug,i="undefined"!=typeof window?window:self,o=n},1267:(e,t,s)=>{s.d(t,{Z:()=>i});const n={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};n.http=location.search.indexOf("http=1")>0,n.http&&(n.transport="https");const i=n},6761:(e,t,s)=>{s.d(t,{Z:()=>n});const n="undefined"!=typeof window?window:self},4064:(e,t,s)=>{function n(e,t){const s=e.findIndex(t);return-1!==s?e.splice(s,1)[0]:void 0}s.d(t,{Z:()=>n})},1655:(e,t,s)=>{function n(e,t){const s=e.indexOf(t),n=-1!==s&&e.splice(s,1);return n&&n[0]}s.d(t,{Z:()=>n})},4903:(e,t,s)=>{function n(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),s=new Uint8Array(t);let n=0;return e.forEach((e=>{s.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length})),s}s.d(t,{Z:()=>n})},1352:(e,t,s)=>{s.d(t,{N5:()=>i,SU:()=>n,kC:()=>o,sj:()=>c});const n="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,i="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!n,o=i||n,r=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},a=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((s=>{s.length&&s.slice(e?0:-1).forEach((e=>{r(e,...t)}))}))},c=(n&&a.bind(null,!1),n?a.bind(null,!0):i?(...e)=>{r(self,...e)}:()=>{})},5289:(e,t,s)=>{s.d(t,{Z:()=>i});const n=Date.now();function i(){return"["+((Date.now()-n)/1e3).toFixed(3)+"]"}},3241:(e,t,s)=>{s.d(t,{Z:()=>i});var n=s(4064);class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var n;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null==s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&(0,n.Z)(this.listeners[e],(e=>e.callback===t))}invokeListenerCallback(e,t,...s){var n;let i;try{i=t.callback(...s)}catch(e){console.error(e)}return(null===(n=t.options)||void 0===n?void 0:n.once)&&this.removeEventListener(e,t.callback),i}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const n=t&&[],i=this.listeners[e];return i&&i.slice().forEach((t=>{if(-1===i.findIndex((e=>e.callback===t.callback)))return;const o=this.invokeListenerCallback(e,t,...s);n&&n.push(o)})),n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},8630:(e,t,s)=>{s.d(t,{Z:()=>c});var n=s(153),i=s(410),o=s(1352);class r extends n.Z{invokeCrypto(e,...t){const s={method:e,args:t},n=this.listeners.invoke;if(null==n?void 0:n.length){let e=n[0].callback(s);return o.kC||e instanceof Promise||(e=Promise.resolve(e)),e}return this.invoke("invoke",s)}}const a=new r;i.GO&&(i.GO.cryptoMessagePort=a);const c=a},153:(e,t,s)=>{s.d(t,{Z:()=>h});var n=s(410),i=s(6761),o=s(1655),r=s(1352),a=s(3241),c=s(5003);class h extends a.Z{constructor(){super(!1),this.onMessage=e=>{const t=e.data,s=e.source||e.currentTarget;this.processTaskMap[t.type](t,s,e)},this.processResultTask=e=>{const{taskId:t,result:s,error:n}=e.payload,i=this.awaiting[t];i&&(this.debug&&this.log.debug("done",i.taskType,s,n),"error"in e.payload?i.reject(n):i.resolve(s),delete this.awaiting[t])},this.processAckTask=e=>{const t=e.payload,s=this.awaiting[t.taskId];s&&(0,s.resolve)({cached:t.cached,result:t.cached?"result"in t?Promise.resolve(t.result):Promise.reject(t.error):new Promise(((e,t)=>{s.resolve=e,s.reject=t}))})},this.processPingTask=(e,t,s)=>{this.pushTask(this.createTask("pong",void 0),s.source)},this.processPongTask=(e,t,s)=>{const n=this.pingResolves.get(t);n&&(this.pingResolves.delete(t),n())},this.processCloseTask=(e,t,s)=>{this.detachPort(t)},this.processInvokeTask=(e,t,s)=>{return n=this,i=void 0,r=function*(){const n=e.id,i=e.payload;let o,r,a,c;i.void||(o={taskId:n},r=this.createTask("result",o)),i.withAck&&(a=this.createTask("ack",{taskId:n,cached:!0}));try{const e=this.listeners[i.type];if(!(null==e?void 0:e.length))throw new Error("no listener");const n=e[0];let r=this.invokeListenerCallback(i.type,n,i.payload,t,s);if(i.void)return;if(c=r instanceof Promise,a){const e=!c;if(a.payload.cached=e,e&&(a.payload.result=r),this.pushTask(a,t),e)return}c&&(r=yield r),o.result=r}catch(s){if(this.log.error("worker task error:",s,e),i.void)return;if(a&&a.payload.cached)return a.payload.error=s,void this.pushTask(a,t);o.error=s}this.pushTask(r,t)},new((o=void 0)||(o=Promise))((function(e,t){function s(e){try{c(r.next(e))}catch(e){t(e)}}function a(e){try{c(r.throw(e))}catch(e){t(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(s,a)}c((r=r.apply(n,i||[])).next())}));var n,i,o,r},this.processTaskMap={result:this.processResultTask,ack:this.processAckTask,invoke:this.processInvokeTask,ping:this.processPingTask,pong:this.processPongTask,close:this.processCloseTask}}_constructor(){super._constructor(!1),this.listenPorts=[],this.sendPorts=[],this.pingResolves=new Map,this.taskId=0,this.awaiting={},this.pending=new Map,this.log=(0,c.kg)("MP"),this.debug=n.ZP,"undefined"!=typeof window&&window.addEventListener("beforeunload",(()=>{const e=this.createTask("close",void 0);this.postMessage(void 0,e)}))}setOnPortDisconnect(e){this.onPortDisconnect=e}attachPort(e){this.attachListenPort(e),this.attachSendPort(e)}attachListenPort(e){this.listenPorts.push(e),e.addEventListener("message",this.onMessage)}attachSendPort(e){this.log.warn("attaching port"),e.start&&e.start(),this.sendPorts.push(e)}detachPort(e){this.log.warn("disconnecting port"),e.removeEventListener("message",this.onMessage),(0,o.Z)(this.listenPorts,e),(0,o.Z)(this.sendPorts,e),e.close&&e.close(),this.onPortDisconnect&&this.onPortDisconnect(e)}postMessage(e,t){(Array.isArray(e)?e:e?[e]:this.sendPorts).forEach((e=>{e.postMessage(t,t.transfer)}))}releasePending(){this.listenPorts.length&&!this.releasingPending&&(this.releasingPending=!0,this.debug&&this.log.debug("releasing tasks, length:",this.pending.size),this.pending.forEach(((e,t)=>{e.forEach((e=>{try{r.SU?(0,r.sj)(e):this.postMessage(t,e)}catch(s){this.log.error("postMessage error:",s,e,t)}}))})),this.debug&&this.log.debug("released tasks"),this.pending.clear(),this.releasingPending=!1)}createTask(e,t,s){return{type:e,payload:t,id:this.taskId++,transfer:s}}createInvokeTask(e,t,s,n,i){return this.createTask("invoke",{type:e,payload:t,withAck:s,void:n},i)}pushTask(e,t){let s=this.pending.get(t);s||this.pending.set(t,s=[]),s.push(e),this.releasePending()}invokeVoid(e,t,s,n){const i=this.createInvokeTask(e,t,void 0,!0,n);this.pushTask(i,s)}invoke(e,t,s,n,o){let a;this.debug&&this.log.debug("start",e,t);const c=new Promise(((i,r)=>{a=this.createInvokeTask(e,t,s,void 0,o),this.awaiting[a.id]={resolve:i,reject:r,taskType:e},this.pushTask(a,n)}));if(r.kC){c.finally((()=>{clearInterval(e)}));const e=i.Z.setInterval((()=>{this.log.error("task still has no result",a,n)}),5e3)}return c}invokeExceptSource(e,t,s){const n=this.sendPorts.slice();(0,o.Z)(n,s),n.forEach((s=>{this.invokeVoid(e,t,s)}))}}},690:(e,t,s)=>{var n=s(4903);Uint8Array.prototype.concat=function(...e){return(0,n.Z)(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)))))}}}]); -//# sourceMappingURL=960.7ae964ab6031f51a0275.bundle.js.map \ No newline at end of file diff --git a/public/960.7ae964ab6031f51a0275.bundle.js.map b/public/960.7ae964ab6031f51a0275.bundle.js.map deleted file mode 100644 index a922bb70a..000000000 --- a/public/960.7ae964ab6031f51a0275.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"960.7ae964ab6031f51a0275.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/helpers/array/findAndSplice.ts","webpack://tweb/./src/helpers/array/indexOfAndSplice.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/dT.ts","webpack://tweb/./src/helpers/eventListenerBase.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/mtproto/superMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = (process.env.NODE_ENV !== 'production' || Modes.debug)/* && false */;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\r\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\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 { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","export default function findAndSplice(array: Array, verify: (value: T, index?: number, array?: Array) => boolean) {\n const index = array.findIndex(verify);\n return index !== -1 ? array.splice(index, 1)[0] : undefined;\n};\n","export default function indexOfAndSplice(array: Array, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({includeUncontrolled: false, type: 'window'});\r\n};\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","const _logTimer = Date.now();\r\nexport default function dT() {\r\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\nimport findAndSplice from \"./array/findAndSplice\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n// export type EventListenerListeners = Record any>;\r\n// export type EventListenerListeners = {[name in string]: Function};\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\ntype ListenerObject = {callback: T, options: boolean | AddEventListenerOptions};\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n findAndSplice(this.listeners[name], l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n protected invokeListenerCallback>(name: T, listener: L, ...args: ArgumentTypes) {\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n const result = this.invokeListenerCallback(name, listener, ...args);\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n // @ts-ignore\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CryptoMethods } from './crypto_methods';\r\nimport SuperMessagePort from '../mtproto/superMessagePort';\r\nimport { Awaited } from '../../types';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { IS_WORKER } from '../../helpers/context';\r\n\r\ntype CryptoEvent = {\r\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\r\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\r\n};\r\n\r\nexport class CryptoMessagePort extends SuperMessagePort {\r\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\r\n const payload = {method, args};\r\n const listeners = this.listeners['invoke'];\r\n if(listeners?.length) { // already in worker\r\n // try {\r\n // @ts-ignore\r\n let result: any = listeners[0].callback(payload);\r\n if(!IS_WORKER && !(result instanceof Promise)) {\r\n result = Promise.resolve(result);\r\n }\r\n\r\n return result;\r\n // } catch(err) {\r\n // return Promise.reject(err);\r\n // }\r\n }\r\n\r\n // @ts-ignore\r\n return this.invoke('invoke', payload);\r\n }\r\n}\r\n\r\nconst cryptoMessagePort = new CryptoMessagePort();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\r\nexport default cryptoMessagePort;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../../config/debug\";\nimport ctx from \"../../environment/ctx\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport { IS_SERVICE_WORKER, IS_WORKER, notifyAll } from \"../../helpers/context\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { Awaited, WorkerTaskTemplate, WorkerTaskVoidTemplate } from \"../../types\";\nimport { logger } from \"../logger\";\n\ntype SuperMessagePortTask = WorkerTaskTemplate & {\n transfer?: Transferable[]\n};\n\ninterface InvokeTask extends SuperMessagePortTask {\n type: 'invoke',\n payload: WorkerTaskVoidTemplate & {withAck?: boolean, void?: boolean}\n}\n\ninterface ResultTask extends SuperMessagePortTask {\n type: 'result',\n payload: {\n taskId: number,\n result?: any,\n error?: any\n }\n}\n\ninterface AckTask extends SuperMessagePortTask {\n type: 'ack',\n payload: {\n cached: boolean,\n taskId: number\n result?: any,\n error?: any,\n }\n}\n\ninterface PingTask extends SuperMessagePortTask {\n type: 'ping'\n}\n\ninterface PongTask extends SuperMessagePortTask {\n type: 'pong'\n}\n\ninterface BatchTask extends SuperMessagePortTask {\n type: 'batch',\n payload: Task[]\n}\n\ninterface CloseTask extends SuperMessagePortTask {\n type: 'close'\n}\n\ntype Task = InvokeTask | ResultTask | AckTask | PingTask | PongTask | BatchTask | CloseTask;\ntype TaskMap = {\n [type in Task as type['type']]?: (task: Extract, source: MessageEventSource, event: MessageEvent) => void | Promise\n};\n\nexport type AckedResult = {\n cached: boolean,\n result: Promise\n};\n// export type AckedResult = {\n// cached: true,\n// result: T\n// } | {\n// cached: false,\n// result: Promise\n// };\n\ntype ListenPort = WindowProxy | MessagePort | ServiceWorker | Worker | ServiceWorkerContainer;\ntype SendPort = WindowProxy | MessagePort | ServiceWorker | Worker;\n\ntype ListenerCallback = (payload: any, source: MessageEventSource, event: MessageEvent) => any;\ntype Listeners = Record;\n\n// const PING_INTERVAL = DEBUG && false ? 0x7FFFFFFF : 5000;\n// const PING_TIMEOUT = DEBUG && false ? 0x7FFFFFFF : 10000;\n\nexport default class SuperMessagePort<\n Workers extends Listeners, \n Masters extends Listeners,\n IsMaster extends boolean,\n Receive extends Listeners = IsMaster extends true ? Masters : Workers,\n Send extends Listeners = IsMaster extends true ? Workers : Masters\n> extends EventListenerBase {\n protected listenPorts: Array;\n protected sendPorts: Array;\n protected pingResolves: Map void>;\n\n protected taskId: number;\n protected awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskType: string\n }\n };\n protected pending: Map;\n\n protected log: ReturnType;\n protected debug: boolean;\n protected releasingPending: boolean;\n\n protected processTaskMap: TaskMap;\n\n protected onPortDisconnect: (source: MessageEventSource) => void;\n\n constructor() {\n super(false);\n\n this.processTaskMap = {\n result: this.processResultTask,\n ack: this.processAckTask,\n invoke: this.processInvokeTask,\n ping: this.processPingTask,\n pong: this.processPongTask,\n close: this.processCloseTask\n };\n }\n\n public _constructor() {\n super._constructor(false);\n\n this.listenPorts = [];\n this.sendPorts = [];\n this.pingResolves = new Map();\n this.taskId = 0;\n this.awaiting = {};\n this.pending = new Map();\n this.log = logger('MP');\n this.debug = DEBUG;\n\n if(typeof(window) !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n const task = this.createTask('close', undefined);\n this.postMessage(undefined, task);\n });\n }\n }\n\n public setOnPortDisconnect(callback: (source: MessageEventSource) => void) {\n this.onPortDisconnect = callback;\n }\n\n public attachPort(port: MessageEventSource) {\n this.attachListenPort(port);\n this.attachSendPort(port);\n }\n\n public attachListenPort(port: ListenPort) {\n this.listenPorts.push(port);\n port.addEventListener('message', this.onMessage as any);\n }\n\n public attachSendPort(port: SendPort) {\n this.log.warn('attaching port');\n\n if((port as MessagePort).start) {\n (port as MessagePort).start();\n }\n\n this.sendPorts.push(port);\n // this.sendPing(port);\n }\n\n // ! Can't rely on ping because timers can be suspended\n // protected sendPing(port: SendPort, loop = IS_WORKER) {\n // let timeout: number;\n // const promise = new Promise((resolve, reject) => {\n // this.pingResolves.set(port, resolve);\n // this.pushTask(this.createTask('ping', undefined), port);\n\n // timeout = ctx.setTimeout(() => {\n // reject();\n // }, PING_TIMEOUT);\n // });\n\n // promise.then(() => {\n // // this.log('got pong');\n\n // clearTimeout(timeout);\n // this.pingResolves.delete(port);\n\n // if(loop) {\n // this.sendPingWithTimeout(port);\n // }\n // }, () => {\n // this.pingResolves.delete(port);\n // this.detachPort(port);\n // });\n // }\n\n // protected sendPingWithTimeout(port: SendPort, timeout = PING_INTERVAL) {\n // ctx.setTimeout(() => {\n // if(!this.sendPorts.includes(port)) {\n // return;\n // }\n\n // this.sendPing(port);\n // }, timeout);\n // }\n\n protected detachPort(port: SendPort) {\n this.log.warn('disconnecting port');\n \n port.removeEventListener('message', this.onMessage as any);\n indexOfAndSplice(this.listenPorts, port);\n indexOfAndSplice(this.sendPorts, port);\n if((port as MessagePort).close) {\n (port as MessagePort).close();\n }\n\n this.onPortDisconnect && this.onPortDisconnect(port as any);\n }\n\n protected postMessage(port: SendPort | SendPort[], task: Task) {\n const ports = Array.isArray(port) ? port : (port ? [port] : this.sendPorts);\n ports.forEach((port) => {\n port.postMessage(task, task.transfer as any);\n });\n }\n\n protected onMessage = (event: MessageEvent) => {\n const task: Task = event.data;\n // this.log('got message', task);\n\n const source: MessageEventSource = event.source || event.currentTarget as any; // can have no source\n /* if(task.type === 'batch') {\n const newEvent: MessageEvent = {data: event.data, source: event.source, currentTarget: event.currentTarget} as any;\n task.payload.forEach((task) => {\n // @ts-ignore\n newEvent.data = task;\n this.onMessage(newEvent);\n });\n } */\n\n // @ts-ignore\n this.processTaskMap[task.type](task, source, event);\n };\n\n protected /* async */ releasePending() {\n //return;\n\n if(!this.listenPorts.length || this.releasingPending) {\n return;\n }\n\n this.releasingPending = true;\n // const perf = performance.now();\n // await pause(0);\n\n this.debug && this.log.debug('releasing tasks, length:', this.pending.size/* , performance.now() - perf */);\n\n this.pending.forEach((portTasks, port) => {\n // let batchTask: BatchTask;\n // const tasks: Task[] = [];\n // portTasks.forEach((task) => {\n // if(task.transfer) {\n // batchTask = undefined;\n // tasks.push(task);\n // } else {\n // if(!batchTask) {\n // batchTask = this.createTask('batch', []);\n // tasks.push(batchTask);\n // }\n\n // batchTask.payload.push(task);\n // }\n // });\n\n const tasks = portTasks;\n\n tasks.forEach((task) => {\n // if(task.type === 'batch') {\n // this.log(`batching ${task.payload.length} tasks`);\n // }\n\n try {\n if(IS_SERVICE_WORKER) {\n notifyAll(task);\n } else {\n this.postMessage(port, task);\n }\n } catch(err) {\n this.log.error('postMessage error:', err, task, port);\n }\n });\n });\n\n this.debug && this.log.debug('released tasks');\n this.pending.clear();\n\n this.releasingPending = false;\n }\n\n protected processResultTask = (task: ResultTask) => {\n const {taskId, result, error} = task.payload;\n const deferred = this.awaiting[taskId];\n if(!deferred) {\n return;\n }\n\n this.debug && this.log.debug('done', deferred.taskType, result, error);\n 'error' in task.payload ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n };\n\n protected processAckTask = (task: AckTask) => {\n const payload = task.payload;\n const deferred = this.awaiting[payload.taskId];\n if(!deferred) {\n return;\n }\n\n // * will finish the init promise with incoming result\n const previousResolve: (acked: AckedResult) => void = deferred.resolve;\n // const previousReject = deferred.reject;\n\n // if(payload.cached) {\n // if('result' in payload) {\n // previousResolve({\n // cached: true,\n // result: payload.result\n // });\n // } else {\n // previousReject(payload.error);\n // }\n // } else {\n // const ret: AckedResult = {\n // cached: false,\n // result: new Promise((resolve, reject) => {\n // deferred.resolve = resolve;\n // deferred.reject = reject;\n // })\n // };\n\n // previousResolve(ret);\n // }\n\n const ret: AckedResult = {\n cached: payload.cached,\n result: payload.cached ? ('result' in payload ? Promise.resolve(payload.result) : Promise.reject(payload.error)) : new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n })\n };\n\n previousResolve(ret);\n };\n\n protected processPingTask = (task: PingTask, source: MessageEventSource, event: MessageEvent) => {\n this.pushTask(this.createTask('pong', undefined), event.source);\n };\n\n protected processPongTask = (task: PongTask, source: MessageEventSource, event: MessageEvent) => {\n const pingResolve = this.pingResolves.get(source);\n if(pingResolve) {\n this.pingResolves.delete(source);\n pingResolve();\n }\n };\n\n protected processCloseTask = (task: CloseTask, source: MessageEventSource, event: MessageEvent) => {\n this.detachPort(source);\n };\n\n protected processInvokeTask = async(task: InvokeTask, source: MessageEventSource, event: MessageEvent) => {\n const id = task.id;\n const innerTask = task.payload;\n \n let resultTaskPayload: ResultTask['payload'];\n let resultTask: ResultTask, ackTask: AckTask;\n if(!innerTask.void) {\n resultTaskPayload = {taskId: id};\n resultTask = this.createTask('result', resultTaskPayload);\n }\n\n if(innerTask.withAck) {\n ackTask = this.createTask('ack', {\n taskId: id,\n cached: true\n });\n }\n\n let isPromise: boolean;\n try {\n const listeners = this.listeners[innerTask.type];\n if(!listeners?.length) {\n throw new Error('no listener');\n }\n\n const listener = listeners[0];\n\n // @ts-ignore\n let result = this.invokeListenerCallback(innerTask.type, listener, innerTask.payload, source, event);\n if(innerTask.void) {\n return;\n }\n\n isPromise = result instanceof Promise;\n\n if(ackTask) {\n const cached = !isPromise;\n ackTask.payload.cached = cached;\n if(cached) ackTask.payload.result = result;\n this.pushTask(ackTask, source);\n\n if(cached) {\n return;\n }\n }\n\n if(isPromise) {\n result = await result;\n }\n \n resultTaskPayload.result = result;\n } catch(error) {\n this.log.error('worker task error:', error, task);\n if(innerTask.void) {\n return;\n }\n\n if(ackTask && ackTask.payload.cached) {\n ackTask.payload.error = error;\n this.pushTask(ackTask, source);\n return;\n }\n\n resultTaskPayload.error = error;\n }\n\n this.pushTask(resultTask, source);\n };\n\n protected createTask[0]>(type: T, payload: K['payload'], transfer?: Transferable[]): K {\n return {\n type,\n payload,\n id: this.taskId++,\n transfer\n } as K;\n }\n\n protected createInvokeTask(type: string, payload: any, withAck?: boolean, _void?: boolean, transfer?: Transferable[]): InvokeTask {\n return this.createTask('invoke', {\n type,\n payload,\n withAck,\n void: _void\n }, transfer);\n }\n\n protected pushTask(task: Task, port?: SendPort) {\n let tasks = this.pending.get(port);\n if(!tasks) {\n this.pending.set(port, tasks = []);\n }\n\n tasks.push(task);\n this.releasePending();\n }\n\n public invokeVoid(type: T, payload: Parameters[0], port?: SendPort, transfer?: Transferable[]) {\n const task = this.createInvokeTask(type as string, payload, undefined, true, transfer);\n this.pushTask(task, port);\n }\n\n public invoke(type: T, payload: Parameters[0], withAck?: false, port?: SendPort, transfer?: Transferable[]): Promise>>;\n public invoke(type: T, payload: Parameters[0], withAck?: true, port?: SendPort, transfer?: Transferable[]): Promise>>>;\n public invoke(type: T, payload: Parameters[0], withAck?: boolean, port?: SendPort, transfer?: Transferable[]) {\n this.debug && this.log.debug('start', type, payload);\n\n let task: InvokeTask;\n const promise = new Promise>>((resolve, reject) => {\n task = this.createInvokeTask(type as string, payload, withAck, undefined, transfer);\n this.awaiting[task.id] = {resolve, reject, taskType: type as string};\n this.pushTask(task, port);\n });\n\n if(IS_WORKER) {\n promise.finally(() => {\n clearInterval(interval);\n });\n \n const interval = ctx.setInterval(() => {\n this.log.error('task still has no result', task, port);\n }, 5e3);\n } else if(false) {\n // let timedOut = false;\n const startTime = Date.now();\n promise.finally(() => {\n const elapsedTime = Date.now() - startTime;\n if(elapsedTime >= TIMEOUT) {\n this.log.error(`task was processing ${Date.now() - startTime}ms`, task.payload.payload, port);\n }/* else {\n clearTimeout(timeout);\n } */\n });\n\n const TIMEOUT = 10;\n // const timeout = ctx.setTimeout(() => {\n // timedOut = true;\n // // this.log.error(`task is processing more than ${TIMEOUT} milliseconds`, task, port);\n // }, TIMEOUT);\n }\n\n return promise;\n }\n\n public invokeExceptSource(type: T, payload: Parameters[0], source?: SendPort) {\n const ports = this.sendPorts.slice();\n indexOfAndSplice(ports, source);\n\n ports.forEach((target) => {\n this.invokeVoid(type, payload, target);\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 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"],"names":["DEBUG","MOUNT_CLASS_TO","window","self","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","findAndSplice","array","verify","index","findIndex","splice","undefined","indexOfAndSplice","item","idx","spliced","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","slice","notifyAll","bind","_logTimer","Date","now","dT","toFixed","EventListenerBase","constructor","reuseResults","this","_constructor","listenerResults","addEventListener","name","callback","options","push","hasOwnProperty","once","pop","addMultipleEventsListeners","obj","i","removeEventListener","l","invokeListenerCallback","result","_dispatchEvent","collectResults","arr","dispatchResultableEvent","dispatchEvent","cleanup","CryptoMessagePort","invokeCrypto","method","payload","Promise","resolve","invoke","cryptoMessagePort","SuperMessagePort","super","onMessage","event","task","data","source","currentTarget","processTaskMap","processResultTask","taskId","deferred","awaiting","log","taskType","reject","processAckTask","previousResolve","cached","processPingTask","pushTask","createTask","processPongTask","pingResolve","pingResolves","get","delete","processCloseTask","detachPort","processInvokeTask","id","innerTask","resultTaskPayload","resultTask","ackTask","isPromise","void","withAck","Error","ack","ping","pong","close","listenPorts","sendPorts","Map","pending","setOnPortDisconnect","onPortDisconnect","attachPort","port","attachListenPort","attachSendPort","warn","start","Array","isArray","transfer","releasePending","releasingPending","size","portTasks","clear","createInvokeTask","_void","tasks","invokeVoid","promise","finally","clearInterval","interval","invokeExceptSource","ports","target","prototype","concat","toJSON","fn","onFinally","reason"],"sourceRoot":""} \ No newline at end of file diff --git a/public/crypto.worker.2a79612de974833cfd09.chunk.js b/public/crypto.worker.2a79612de974833cfd09.chunk.js new file mode 100644 index 000000000..d41a27676 --- /dev/null +++ b/public/crypto.worker.2a79612de974833cfd09.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,r,o,i,f={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;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,F[c]=r=r<<24^r>>>8,_[c]=r=r<<24^r>>>8,O[n]=o=o<<24^o>>>8,I[n]=o=o<<24^o>>>8,z[n]=o=o<<24^o>>>8,M[n]=o=o<<24^o>>>8,a=f[a]||1}();var Z=function(){function e(e){var t=N(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:O[x[n>>>24]]^I[x[n>>16&255]]^z[x[n>>8&255]]^M[x[255&n]]}return e.prototype.encrypt=function(e){for(var t,n,r,o=N(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]^F[a>>8&255]^_[255&s]^this.encKey[h],n=E[c>>>24]^L[a>>16&255]^F[s>>8&255]^_[255&f]^this.encKey[h+1],r=E[a>>>24]^L[s>>16&255]^F[f>>8&255]^_[255&c]^this.encKey[h+2],s=E[s>>>24]^L[f>>16&255]^F[c>>8&255]^_[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=N(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]^M[255&s]^this.decKey[h],n=O[c>>>24]^I[a>>16&255]^z[s>>8&255]^M[255&f]^this.decKey[h+1],r=O[a>>>24]^I[s>>16&255]^z[f>>8&255]^M[255&c]^this.decKey[h+2],s=O[s>>>24]^I[f>>16&255]^z[c>>8&255]^M[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}(),B=function(){function e(e,t,n){void 0===n&&(n=16),this.key=N(e),this.iv=N(t),this.cipher=new Z(e),this.blockSize=n/4}return e.prototype.encrypt=function(e,t){for(var n=N(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 B(T(t),T(n))[r?"encrypt":"decrypt"](T(e)))}!function(){function e(e,t,n){if(void 0===n&&(n=16),this.offset=0,this.key=N(e),this.counter=N(t),this.cipher=new Z(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=N(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 j={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function q(e,t){return i().randBetween(e,t,(()=>function(e){const t=j[e];return crypto.getRandomValues(t),t[0]}(32)/4294967295))}function G(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=q(i().one,e.minus(1))}while(r.isZero()||r.eq(e.minus(t)));f=q(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",P(e)).then((e=>new Uint8Array(e)))},sha256:function(e){return D.digest("SHA-256",P(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,U(t.exponent),U(t.modulus))},factorize:function(e){let t=function(e){const t=a(e),n=[],r=[];let o=G(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:U,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),F=K.modPow(L,f),_=yield b.invokeCrypto("sha256",l(s(F),256));let O=yield b.invokeCrypto("sha256",v);O=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=U(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}}},c={};function a(e){var t=c[e];if(void 0!==t)return t.exports;var n=c[e]={id:e,loaded:!1,exports:{}};return f[e].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=f,a.x=()=>{var e=a.O(void 0,[699,211,437],(()=>a(6991)));return a.O(e)},e=[],a.O=(t,n,r,o)=>{if(!n){var i=1/0;for(u=0;u=o)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(f=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},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=>437===e?"437.8cd31f38250954e80fcd.bundle.js":{211:"npm.big-integer",699:"npm.pako"}[e]+"."+{211:"a7ea0f3283af2967a6ae",699:"f16d6f756c34f3914132"}[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),a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{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})(),t=a.u,n=a.e,r=new Map,o=new Map,a.u=function(e){return t(e)+(r.has(e)?"?"+r.get(e):"")},a.e=function(e){return n(e).catch((function(n){var i=o.has(e)?o.get(e):999999;if(i<1){var f=t(e);throw n.message="Loading chunk "+e+" failed after 999999 retries.\n("+f+")",n.request=f,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();r.set(e,n),o.set(e,i-1),t(a.e(e))}),3e3)}))}))},(()=>{var e={589:1};a.f.i=(t,n)=>{e[t]||importScripts(a.p+a.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,o,i]=t;for(var f in o)a.o(o,f)&&(a.m[f]=o[f]);for(i&&i(a);r.length;)e[r.pop()]=1;n(t)}})(),i=a.x,a.x=()=>Promise.all([699,211,437].map(a.e,a)).then(i),a.x()})(); +//# sourceMappingURL=crypto.worker.2a79612de974833cfd09.chunk.js.map \ No newline at end of file diff --git a/public/crypto.worker.2a79612de974833cfd09.chunk.js.map b/public/crypto.worker.2a79612de974833cfd09.chunk.js.map new file mode 100644 index 000000000..fe277c44e --- /dev/null +++ b/public/crypto.worker.2a79612de974833cfd09.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crypto.worker.2a79612de974833cfd09.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","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/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};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,437].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({includeUncontrolled: false, type: 'window'});\r\n};\r\n\r\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n // console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {CryptoMethods} from './crypto_methods';\r\nimport SuperMessagePort from '../mtproto/superMessagePort';\r\nimport {Awaited} from '../../types';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {IS_WORKER} from '../../helpers/context';\r\n\r\ntype CryptoEvent = {\r\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\r\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\r\n terminate: () => void\r\n};\r\n\r\nexport class CryptoMessagePort extends SuperMessagePort {\r\n private lastIndex: number;\r\n\r\n constructor() {\r\n super('CRYPTO');\r\n this.lastIndex = -1;\r\n }\r\n\r\n public invokeCryptoNew({method, args, transfer}: {\r\n method: T,\r\n args: Parameters,\r\n transfer?: Transferable[]\r\n }): Promise>> {\r\n const payload = {method, args};\r\n const listeners = this.listeners['invoke'];\r\n if(listeners?.length) { // already in worker\r\n // try {\r\n // @ts-ignore\r\n let result: any = listeners[0].callback(payload);\r\n if(!IS_WORKER && !(result instanceof Promise)) {\r\n result = Promise.resolve(result);\r\n }\r\n\r\n return result;\r\n // } catch(err) {\r\n // return Promise.reject(err);\r\n // }\r\n }\r\n\r\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\r\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\r\n 0;\r\n // @ts-ignore\r\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\r\n }\r\n\r\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\r\n return this.invokeCryptoNew({method, args});\r\n }\r\n}\r\n\r\nconst cryptoMessagePort = new CryptoMessagePort();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\r\nexport default cryptoMessagePort;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {BigInteger} from 'big-integer';\r\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\r\nimport addPadding from '../../../helpers/bytes/addPadding';\r\nimport subtle from '../subtle';\r\n\r\nconst COUNTER_LENGTH = 16;\r\n\r\nexport default class CTR {\r\n private cryptoKey: CryptoKey;\r\n // private encLeft: Uint8Array;\r\n private leftLength: number;\r\n private mode: 'encrypt' | 'decrypt';\r\n private counter: BigInteger;\r\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\r\n private releasing: boolean;\r\n\r\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\r\n this.mode = mode;\r\n this.cryptoKey = cryptoKey;\r\n this.queue = [];\r\n this.counter = bigIntFromBytes(counter);\r\n }\r\n\r\n public async update(data: Uint8Array) {\r\n return new Promise((resolve) => {\r\n this.queue.push({data, resolve});\r\n this.release();\r\n });\r\n }\r\n\r\n private async release() {\r\n if(this.releasing) {\r\n return;\r\n }\r\n\r\n this.releasing = true;\r\n while(this.queue.length) {\r\n const {data, resolve} = this.queue.shift();\r\n resolve(await this._update(data));\r\n }\r\n this.releasing = false;\r\n }\r\n\r\n private async perform(data: Uint8Array) {\r\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\r\n name: 'AES-CTR',\r\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\r\n length: 128\r\n },\r\n this.cryptoKey,\r\n data\r\n );\r\n\r\n return arrayBuffer;\r\n }\r\n\r\n private async _update(data: Uint8Array) {\r\n let toEncrypt = data;\r\n let head: Uint8Array/* , tail: Uint8Array */;\r\n if(this.leftLength) {\r\n // const leftLength = this.encLeft.byteLength;\r\n const leftLength = this.leftLength;\r\n const leftLength2 = COUNTER_LENGTH - leftLength;\r\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\r\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\r\n\r\n const performed = await this.perform(left);\r\n\r\n head = new Uint8Array(performed.slice(leftLength));\r\n\r\n toEncrypt = toEncrypt.slice(leftLength2);\r\n\r\n this.counter = this.counter.add(1);\r\n }\r\n\r\n const tail = new Uint8Array(await this.perform(toEncrypt));\r\n\r\n const result = head ? head.concat(tail) : tail;\r\n\r\n let length = toEncrypt.length;\r\n const leftAfter = length % COUNTER_LENGTH;\r\n length -= leftAfter;\r\n\r\n const a = length / COUNTER_LENGTH;\r\n this.counter = this.counter.add(a);\r\n\r\n this.leftLength = leftAfter || undefined;\r\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\r\n\r\n return result;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport '../polyfill'; // just to include\r\n\r\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\r\nimport gzipUncompress from '../../helpers/gzipUncompress';\r\nimport listenMessagePort from '../../helpers/listenMessagePort';\r\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\r\nimport computeDhKey from './computeDhKey';\r\nimport cryptoMessagePort from './cryptoMessagePort';\r\nimport {CryptoMethods} from './crypto_methods';\r\nimport generateDh from './generateDh';\r\nimport computeSRP from './srp';\r\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\r\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\r\nimport pbkdf2 from './utils/pbkdf2';\r\nimport rsaEncrypt from './utils/rsa';\r\nimport sha1 from './utils/sha1';\r\nimport sha256 from './utils/sha256';\r\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\r\nimport ctx from '../../environment/ctx';\r\n\r\nconsole.log('CryptoWorker start');\r\n\r\nconst cryptoMethods: CryptoMethods = {\r\n 'sha1': sha1,\r\n 'sha256': sha256,\r\n 'pbkdf2': pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': factorizeTdlibPQ,\r\n // 'factorize-new-new': pqPrimeLeemonNew,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP,\r\n 'generate-dh': generateDh,\r\n 'compute-dh-key': computeDhKey,\r\n 'get-emojis-fingerprint': getEmojisFingerprint,\r\n 'aes-ctr-prepare': aesCtrPrepare,\r\n 'aes-ctr-process': aesCtrProcess,\r\n 'aes-ctr-destroy': aesCtrDestroy\r\n};\r\n\r\ncryptoMessagePort.addMultipleEventsListeners({\r\n invoke: ({method, args}) => {\r\n // @ts-ignore\r\n const result: any = cryptoMethods[method](...args);\r\n return result;\r\n },\r\n\r\n terminate: () => {\r\n ctx.close();\r\n }\r\n});\r\n\r\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\r\n const channel = new MessageChannel();\r\n cryptoMessagePort.attachPort(channel.port1);\r\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\r\n});\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cryptoWorker from './cryptoMessagePort';\r\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\r\nimport addPadding from '../../helpers/bytes/addPadding';\r\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\r\nimport bytesXor from '../../helpers/bytes/bytesXor';\r\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\r\nimport bigInt from 'big-integer';\r\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\r\n\r\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\r\n\r\n return buffer;\r\n}\r\n\r\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n\r\n const p = bigIntFromBytes(algo.p);\r\n const g = bigInt(algo.g);\r\n\r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n\r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n\r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n\r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n\r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n\r\n // check_prime_and_good(algo.p, g);\r\n\r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = bigInt(bytesToHex(pw_hash), 16);\r\n\r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n\r\n return addPadding(arr, len, true, true, true);\r\n };\r\n\r\n const v = g.modPow(x, p);\r\n\r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n\r\n return out;\r\n };\r\n\r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bigIntToBytes(v);\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n\r\n const B = bigIntFromBytes(state.srp_B);\r\n\r\n const pForHash = padArray(bigIntToBytes(p), 256);\r\n const gForHash = padArray(bigIntToBytes(g), 256);\r\n const b_for_hash = padArray(bigIntToBytes(B), 256);\r\n\r\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\r\n const k = bigIntFromBytes(kHash);\r\n\r\n const k_v = k.multiply(v).mod(p);\r\n\r\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\r\n const diff = prime.subtract(modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(diff.isNegative() ||\r\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\r\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\r\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = bigIntFromBytes(flipper(state.secure_random));\r\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n const A = g.modPow(a, p);\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bigIntToBytes(A);\r\n\r\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\r\n // const u = bigInt(s.hex, 16);\r\n const u = bigIntFromBytes(s);\r\n if(!u.isZero() && !u.isNegative())\r\n return {a, a_for_hash, u};\r\n }\r\n }\r\n }\r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n let g_b: bigInt.BigInteger;\r\n if(!B.greater(k_v)) {\r\n g_b = B.add(p);\r\n } else g_b = B;\r\n g_b = g_b.subtract(k_v).mod(p);\r\n\r\n const ux = u.multiply(x);\r\n const a_ux = a.add(ux);\r\n const S = g_b.modPow(a_ux, p);\r\n\r\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\r\n\r\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\r\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(\r\n h1,\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\r\n\r\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\r\n _: 'inputCheckPasswordSRP',\r\n srp_id: state.srp_id,\r\n A: new Uint8Array(a_for_hash),\r\n M1\r\n };\r\n\r\n return out;\r\n}\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\r\nimport ctx from '../environment/ctx';\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort,\r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (listenPort: any, sendPort: any) => {\r\n messagePort.attachListenPort(listenPort);\r\n sendPort && messagePort.attachSendPort(sendPort);\r\n onConnect?.(listenPort);\r\n };\r\n\r\n messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\r\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\r\n attachPort(ctx, null);\r\n } else {\r\n attachPort(ctx, ctx);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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,437], () => (__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 === 437) return \"437.8cd31f38250954e80fcd.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"a7ea0f3283af2967a6ae\",\"699\":\"f16d6f756c34f3914132\"}[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;","// 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","oldGetScript","oldLoadScript","queryMap","countMap","next","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","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","undefined","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","window","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","has","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/crypto.worker.6e8ad0f36f5d4772b86c.chunk.js b/public/crypto.worker.6e8ad0f36f5d4772b86c.chunk.js deleted file mode 100644 index a62aed01f..000000000 --- a/public/crypto.worker.6e8ad0f36f5d4772b86c.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,r,o,i,f={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;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)},6318:(e,t,n)=>{n(690);var r=n(4736),o=n.n(r);o()(Number.MAX_SAFE_INTEGER);const i=o()(o()[2]).pow(64),f=i.divide(o()[2]);function a(e,t=256){return o().fromArray(e instanceof Uint8Array?[...e]:e,t)}function c(e){return new Uint8Array(e.toArray(256).value)}function s(e,t,n){const r=a(e),o=a(t),i=a(n);return c(r.modPow(o,i))}var u=n(745),h=n.n(u),l=n(6761),d=n(8630);function y(e){const t=e.length,n=8*t;let r=o()(e[0]).and(127).shiftLeft(n-8);for(let i=1;i0&&f>7),f[i[s]^s]=s;for(;!k[a];a^=e||1)n=(n=c^c<<1^c<<2^c<<3^c<<4)>>8^255&n^99,k[a]=n,S[n]=a,o=16843009*i[t=i[e=i[a]]]^65537*t^257*e^16843008*a,r=257*i[n]^16843008*n,U[a]=r=r<<24^r>>>8,P[a]=r=r<<24^r>>>8,Z[a]=r=r<<24^r>>>8,C[a]=r=r<<24^r>>>8,K[n]=o=o<<24^o>>>8,x[n]=o=o<<24^o>>>8,E[n]=o=o<<24^o>>>8,F[n]=o=o<<24^o>>>8,c=f[c]||1}();var O=function(){function e(e){var t=L(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=k[n>>>24]<<24^k[n>>16&255]<<16^k[n>>8&255]<<8^k[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:K[k[n>>>24]]^x[k[n>>16&255]]^E[k[n>>8&255]]^F[k[255&n]]}return e.prototype.encrypt=function(e){for(var t,n,r,o=L(e),i=new Uint32Array(4),f=o[0]^this.encKey[0],a=o[1]^this.encKey[1],c=o[2]^this.encKey[2],s=o[3]^this.encKey[3],u=this.encKey.length/4-2,h=4,l=0;l>>24]^P[a>>16&255]^Z[c>>8&255]^C[255&s]^this.encKey[h],n=U[a>>>24]^P[c>>16&255]^Z[s>>8&255]^C[255&f]^this.encKey[h+1],r=U[c>>>24]^P[s>>16&255]^Z[f>>8&255]^C[255&a]^this.encKey[h+2],s=U[s>>>24]^P[f>>16&255]^Z[a>>8&255]^C[255&c]^this.encKey[h+3],f=t,a=n,c=r,h+=4;for(l=0;l<4;l++)i[l]=k[f>>>24]<<24^k[a>>16&255]<<16^k[c>>8&255]<<8^k[255&s]^this.encKey[h++],t=f,f=a,a=c,c=s,s=t;return i},e.prototype.decrypt=function(e){for(var t,n,r,o=L(e),i=new Uint32Array(4),f=o[0]^this.decKey[0],a=o[3]^this.decKey[1],c=o[2]^this.decKey[2],s=o[1]^this.decKey[3],u=this.decKey.length/4-2,h=4,l=0;l>>24]^x[a>>16&255]^E[c>>8&255]^F[255&s]^this.decKey[h],n=K[a>>>24]^x[c>>16&255]^E[s>>8&255]^F[255&f]^this.decKey[h+1],r=K[c>>>24]^x[s>>16&255]^E[f>>8&255]^F[255&a]^this.decKey[h+2],s=K[s>>>24]^x[f>>16&255]^E[a>>8&255]^F[255&c]^this.decKey[h+3],f=t,a=n,c=r,h+=4;for(l=0;l<4;l++)i[3&-l]=S[f>>>24]<<24^S[a>>16&255]<<16^S[c>>8&255]<<8^S[255&s]^this.decKey[h++],t=f,f=a,a=c,c=s,s=t;return i},e}(),z=function(){function e(e,t,n){void 0===n&&(n=16),this.key=L(e),this.iv=L(t),this.cipher=new O(e),this.blockSize=n/4}return e.prototype.encrypt=function(e,t){for(var n=L(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),a=0;a>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}function M(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 z(I(t),I(n))[r?"encrypt":"decrypt"](I(e)))}!function(){function e(e,t,n){if(void 0===n&&(n=16),this.offset=0,this.key=L(e),this.counter=L(t),this.cipher=new O(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=L(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 N={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function R(e,t){return o().randBetween(e,t,(()=>function(e){const t=N[e];return crypto.getRandomValues(t),t[0]}(32)/4294967295))}function B(e){const t=o()[2];if(e.remainder(t).isZero())return t;const n=o()(1e3);let r,i,f,a,c,s,u;do{r=R(o().one,e.minus(1))}while(r.isZero()||r.eq(e.minus(t)));f=R(o().one,e.minus(1)),c=o().one,s=o().one;const h=o()("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{i=f;for(let e=0;o()(e).lesser(c);++e)f=l(f);let t=o().zero;do{a=f;const r=o().min(n,c.minus(t));for(let t=0;o()(t).lesser(r);++t)f=l(f),s=s.multiply(i.greater(f)?i.minus(f):f.minus(i)).mod(e);u=o().gcd(s,e),t=t.add(n)}while(t.lesser(c)&&u.eq(o().one));c=c.shiftLeft(o().one)}while(u.eq(o().one));if(u.eq(e))do{a=l(a),u=o().gcd(i.minus(a).abs(),e)}while(u.eq(o().one));return u}const T="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var q=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,a)}c((r=r.apply(e,t||[])).next())}))};class j{constructor(e,t,n){this.mode=e,this.cryptoKey=t,this.queue=[],this.counter=a(n)}update(e){return q(this,void 0,void 0,(function*(){return new Promise((t=>{this.queue.push({data:e,resolve:t}),this.release()}))}))}release(){return q(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 q(this,void 0,void 0,(function*(){return yield T[this.mode]({name:"AES-CTR",counter:w(c(this.counter),16,!0,!0,!0),length:128},this.cryptoKey,e)}))}_update(e){return q(this,void 0,void 0,(function*(){let t,n,r=e;if(this.leftLength){const e=this.leftLength,n=16-e,o=new Uint8Array(e).concat(r.slice(0,n)),i=yield this.perform(o);t=new Uint8Array(i.slice(e)),r=r.slice(n),this.counter=this.counter.add(1)}n=new Uint8Array(yield this.perform(r));const o=t?t.concat(n):n;let i=r.length;const f=i%16;i-=f;const a=i/16;return this.counter=this.counter.add(a),this.leftLength=f||void 0,o}))}}var D=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,a)}c((r=r.apply(e,t||[])).next())}))};const W=new Map;let $=-1;console.log("CryptoWorker start");const J={sha1:function(e){return T.digest("SHA-1",m(e)).then((e=>new Uint8Array(e)))},sha256:function(e){return T.digest("SHA-256",m(e)).then((e=>new Uint8Array(e)))},pbkdf2:function(e,t,n){return r=this,o=void 0,f=function*(){const r=yield T.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return T.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{c(f.next(e))}catch(e){t(e)}}function a(e){try{c(f.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,a)}c((f=f.apply(r,o||[])).next())}));var r,o,i,f},"aes-encrypt":function(e,t,n){return M(w(e),t,n,!0)},"aes-decrypt":function(e,t,n){return M(e,t,n,!1)},"rsa-encrypt":function(e,t){return s(e,b(t.exponent),b(t.modulus))},factorize:function(e){let t=function(e){const t=a(e),n=[],r=[];let i=B(t);n.push(t.divide(i)),n.push(i);do{const e=n.pop();if(!e.eq(o().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)),o().one)]);const n=t[0],r=t[t.length-1];return(n.lesser(r)?[n,r]:[r,n]).map((e=>c(e)))},"mod-pow":s,gzipUncompress:function(e,t){return h().inflate(e,t?{to:"string"}:void 0)},computeSRP:function(e,t,n){return A(this,void 0,void 0,(function*(){const r=n?t.new_algo:t.current_algo,i=a(r.p),f=o()(r.g),s=yield function(e,t,n){return A(this,void 0,void 0,(function*(){let r=yield d.Z.invokeCrypto("sha256",(0,g.Z)(t,(new TextEncoder).encode(e),t));r=(0,g.Z)(n,r,n),r=yield d.Z.invokeCrypto("sha256",r);let o=yield d.Z.invokeCrypto("pbkdf2",new Uint8Array(r),t,1e5);return o=(0,g.Z)(n,o,n),r=yield d.Z.invokeCrypto("sha256",o),r}))}(e,r.salt1,r.salt2),u=o()(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:P,a_for_hash:Z,u:C}=yield(()=>A(this,void 0,void 0,(function*(){for(;;){const e=a(y(t.secure_random)),n=f.modPow(e,i);if(U(n,i)){const t=c(n),r=a(yield d.Z.invokeCrypto("sha256",(0,g.Z)(t,k)));if(!r.isZero()&&!r.isNegative())return{a:e,a_for_hash:t,u:r}}}})))();let K;K=p.greater(S)?p:p.add(i),K=K.subtract(S).mod(i);const x=C.multiply(u),E=P.add(x),F=K.modPow(E,i),L=yield d.Z.invokeCrypto("sha256",h(c(F),256));let _=yield d.Z.invokeCrypto("sha256",v);_=function(e,t){const n=e.length,r=new Uint8Array(n);for(let o=0;o{for(;;){const t=v(new Uint8Array(e.length)),n=a(t);if(!n.greater(o().one))continue;const r=a(e);if(n.lesser(r.subtract(o().one)))return t}})(t),i=b(n.toString(16)),f=w(yield d.Z.invokeCrypto("mod-pow",i,r,t),256,!0,!0,!0);return{a:r,g_a:f,g_a_hash:yield d.Z.invokeCrypto("sha256",f),p:t}},new((r=void 0)||(r=Promise))((function(e,o){function f(e){try{c(i.next(e))}catch(e){o(e)}}function a(e){try{c(i.throw(e))}catch(e){o(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(f,a)}c((i=i.apply(t,n||[])).next())}));var t,n,r,i},"compute-dh-key":function(e,t,n){return r=this,o=void 0,s=function*(){const r=yield d.Z.invokeCrypto("mod-pow",e,t,n);var o;return{key:r,key_fingerprint:(o=a((yield d.Z.invokeCrypto("sha1",r)).slice(-8).reverse()),o.greater(f)?o.minus(i):o).toString(10)}},new((c=void 0)||(c=Promise))((function(e,t){function n(e){try{f(s.next(e))}catch(e){t(e)}}function i(e){try{f(s.throw(e))}catch(e){t(e)}}function f(t){var r;t.done?e(t.value):(r=t.value,r instanceof c?r:new c((function(e){e(r)}))).then(n,i)}f((s=s.apply(r,o||[])).next())}));var r,o,c,s},"get-emojis-fingerprint":function(e,t){return n=this,r=void 0,i=function*(){const n=e.concat(t),r=yield d.Z.invokeCrypto("sha256",n),o=[],i=p.length;for(let e=0;e!=r.length;e+=8){const t=y(r.slice(e,e+8)).mod(i).toJSNumber(),n=p[t];o.push(n)}return o},new((o=void 0)||(o=Promise))((function(e,t){function f(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 n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(f,a)}c((i=i.apply(n,r||[])).next())}));var n,r,o,i},"aes-ctr-prepare":function({encKey:e,encIv:t,decKey:n,decIv:r}){return D(this,void 0,void 0,(function*(){const o=++$,i=[["encrypt",e],["decrypt",n]].map((([e,t])=>T.importKey("raw",t,{name:"AES-CTR"},!1,[e]))),[f,a]=yield Promise.all(i),c={enc:new j("encrypt",f,t.slice()),dec:new j("decrypt",a,r.slice())};return W.set(o,c),o}))},"aes-ctr-process":function({id:e,data:t,operation:n}){return D(this,void 0,void 0,(function*(){const r=W.get(e);return yield("encrypt"===n?r.enc:r.dec).update(t)}))},"aes-ctr-destroy":function(e){W.delete(e)}};d.Z.addEventListener("invoke",(({method:e,args:t})=>J[e](...t))),"undefined"!=typeof MessageChannel&&function(e,t,n){const r=n=>{e.attachPort(n),t&&t(n)};"undefined"!=typeof SharedWorkerGlobalScope?l.Z.addEventListener("connect",(e=>r(e.source))):r(l.Z)}(d.Z,(e=>{const t=new MessageChannel;d.Z.attachPort(t.port1),d.Z.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),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"}(r||(r={}));const c=[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="";let p=i;i=i?`%s ${i}%s`:"%s";const v=function(...n){return t&r.Log&&console.log(i,(0,a.Z)(),e,...n)};return l.forEach((([n,r])=>{v[n]=function(...o){return t&r&&console[n](i,(0,a.Z)(),e,...o)}})),v.setPrefix=function(t){y=t,e="["+t+"]"},v.setPrefix(e),v.setLevel=function(e){t=c.slice(0,e+1).reduce(((e,t)=>e|t),0)},v.bindPrefix=function(e){return d(`${y}] [${e}`,t,n,p)},v}}},a={};function c(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={id:e,loaded:!1,exports:{}};return f[e].call(n.exports,n,n.exports,c),n.loaded=!0,n.exports}c.m=f,c.x=()=>{var e=c.O(void 0,[699,211,960],(()=>c(6318)));return c.O(e)},e=[],c.O=(t,n,r,o)=>{if(!n){var i=1/0;for(u=0;u=o)&&Object.keys(c.O).every((e=>c.O[e](n[a])))?n.splice(a--,1):(f=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o]},c.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return c.d(t,{a:t}),t},c.d=(e,t)=>{for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((t,n)=>(c.f[n](e,t),t)),[])),c.u=e=>960===e?"960.7ae964ab6031f51a0275.bundle.js":{211:"npm.big-integer",699:"npm.pako"}[e]+"."+{211:"a7ea0f3283af2967a6ae",699:"f16d6f756c34f3914132"}[e]+".chunk.js",c.miniCssF=e=>{},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;c.g.importScripts&&(e=c.g.location+"");var t=c.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(/\/[^\/]+$/,"/"),c.p=e})(),t=c.u,n=c.e,r=new Map,o=new Map,c.u=function(e){return t(e)+(r.has(e)?"?"+r.get(e):"")},c.e=function(e){return n(e).catch((function(n){var i=o.has(e)?o.get(e):999999;if(i<1){var f=t(e);throw n.message="Loading chunk "+e+" failed after 999999 retries.\n("+f+")",n.request=f,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();r.set(e,n),o.set(e,i-1),t(c.e(e))}),3e3)}))}))},(()=>{var e={589:1};c.f.i=(t,n)=>{e[t]||importScripts(c.p+c.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,o,i]=t;for(var f in o)c.o(o,f)&&(c.m[f]=o[f]);for(i&&i(c);r.length;)e[r.pop()]=1;n(t)}})(),i=c.x,c.x=()=>Promise.all([699,211,960].map(c.e,c)).then(i),c.x()})(); -//# sourceMappingURL=crypto.worker.6e8ad0f36f5d4772b86c.chunk.js.map \ No newline at end of file diff --git a/public/crypto.worker.6e8ad0f36f5d4772b86c.chunk.js.map b/public/crypto.worker.6e8ad0f36f5d4772b86c.chunk.js.map deleted file mode 100644 index 785161a4d..000000000 --- a/public/crypto.worker.6e8ad0f36f5d4772b86c.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"crypto.worker.6e8ad0f36f5d4772b86c.chunk.js","mappings":"uBAAIA,ECEIC,EACAC,EACAC,EACAC,ECLJC,E,0ECQG,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,EAIbL,UAAUS,eAAiB,GAAKT,UAAUC,UAAUE,OAAO,mH,6CCrBtG,IAAOS,OAAOC,kBAAjC,MACM,EAAc,IAAO,QAAWC,IAAI,IACpCC,EAAa,EAAYC,OAAO,QCDtC,SAASC,EAAgBC,EAA8BC,EAAO,KACnE,OAAO,cAAiBD,aAAiBE,WAAa,IAAIF,GAASA,EAAOC,GAGrE,SAASE,EAAcC,GAC5B,OAAO,IAAIF,WAAWE,EAAOC,QAAQ,KAAKC,OCN7B,SAASC,EAAYP,EAA8BQ,EAA4BC,GAC5F,MAAMC,EAAcX,EAAgBC,GAC9BW,EAAYZ,EAAgBS,GAC5BI,EAAYb,EAAgBU,GAElC,OAAON,EADWO,EAAYG,OAAOF,EAAWC,I,0CCGlD,SAASE,EAAsBd,GAC7B,MAAMe,EAASf,EAAMe,OACfC,EAAgB,EAATD,EACb,IAAIT,EAAQ,IAAON,EAAM,IAAIiB,IAAI,KAAMC,UAAUF,EAAO,GACxD,IAAI,IAAIG,EAAI,EAAGA,EAAIJ,IAAUI,EAAG,CAC9B,MAAMC,EAAQJ,EAAiB,GAATG,EAAI,GACpBE,EAAI,IAAOrB,EAAMmB,IACvBb,EAAQA,EAAMgB,GAAGF,EAAQC,EAAEH,UAAUE,GAASC,GAGhD,OAAOf,EAIT,MAAMiB,EAAS,CACb,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,OAAQ,OAAQ,QAAS,QAAS,QAAS,QACpD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,OAAQ,OAAQ,OAAQ,OAC5D,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,OAAQ,QAAS,QAAS,QAAS,QACrD,QAAS,OAAQ,OAAQ,OAAQ,QAAS,QAAS,QACnD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,OAAQ,QAAS,QACrD,QAAS,QAAS,OAAQ,QAAS,QAAS,OAAQ,OACpD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OACtD,OAAQ,QAAS,QAAS,QAAS,QAAS,QAAS,QACrD,QAAS,QAAS,QAAS,OAAQ,QAAS,QAAS,QACrD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QACtD,Q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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/environment/userAgent.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/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/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};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,960].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { BigInteger } from \"big-integer\";\r\nimport { bigIntFromBytes, bigIntToBytes } from \"../../../helpers/bigInt/bigIntConversion\";\r\nimport addPadding from \"../../../helpers/bytes/addPadding\";\r\nimport subtle from \"../subtle\";\r\n\r\nconst COUNTER_LENGTH = 16;\r\n\r\nexport default class CTR {\r\n private cryptoKey: CryptoKey;\r\n // private encLeft: Uint8Array;\r\n private leftLength: number;\r\n private mode: 'encrypt' | 'decrypt';\r\n private counter: BigInteger;\r\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\r\n private releasing: boolean;\r\n \r\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\r\n this.mode = mode;\r\n this.cryptoKey = cryptoKey;\r\n this.queue = [];\r\n this.counter = bigIntFromBytes(counter);\r\n }\r\n\r\n public async update(data: Uint8Array) {\r\n return new Promise((resolve) => {\r\n this.queue.push({data, resolve});\r\n this.release();\r\n });\r\n }\r\n\r\n private async release() {\r\n if(this.releasing) {\r\n return;\r\n }\r\n\r\n this.releasing = true;\r\n while(this.queue.length) {\r\n const {data, resolve} = this.queue.shift();\r\n resolve(await this._update(data));\r\n }\r\n this.releasing = false;\r\n }\r\n\r\n private async perform(data: Uint8Array) {\r\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\r\n name: 'AES-CTR',\r\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\r\n length: 128\r\n },\r\n this.cryptoKey,\r\n data\r\n );\r\n\r\n return arrayBuffer;\r\n }\r\n\r\n private async _update(data: Uint8Array) {\r\n let toEncrypt = data;\r\n let head: Uint8Array, tail: Uint8Array;\r\n if(this.leftLength) {\r\n // const leftLength = this.encLeft.byteLength;\r\n const leftLength = this.leftLength;\r\n const leftLength2 = COUNTER_LENGTH - leftLength;\r\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\r\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\r\n\r\n const performed = await this.perform(left);\r\n\r\n head = new Uint8Array(performed.slice(leftLength));\r\n\r\n toEncrypt = toEncrypt.slice(leftLength2);\r\n\r\n this.counter = this.counter.add(1);\r\n }\r\n\r\n tail = new Uint8Array(await this.perform(toEncrypt));\r\n\r\n const result = head ? head.concat(tail) : tail;\r\n\r\n let length = toEncrypt.length;\r\n const leftAfter = length % COUNTER_LENGTH;\r\n length -= leftAfter;\r\n\r\n const a = length / COUNTER_LENGTH;\r\n this.counter = this.counter.add(a);\r\n\r\n this.leftLength = leftAfter || undefined;\r\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\r\n\r\n return result;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport '../polyfill'; // just to include\r\n\r\nimport bytesModPow from \"../../helpers/bytes/bytesModPow\";\r\nimport gzipUncompress from \"../../helpers/gzipUncompress\";\r\nimport listenMessagePort from \"../../helpers/listenMessagePort\";\r\nimport getEmojisFingerprint from \"../calls/helpers/getEmojisFingerprint\";\r\nimport computeDhKey from \"./computeDhKey\";\r\nimport cryptoMessagePort from \"./cryptoMessagePort\";\r\nimport { CryptoMethods } from \"./crypto_methods\";\r\nimport generateDh from \"./generateDh\";\r\nimport computeSRP from \"./srp\";\r\nimport { aesEncryptSync, aesDecryptSync } from \"./utils/aesIGE\";\r\nimport factorizeBrentPollardPQ from \"./utils/factorize/BrentPollard\";\r\nimport pbkdf2 from \"./utils/pbkdf2\";\r\nimport rsaEncrypt from \"./utils/rsa\";\r\nimport sha1 from \"./utils/sha1\";\r\nimport sha256 from \"./utils/sha256\";\r\nimport { aesCtrDestroy, aesCtrPrepare, aesCtrProcess } from './aesCtrUtils';\r\n\r\nconsole.log('CryptoWorker start');\r\n\r\nconst cryptoMethods: CryptoMethods = {\r\n 'sha1': sha1,\r\n 'sha256': sha256,\r\n 'pbkdf2': pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': factorizeBrentPollardPQ,\r\n // 'factorize-tdlib': factorizeTdlibPQ, \r\n // 'factorize-new-new': pqPrimeLeemonNew, \r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP,\r\n 'generate-dh': generateDh,\r\n 'compute-dh-key': computeDhKey,\r\n 'get-emojis-fingerprint': getEmojisFingerprint,\r\n 'aes-ctr-prepare': aesCtrPrepare,\r\n 'aes-ctr-process': aesCtrProcess,\r\n 'aes-ctr-destroy': aesCtrDestroy\r\n};\r\n\r\ncryptoMessagePort.addEventListener('invoke', ({method, args}) => {\r\n // @ts-ignore\r\n const result: any = cryptoMethods[method](...args);\r\n return result;\r\n});\r\n\r\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\r\n const channel = new MessageChannel();\r\n cryptoMessagePort.attachPort(channel.port1);\r\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\r\n});\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cryptoWorker from \"./cryptoMessagePort\";\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport addPadding from \"../../helpers/bytes/addPadding\";\r\nimport bufferConcats from \"../../helpers/bytes/bufferConcats\";\r\nimport bytesXor from \"../../helpers/bytes/bytesXor\";\r\nimport convertToUint8Array from \"../../helpers/bytes/convertToUint8Array\";\r\nimport bigInt from 'big-integer';\r\nimport { bigIntFromBytes, bigIntToBytes } from \"../../helpers/bigInt/bigIntConversion\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\r\n\r\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\r\n\r\n return buffer;\r\n}\r\n\r\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n\r\n const p = bigIntFromBytes(algo.p);\r\n const g = bigInt(algo.g);\r\n\r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = bigInt(bytesToHex(pw_hash), 16);\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = g.modPow(x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bigIntToBytes(v);\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = bigIntFromBytes(state.srp_B);\r\n \r\n const pForHash = padArray(bigIntToBytes(p), 256);\r\n const gForHash = padArray(bigIntToBytes(g), 256);\r\n const b_for_hash = padArray(bigIntToBytes(B), 256);\r\n\r\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\r\n const k = bigIntFromBytes(kHash);\r\n\r\n const k_v = k.multiply(v).mod(p);\r\n\r\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\r\n const diff = prime.subtract(modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(diff.isNegative() ||\r\n diff.bitLength().toJSNumber() < min_diff_bits_count || \r\n modexp.bitLength().toJSNumber() < min_diff_bits_count || \r\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = bigIntFromBytes(flipper(state.secure_random));\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n const A = g.modPow(a, p);\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bigIntToBytes(A);\r\n\r\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\r\n // const u = bigInt(s.hex, 16);\r\n const u = bigIntFromBytes(s);\r\n if(!u.isZero() && !u.isNegative())\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n let g_b: bigInt.BigInteger;\r\n if(!B.greater(k_v)) {\r\n g_b = B.add(p);\r\n } else g_b = B;\r\n g_b = g_b.subtract(k_v).mod(p);\r\n\r\n const ux = u.multiply(x);\r\n const a_ux = a.add(ux);\r\n const S = g_b.modPow(a_ux, p);\r\n\r\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\r\n\r\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\r\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(\r\n h1, \r\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\r\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\r\n\r\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n };\r\n\r\n return out;\r\n}\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from \"../environment/ctx\";\r\nimport SuperMessagePort from \"../lib/mtproto/superMessagePort\";\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort, \r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (s: any) => {\r\n messagePort.attachPort(s);\r\n onConnect && onConnect(s);\r\n };\r\n\r\n onDisconnect && messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source));\r\n } else {\r\n attachPort(ctx);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","// 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,960], () => (__webpack_require__(6318)))\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 === 960) return \"960.7ae964ab6031f51a0275.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"a7ea0f3283af2967a6ae\",\"699\":\"f16d6f756c34f3914132\"}[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;","// 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","oldGetScript","oldLoadScript","queryMap","countMap","next","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","Uint8Array","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","readBigIntFromBytesBE","length","bits","and","shiftLeft","i","_bits","b","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","byteLength","needPadding","padding","ArrayBuffer","bufferConcats","buffer","concat","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","this","encKey","decKey","set","tmp","rcon","j","prototype","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","window","subtle","self","CTR","constructor","mode","cryptoKey","queue","update","data","Promise","resolve","push","release","releasing","shift","_update","perform","name","head","tail","toEncrypt","leftLength","leftLength2","slice","performed","result","leftAfter","undefined","aesCTRs","Map","lastCTRId","console","log","cryptoMethods","then","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","reduce","acc","v","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","all","enc","dec","operation","ctrs","get","delete","cryptoMessagePort","method","args","messagePort","onConnect","onDisconnect","attachPort","ctx","e","source","listenMessagePort","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","type","ignoreDebugReset","style","originalPrefix","originalStyle","forEach","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","fn","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","has","catch","error","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.html b/public/index.html index f4b23cd7b..a23fe21b7 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.25d27682aa85e3cf89ca.bundle.js b/public/main.25d27682aa85e3cf89ca.bundle.js deleted file mode 100644 index 8274f6545..000000000 --- a/public/main.25d27682aa85e3cf89ca.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,s,i,o,a,r,c,l={236:(e,t,n)=>{n.d(t,{h:()=>c});var s=n(4762),i=n(144),o=n(4159);const a=o.Z.version,r=o.Z.build,c={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filters:{},maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],topPeersCache:{},recentSearch:[],version:a,build:r,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:[{name:"day",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:0,id:"1"}:{blur:!1,slug:"pattern",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:50,id:"1"}},{name:"night",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)",intensity:0,id:"-1"}:{blur:!1,slug:"pattern",color:"#fec496,#dd6cb9,#962fbf,#4f5bd5",highlightningColor:"hsla(299.142857, 44.166666%, 37.470588%, .4)",intensity:-50,id:"-1"}}],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:()=>a});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),a=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:()=>s});const s="undefined"!=typeof SharedWorker},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:()=>a,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>r,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),a=-1!==navigator.userAgent.toLowerCase().indexOf("android"),r=/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=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},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 a,r,c=(i+o)/2;if(i===o)a=r=0;else{let s=i-o;switch(r=c>.5?s/(2-i-o):s/(i+o),i){case e:a=(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},r=n<.5?n*(1+t):n+t-n*t,c=2*n-r;i=s(c,r,e+1/3),o=s(c,r,e),a=s(c,r,e-1/3)}return[Math.round(255*i),Math.round(255*o),Math.round(255*a),Math.round(255*s)]}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:()=>r,dI:()=>s,oo:()=>a,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(){return!(!document.activeElement||!document.activeElement.blur||(document.activeElement.blur(),0))}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e=e||window.event){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:()=>r,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),a=n(5494);const r=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(r){let e="clientY",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],a=t-o,r=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,d=r?Math.round(r+i.clientHeight+a):r+a;(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,a.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,a.Z)(document.activeElement)}),{passive:!0})}function c(e){r&&e.classList.add("is-sticky-input-bugged")}},4541:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5418);const i=["b","б"],o={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function r(e={text:i,icons:void 0,monospace:i}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=i);const r=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,i,a;const c=[e,"1rem",r].join(" ");return null!==(s=(i=null!==(n=o[c])&&void 0!==n?n:o[c]={})[a=t||""])&&void 0!==s?s:i[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t),(0,s.Z)(1e3)])}},2586:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class a 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 r=new a},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,a,r=!1;function c(e){o?r?e():o.push(e):(o=[e],requestAnimationFrame((()=>{r=!0;for(let e=0;ei((()=>e())))),a.then((()=>{a=void 0})),a)}function d(){return new Promise((e=>{i((()=>{i(e)}))}))}},6714:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5432),i=n(3512),o=n(2064);const a=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(){let e;const t=a.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&e&&(a.themeColor=(0,o.K5)(e))}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))}},r=a},6873:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),a=n(8090),r=n(4541),c=n(9976),l=n(4762),d=n(5418);!function(){const e={construct:(e,t)=>new e(t[0]+location.search)};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].forEach((t=>{t&&(window[t.name]=new Proxy(t,e))}))}();var u=n(3512),h=n(5432),g=n(2325),m=(n(4110),n(690),n(3789)),f=n(2554),p=n(6714),v=n(3815),b=n(490);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,S=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)}),u.Z.managers=(0,f.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,y=!1;const S=()=>{const n=.01*(y&&!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",S),S(),a.T){const t=()=>{y=1===n&&a.T&&!v.Z.isOverlayActive,S(),e!==window&&(y?(window.removeEventListener("resize",S),e.addEventListener("resize",S)):(e.removeEventListener("resize",S),window.addEventListener("resize",S)))};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})),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");let w=performance.now();const P=g.ZP.getCacheLangPack(),[k,E]=yield Promise.all([m.Z.sendState().then((([e])=>e)),P]);function A(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(k.state.settings.timeFormat),p.Z.setThemeListener(),E.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(E.lang_code),console.log("got state, time:",performance.now()-w);const _=k.state.authState;if("authStateSignedIn"!==_._){console.log("Will mount auth page:",_._,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,5228)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(_._){case"authStateSignIn":s=(yield Promise.all([n.e(458),n.e(725),n.e(591),n.e(665),n.e(709),n.e(810)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(725),n.e(591),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(458),n.e(725),n.e(591),n.e(665),n.e(709),n.e(106)]).then(n.bind(n,6392))).default.mount(_.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(458),n.e(725),n.e(591),n.e(437)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(458),n.e(725),n.e(591),n.e(765),n.e(25)]).then(n.bind(n,8339))).default.mount(_.authCode)}t&&(s&&(yield s),A(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),A(document.getElementById("main-columns"),(0,r.Z)()),(yield Promise.all([n.e(725),n.e(591),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((y=void 0)||(y=Promise))((function(n,s){function i(e){try{a(S.next(e))}catch(e){s(e)}}function o(e){try{a(S.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof y?t:new y((function(e){e(t)}))).then(i,o)}a((S=S.apply(e,t||[])).next())}));var e,t,y,S}))},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:()=>i});var s=n(3789);function i(){let e;function t(e,t){return new Proxy(e,{get:(e,n,i)=>{var o;return null!==(o=e[n])&&void 0!==o?o:e[n]=function(e,t){return new Proxy({},{get:(n,i,o)=>(...n)=>s.Z.invoke("manager",{name:e,method:i,args:n},t)})}(n,t)}})}return e=t({},!1),e.acknowledged=t({},!0),e}},1962:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1267),i=n(5953),o=n(5003);class a{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,o.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({type:"IDB_CREATE_TIMEOUT"})}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let a=!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),!a&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(a=!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 r{constructor(e,t){this.storeName=t,this.log=(0,o.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(((a,r)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(h),r(c.error)},d=()=>{clearTimeout(h),n&&this.log(n+": end",performance.now()-i);const e=f.map((e=>e.result));a(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),f=m?g:[].concat(g);if(u)return;const p=f.length;let v=p;const b=()=>{c.error||--v||d()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>y,A1:()=>S,Hz:()=>g,XZ:()=>b,ZP:()=>p,ag:()=>v,nK:()=>m,v_:()=>w});var s=n(410),i=n(7922),o=n(4159),a=n(3512),r=n(4762),c=n(6848),l=n(5953),d=n(9005),u=n(6637),h=n(3591);const g={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"},m=r.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,r;function g(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function m(){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 g(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 v(t.default,i),v(n.default,i),b({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function p(t,s){e.requestedServerLanguage=!0;const i=a.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:s?"web":o.Z.langPack}),!s&&i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"android"}),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 v(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 b(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(y(e),e)))}function y(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])}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&&(a.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),m()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function S(e,t,n={i:0}){let s=[],i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,a,r,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(a,t,n)),s.push(e)}else if(r)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 a;if(o&&(0,u.Z)(o)){a=document.createElement("a");const e=(0,h.Z)(o);a.href=e.url,e.onclick&&a.setAttribute("onclick",e.onclick),a.target="_blank"}else a=t[n.i++],a.textContent="";a.append(...S(i,t,n)),s.push(a)}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 w(n,s=!1,i){const o=e.strings.get(n);let a;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),a=o[t.select(e)+"_value"]||o.other_value}else a="langPackString"===o._?o.value:n;else a=n;const r=S(a,i);return s?r.map((e=>e instanceof Node?e.textContent:e)).join(""):r}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.getCacheLangPack=function(){return r||(r=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||g(t.lang_code),y(t),t):f())).finally((()=>{r=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,m(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof _&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=p,e.getStrings=function(e,t){return a.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=v,e.getLangPack=function(e,t){return g(e),p(e,t).then((([e,t,n,s,i,o])=>{let a=[];return[n,s].forEach((e=>{v(e.default,a)})),a=a.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=a,e.countries=i,b(e)}))},e.saveLangPack=b,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=y,e.superFormatter=S,e.format=w,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 k 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(...w(this.key,!1,this.args));else{const e=this.element[this.property],t=w(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=k;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 _ extends P{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){let 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=_,e.i18n=function(e,t){return new k({key:e,args:t}).element},e.i18n_=function(e){return new k(e).element},e._i18n=function(e,t,n,s){return new k({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const p=f,v=f.i18n,b=f.i18n_,y=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):v(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{IA:()=>o,NM:()=>s,gZ:()=>c,hj:()=>i,rU:()=>r,yF:()=>a});const s=0,i=1271266957,o=777,a=777e3,r=2147483647,c=""},3789:(e,t,n)=>{n.d(t,{Z:()=>ne});var s=n(3512),i=n(7730),o=n(410),a=n(7487),r=n(6702),c=n(1722),l=n(5228),d=n(5418),u=n(5880),h=n(993),g=n(7328),m=n(6663),f=n(9976),p=n(3731),v=n(6818),b=n(1174),y=n(2341),S=n(9030),w=n(2365),P=n(2820),k=n(5432),E=n(2131),A=n(554),_=n(4762);const Z=!!document.createElement("video").canPlayType("video/webm")&&!_.IS_SAFARI&&!_.IS_APPLE_MOBILE;var I=n(5269),C=n(4089),L=n(5783),O=n(2045),T=n(8189);const M=Object.assign({CAN_USE_TRANSFERABLES:g.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:h.Z,IS_CANVAS_FILTER_SUPPORTED:m.Z,IS_EMOJI_SUPPORTED:f.Z,IS_GEOLOCATION_SUPPORTED:p.Z,IS_GROUP_CALL_SUPPORTED:v.Z,IS_MOV_SUPPORTED:S.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:P.Z,IS_TOUCH_SUPPORTED:k.Z,IS_VIBRATE_SUPPORTED:E.Z,IS_OPUS_SUPPORTED:L.Z,IS_SHARED_WORKER_SUPPORTED:O.Z,IS_WEBM_SUPPORTED:Z,IS_WEBP_SUPPORTED:I.Z,IS_WEBRTC_SUPPORTED:C.Z,IMAGE_MIME_TYPES_SUPPORTED:b.Z,MEDIA_MIME_TYPES_SUPPORTED:y.Z,VIDEO_MIME_TYPES_SUPPORTED:A.Z},_);var D=n(4159),R=n(236),W=n(6009),x=n(8479),N=n(946),U=n(7922),F=n(5466),j=n(5003);const B=R.h.version,V=R.h.build,G=Object.keys(R.h),z=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filters"];function q(){return e=this,t=void 0,i=function*(){const e=(0,j.kg)("STATE-LOADER"),t=performance.now(),n=(0,F.$)(e),i=G.map((e=>n(U.Z.get(e),"state "+e))).concat(n(a.Z.get("user_auth"),"auth"),n(a.Z.get("state_id"),"auth"),n(a.Z.get("k_build"),"auth")).concat(n(U.Z.get("user_auth"),"old auth")),r=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=G.length;eU.Z.get(e))));e.push("user_auth"),t.push("number"==typeof u||"string"==typeof u?{dcID:t[0]||D.Z.baseDcId,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u);let n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield a.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 f=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,x.Z)(d[n]))})),d=(0,x.Z)(R.h),e.forEach(((e,t)=>{d[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)f.add(e);p=d,c.length=0,d=p,c.push(...Object.keys(d))}yield a.Z.set({state_id:d.stateId})}var p;const v=Date.now();if(d.stateCreatedTime+864e5{l(e,(0,x.Z)(R.h[e]))}))),!d.settings.hasOwnProperty("theme")&&d.settings.hasOwnProperty("nightTheme")&&(d.settings.theme=d.settings.nightTheme?"night":"day",l("settings",d.settings)),!d.settings.hasOwnProperty("themes")&&d.settings.background){d.settings.themes=(0,x.Z)(R.h.settings.themes);const e=d.settings.themes.find((e=>e.name===d.settings.theme));e&&(e.background=d.settings.background,l("settings",d.settings))}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)}let y,S;if((0,N.Z)(R.h,d,(e=>{l(e,d[e])})),d.version!==B||d.build!==V){if((-1===(0,W.Z)(d.version,"0.8.7")||d.build<179)&&(d.allDialogsLoaded=(0,x.Z)(R.h.allDialogsLoaded),d.filters=(0,x.Z)(R.h.filters),f.add("dialogs")),-1===(0,W.Z)(d.version,"1.3.0")){let e=!1;d.settings.themes.forEach(((t,n,s)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const i=R.h.settings.themes.find((e=>e.name===t.name));i&&(s[n]=(0,x.Z)(i),e=!0)}})),e&&l("settings",d.settings)}0!==(0,W.Z)(d.version,B)&&(y=B,S=d.version),l("version",B),l("build",V)}return g!==V&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const a=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete a[i]:a[i]=o},this.isSWRegistered=!0,this.taskListenersSW={},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})=>$.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return a.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),a.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,d.Z)(3e3)]),r.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),K.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(K.Z.isIdle),this.log("Passing environment:",M),this.invoke("environment",M)}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const e=navigator.serviceWorker;navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{this.log("SW registered",e),this.isSWRegistered=!0,(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}))}),(e=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)})),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange"),e.controller.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),e.addEventListener("message",(e=>{const t=e.data;if(!(0,u.Z)(t))return;const n=this.taskListenersSW[t.type];n&&n(t)})),this.addServiceWorkerTaskListener("requestFilePart",(e=>{const t={type:e.type,id:e.id},{docId:n,dcId:i,offset:o,limit:a}=e.payload;s.Z.managers.appDocsManager.requestDocPart(n,i,o,a).then((e=>{t.payload=e,this.postSWMessage(t)}),(n=>{t.originalPayload=e.payload,t.error=n,this.postSWMessage(t)}))})),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){let e;e=O.Z?new SharedWorker(new URL(n.p+n.u(589),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(589),n.b),{type:void 0}),J.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),this.attachWorkerToPort(e,J.Z,"crypto")}registerWorker(){let e;e=O.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)}))}postSWMessage(e){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(e)}onWorkerFirstMessage(e){this.log("set webWorker"),this.worker=e,this.attachWorkerToPort(e,this,"mtproto")}addServiceWorkerTaskListener(e,t){this.taskListenersSW[e]=t}loadState(){return Promise.all([(null!=H?H:H=q()).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 J.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return Q(this,void 0,void 0,(function*(){yield(0,X.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t});const n={type:"toggleStorages",payload:{enabled:e,clearWrite:t}};this.postSWMessage(n)}))}getMirror(e){return Q(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 te=new ee;o.GO.apiManagerProxy=te;const ne=te},490:(e,t,n)=>{n.d(t,{Z:()=>p});var s=n(4159),i=n(410),o=n(2219),a=n(2045),r=n(3241),c=n(2586),l=n(5003),d=n(3512),u=n(7487),h=n(3789);const g=a.Z;class m extends r.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 a(e){try{c(o.next(e))}catch(e){s(e)}}function r(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(a,r)}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 f=new m;i.GO&&(i.GO.singleInstance=f);const p=f},5228:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>l,default:()=>u});var s=n(4159),i=n(410),o=n(1267),a=n(5659),r=n(7298),c=n(7487);class l{constructor(){this.disabled=o.Z.test||-1===s.Z.domains.indexOf(location.hostname)}setAuthorized(e){if(!this.disabled)return c.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;c.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=>(0,a.Z)(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const d=new l;i.GO&&(i.GO.telegramMeWebManager=d);const u=d},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>h,default:()=>m});var s=n(410),i=n(5003),o=n(3789),a=n(2325),r=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:r.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:r.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=a.ZP.format(t[n],!0);const n={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}};o.Z.postSWMessage(n),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.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.addServiceWorkerTaskListener("push_click",(e=>{d.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e.payload)})),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),a=n(5003),r=n(3789),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function a(e){try{c(s.next(e))}catch(e){o(e)}}function r(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(a,r)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,a.kg)("OPUS",a.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 r.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const d=l},2423:(e,t,n)=>{n.d(t,{$2:()=>l,E:()=>d,Hk:()=>h,QB:()=>u,SC:()=>g,bu:()=>c,it:()=>r,kO:()=>f,tY:()=>m});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="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",r=a+"(?:"+o+"{1,64}(?::"+o+"{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}|"+o+"["+i+"·0-9-]{0,64}(?:\\."+o+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",c=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),l=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+r+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_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]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),d=/^(([^<>()[\]\\.,;:\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,}))$/,u=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={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}"},g={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},m=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let e in g)m.add(g[e]);const f=/^\+\d+$/},3512:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(1507),i=n(3241),o=n(410),a=n(3206),r=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("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),a.Z.getInstance().invokeVoid("event",{name:e,args:t})},r.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const d=l},7730:(e,t,n)=>{n.d(t,{Z:()=>a});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 a=o}},d={};function u(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return l[e].call(n.exports,n,n.exports,u),n.exports}u.m=l,e=[],u.O=(t,n,s,i)=>{if(!n){var o=1/0;for(l=0;l=i)&&Object.keys(u.O).every((e=>u.O[e](n[r])))?n.splice(r--,1):(a=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[n,s,i]},u.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return u.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,u.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);u.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var a=2&s&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,u.d(i,o),i},u.d=(e,t)=>{for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=e=>Promise.all(Object.keys(u.f).reduce(((t,n)=>(u.f[n](e,t),t)),[])),u.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"15a67f69d99bd6da42da",25:"7268088042b01ecb2f03",27:"0409c6d29d5c2ee62ee6",53:"6410540cf22127bc7705",61:"37d7af7b4663f378384c",77:"808c5b447b007ee7aa9d",104:"637ee92c4436d936af0a",106:"e317337dd2e7c9940c22",126:"25016da268c3c399afac",301:"908ec7163f3671b91bdb",339:"6f9573a4830d89de5c12",392:"8a7508144c4d4d66df01",436:"66de9e85049775fcc1d9",437:"613a8ab2d0385dea0bb4",442:"7c20450a077c518900a1",458:"b31331308efe622d392d",589:"6e8ad0f36f5d4772b86c",591:"02c6c72707bff66682b2",630:"5c8af6e9c411419a66e1",641:"be55089deabe08a3e958",642:"f2d4e67ea15d5329cd0b",665:"bd7f059d45a21bedf74a",670:"bdb55a9321cdc95dda81",678:"d4c394cfcd75943f854f",709:"c86dad481a67083f516b",725:"12c1ba16de4c3fac7523",765:"e78c17ede1cf4eff6bac",774:"04c4656f821730d3e97b",781:"a117406973cdcf8db64d",810:"3054249999128f0d7a84"}[e]+".chunk.js"),u.miniCssF=e=>{},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",u.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var a,r;if(void 0!==n)for(var c=document.getElementsByTagName("script"),l=0;l{a.onerror=a.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],a.parentNode&&a.parentNode.removeChild(a),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=h.bind(null,a.onerror),a.onload=h.bind(null,a.onload),r&&document.head.appendChild(a)}},u.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;u.g.importScripts&&(e=u.g.location+"");var t=u.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(/\/[^\/]+$/,"/"),u.p=e})(),o=u.u,a=u.e,r=new Map,c=new Map,u.u=function(e){return o(e)+(r.has(e)?"?"+r.get(e):"")},u.e=function(e){return a(e).catch((function(t){var n=c.has(e)?c.get(e):999999;if(n<1){var s=o(e);throw t.message="Loading chunk "+e+" failed after 999999 retries.\n("+s+")",t.request=s,t}return new Promise((function(t){setTimeout((function(){var s=Date.now();r.set(e,s),c.set(e,n-1),t(u.e(e))}),3e3)}))}))},(()=>{u.b=document.baseURI||self.location.href;var e={179:0};u.f.j=(t,n)=>{var s=u.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=u.p+u.u(t),a=new Error;u.l(o,(n=>{if(u.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;a.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",a.name="ChunkLoadError",a.type=i,a.request=o,s[1](a)}}),"chunk-"+t,t)}},u.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,a,r]=n,c=0;if(o.some((t=>0!==e[t]))){for(s in a)u.o(a,s)&&(u.m[s]=a[s]);if(r)var l=r(u)}for(t&&t(n);cu(6873)));h=u.O(h)})(); -//# sourceMappingURL=main.25d27682aa85e3cf89ca.bundle.js.map \ No newline at end of file diff --git a/public/main.25d27682aa85e3cf89ca.bundle.js.map b/public/main.25d27682aa85e3cf89ca.bundle.js.map deleted file mode 100644 index ee8936283..000000000 --- a/public/main.25d27682aa85e3cf89ca.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.25d27682aa85e3cf89ca.bundle.js","mappings":"uBAAIA,ECCAC,EADAC,ECAAC,EACAC,ECCIC,EACAC,EACAC,EACAC,E,mECYR,MAAMC,EAAgB,YAChBC,EAAQ,UAiIDC,EAAoB,CAC/BC,iBAAkB,GAClBC,aAAc,GAEdC,uBAAwB,EACxBC,QAAS,GACTC,QAAS,GACTC,aAAc,EACdC,iBAAkBC,KAAKC,MACvBC,YAAa,GACbC,cAAe,GACfC,aAAc,GACdC,QAASf,EACTgB,MAAOf,EACPgB,UAAW,CACTC,EAAG,EAAAC,UAAY,kBAAoB,mBAErCC,qBAAsB,GACtBC,SAAU,CACRC,iBAAkB,GAClBC,aAAc,aACdC,aAAc,QACdC,mBAAmB,EACnBC,aAAc,CACZC,MAAO,CACLC,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,GAEZC,MAAO,CACLJ,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,GAEZE,KAAM,CACJL,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,IAGdG,gBAAiB,CACfhB,EAAG,uBACHiB,cAAe,QACfC,OAAQ,CACNC,qBAAqB,EACrBC,oBAAoB,GAEtBC,eAAgB,QAChBC,eAAgB,SAChBC,wBAAyB,KAE3BC,SAAU,CACRC,MAAM,EACNC,QAAQ,GAEVC,SAAU,CACRC,SAAS,EACTC,MAAM,GAERC,MAAO,CACLF,SAAS,EACTG,KAAK,GAEPC,OAAQ,CAAC,CACPC,KAAM,MACNC,WAAY,EAAAjC,UAhGwB,CACxCkC,MAAM,EACNC,KAAM,GACNC,MAAO,kCACPC,mBAAoB,yCACpBC,UAAW,EACXC,GAAI,KAfqC,CACzCL,MAAM,EACNC,KAAM,UACNC,MAAO,kCACPC,mBAAoB,yCACpBC,UAAW,GACXC,GAAI,MAoGC,CACDP,KAAM,QACNC,WAAY,EAAAjC,UAhF0B,CAC1CkC,MAAM,EACNC,KAAM,GACNC,MAAO,UACPC,mBAAoB,6BACpBC,UAAW,EACXC,GAAI,MAhBuC,CAC3CL,MAAM,EACNC,KAAM,UAENC,MAAO,kCACPC,mBAAoB,+CACpBC,WAAY,GACZC,GAAI,QAqFFC,MAAO,SACPC,cAAe,CACbC,OAAO,GAETC,YCvNO,IAAIpD,MAAOqD,iBAAiBC,MAAM,aAAe,MAAQ,ODyNlEC,eAAgB,CACdC,OAAQ,EACRC,OAAO,EACPC,aAAc,EACdC,cAAe,CACbC,MAAO,EACPtC,MAAO,EACPuC,MAAO,GAETxB,MAAM,EACNyB,OAAO,GAETC,YAAY,EACZC,6BAA6B,EAC7BC,SAAS,OAAe,IACxBC,eAAgB,K,gCEjPlB,IAAIC,GAAc,EAElB,IAEE,MAAMC,EAAMC,SAASC,cAAc,UAAUC,WAAW,SAClDC,EAAYJ,EAAIK,aAAa,6BAC7BC,EAAmBF,GAAaJ,EAAIO,aAAaH,EAAUI,0BAA4B,IACzFF,EAASpB,MAAM,WAAaoB,EAASpB,MAAM,eACmC,IAAhFc,EAAIS,yBAAyBC,QAAQ,yCACrCX,GAAc,GAEhB,MAAMY,IAIR,W,+BCbA,MAEA,E,QAF0B,G,eCQ1B,IAAIC,EACJ,G,yBAAIC,UAEF,IAEED,GADcE,UAAUC,UAAU7B,MAAM,mBACT,IAAM,GACrC,MAAMyB,GACNC,GAAwB,OANbA,GAAwB,EAUvC,W,gCCrBA,MAEA,EAFmC,WAAaX,SAASC,cAAc,UAAUC,WAAW,OAAS,K,gCCArG,MAEA,GAFoF,IAAzDW,UAAUC,UAAUC,OAAO,0B,sCCAtD,MAEA,KAFyD,QAAtB,EAAS,OAATF,gBAAS,IAATA,eAAS,EAATA,UAAWG,mBAAW,eAAEC,sBAAsB,G,gCCEjF,MAEA,E,QAFgC,G,8CCAhC,MAAMC,EAA6B,IAAIC,IAAI,CACzC,aACA,YACA,cAGC,KACDD,EAA2BE,IAAI,cAGjC,W,uDCTA,MAAMC,EAAM,IAAI,KAA4BC,OAAO,IAAI,MAIvD,EAFmC,IAAIH,IAAIE,I,8CCF3C,MAEA,IAF2BrB,SAASC,cAAc,SAASsB,YAAY,oBAAsB,EAAAX,WAAa,EAAAY,iB,gCCH1G,MAAMhC,EAAQQ,SAASC,cAAc,SAGrC,KAF6BT,EAAM+B,cAAe/B,EAAM+B,YAAY,cAAcE,QAAQ,KAAM,M,gCCChG,MAEA,G,QAF+BC,aAAc,G,gCCF7C,MAEA,KAFuC,qBAA+B,OAATb,gBAAS,IAATA,eAAS,EAATA,UAAWc,eAAgB,M,gCCAxF,MAEA,EAF4D,oBAAnB,c,gCCOzC,MACA,EAD4B,iBAAkBC,QAAYA,OAAOC,eAAiB7B,oBAAoB6B,e,8MCC/F,MAAMC,EAAajB,UAAYA,UAAUC,UAAY,KAC/CiB,GAAoE,IAAzDlB,UAAUC,UAAUC,OAAO,yBACtCiB,GAAuE,IAA1DnB,UAAUC,UAAUmB,cAAcxB,QAAQ,WACvDyB,EAAc,SAASC,KAAKtB,UAAUC,YAAc,aAAaqB,KAAKtB,UAAUuB,QAGhFZ,GAAmB,mBAAmBW,KAAKtB,UAAUwB,WACxC,aAAvBxB,UAAUwB,UAA2BxB,UAAUyB,eAAiB,KAC/D,aAES1B,KAAe,oBAAuBkB,KAAe,yBAAyBK,KAAKL,IAAkBA,EAAW7C,MAAM,YAAc6C,EAAW7C,MAAM,YACrJyC,EAAab,UAAUC,UAAUmB,cAAcxB,QAAQ,YAAc,EAErE8B,EAAmB3B,GAAaY,EAEhCpF,EAAwDyE,UAAUyB,eAAiB,IAAsJ,GAAjJzB,UAAUC,UAAUC,OAAO,mH,gCCvBhI,MAEA,KAFwC,OAATF,gBAAS,IAATA,eAAS,EAATA,UAAW2B,U,6CCE1C,MAAMC,EAA6B,IAAItB,IAAI,CACzC,YACA,YACA,eAGC,KACDsB,EAA2BrB,IAAI,mBAGjC,W,gCCZA,MAEA,EAF0BpB,SAASC,cAAc,UAAUyC,UAAU,cAAcC,WAAW,oB,8CCE9F,MAEA,IAF6D,oBAAxB,mBAAwC,EAAAjB,a,eCiBtE,SAASkB,EAAWC,EAAWC,EAAWC,EAAWC,EAAY,GACtEH,GAAK,IAAKC,GAAK,IAAKC,GAAK,IACzB,MAAME,EAAMC,KAAKD,IAAIJ,EAAGC,EAAGC,GACrBI,EAAMD,KAAKC,IAAIN,EAAGC,EAAGC,GAC3B,IAAIK,EAAGC,EAAGC,GAAKL,EAAME,GAAO,EAE5B,GAAGF,IAAQE,EACTC,EAAIC,EAAI,MACH,CACL,IAAIE,EAAIN,EAAME,EAEd,OADAE,EAAIC,EAAI,GAAMC,GAAK,EAAIN,EAAME,GAAOI,GAAKN,EAAME,GACvCF,GACN,KAAKJ,EACHO,GAAKN,EAAIC,GAAKQ,GAAKT,EAAIC,EAAI,EAAI,GAC/B,MACF,KAAKD,EACHM,GAAKL,EAAIF,GAAKU,EAAI,EAClB,MACF,KAAKR,EACHK,GAAKP,EAAIC,GAAKS,EAAI,EAGtBH,GAAK,EAGP,MAAO,CACLA,EAAO,IAAJA,EACHC,EAAO,IAAJA,EACHC,EAAO,IAAJA,EACHN,EAAAA,GAgBG,SAASQ,EAAWJ,EAAWC,EAAWC,EAAWN,GAE1D,IAAIH,EAAWC,EAAWC,EAE1B,GAHAK,GAAK,IAAeE,GAAK,IAGhB,IAHCD,GAAK,KAIbR,EAAIC,EAAIC,EAAIO,MACP,CACL,MAAMG,EAAU,SAAiBC,EAAWC,EAAWC,GAGrD,OAFGA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAE,EAAUF,EAAc,GAATC,EAAID,GAASE,EAClCA,EAAI,GAAYD,EAChBC,EAAI,EAAE,EAAUF,GAAKC,EAAID,IAAM,EAAE,EAAIE,GAAK,EACtCF,GAGHC,EAAIL,EAAI,GAAMA,GAAK,EAAID,GAAKC,EAAID,EAAIC,EAAID,EACxCK,EAAI,EAAIJ,EAAIK,EAClBd,EAAIY,EAAQC,EAAGC,EAAGP,EAAI,EAAE,GACxBN,EAAIW,EAAQC,EAAGC,EAAGP,GAClBL,EAAIU,EAAQC,EAAGC,EAAGP,EAAI,EAAE,GAG1B,MAAO,CAACF,KAAKzD,MAAU,IAAJoD,GAAUK,KAAKzD,MAAU,IAAJqD,GAAUI,KAAKzD,MAAU,IAAJsD,GAAUG,KAAKzD,MAAU,IAAJuD,IAiB7E,SAASa,EAAWC,GACzB,MAAMzC,EAAiB,GACjB0C,EAAqB,MAAZD,EAAK,GAAa,EAAI,EAKrC,GAJGA,EAAKE,SAAY,EAAID,IACtBD,GAAQC,EAAS,IAAM,IAAM,IAAMD,EAAKG,MAAMF,IAG7CD,EAAKE,SAAY,EAAID,EACtB,IAAI,IAAIG,EAAIH,EAAQG,EAAIJ,EAAKE,SAAUE,EACrC7C,EAAI8C,KAAKC,SAASN,EAAKI,GAAKJ,EAAKI,GAAI,UAElC,GAAGJ,EAAKE,SAAY,EAAID,EAAS,CACtC,IAAI,IAAIG,EAAIH,EAAQG,EAAKJ,EAAKE,OAAS,IAAME,EAC3C7C,EAAI8C,KAAKC,SAASN,EAAKI,GAAKJ,EAAKI,GAAI,KAGvC7C,EAAI8C,KAAKC,SAASN,EAAKA,EAAKE,OAAS,GAAI,UAEzC,IAAI,IAAIE,EAAIH,EAAQG,EAAIJ,EAAKE,OAAQE,GAAK,EACxC7C,EAAI8C,KAAKC,SAASN,EAAKG,MAAMC,EAAGA,EAAI,GAAI,KAI5C,OAAO7C,EAGF,SAASgD,EAASC,GACvB,OAAOT,EAAWS,EAAIL,MAAM,EAAG,IAG1B,SAASM,EAAWT,GACzB,MAAMU,EAAOX,EAAWC,GACxB,OAAOlB,EAAW4B,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAG7C,SAASC,EAAWD,GACzB,MAAO,IAAMA,EAAKE,KAAKC,IAAO,IAAMA,EAAEC,SAAS,KAAKX,OAAO,KAAIY,KAAK,IAO/D,SAASC,EAAgBC,GAC9B,OALK,SAA0BA,GAC/B,OAAON,EAtDF,SAA0BM,GAC/B,MAAMC,EAAWD,EAAKd,MAAM,GAAI,GAAGgB,MAAM,MACnCC,GAASF,EAASG,MAClB9D,EAAM2D,EAASN,KAAKU,GACrBA,EAAIC,SAAS,MACND,EAAInB,MAAM,GAAI,IAGhBmB,IAGV,OAAO5B,EAAWnC,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAI6D,GA2CxBI,CAAiBP,IAI5BQ,CAAiBR,GAAMd,MAAM,GAAI,G,wFCpJ3B,SAASuB,EAAeC,EAAYC,GACjDD,EAAKA,EAAGR,MAAM,IAAK,GAAG,GACtBS,EAAKA,EAAGT,MAAM,IAAK,GAAG,GACtB,MAAMU,EAAKF,EAAGR,MAAM,KACdW,EAAKF,EAAGT,MAAM,KAEpB,IAAI,IAAIf,EAAI,EAAGA,EAAIyB,EAAG3B,SAAUE,EAAG,CACjC,MAAMuB,GAAME,EAAGzB,GACTwB,GAAME,EAAG1B,GACf,GAAGuB,EAAKC,EAAI,OAAO,EACd,GAAGD,EAAKC,EAAI,OAAQ,EAG3B,OAAO,E,iCCPM,SAASG,IACtB,SAAG7F,SAAS8F,gBAAkB9F,SAAS8F,cAAmCxH,OACvE0B,SAAS8F,cAAmCxH,OACtC,I,iCCEI,SAASyH,EAAYC,GAElC,GADAA,EAAQA,GAASpE,OAAOoE,MACd,CAERA,EAAQA,EAAMC,eAAiBD,EAE/B,IACKA,EAAME,iBAAiBF,EAAME,kBAC7BF,EAAMG,gBAAgBH,EAAMG,iBAC/BH,EAAMI,aAAc,EACpBJ,EAAMK,cAAe,EACrB,MAAM3F,KAGV,OAAO,E,iCClBM,SAAS4F,EAAgBC,EAAwDC,GAC9F,OAAQD,EAAWE,QAAQ,IAAMD,G,gECApB,SAASE,EAAqBC,GAC3CA,EAAMC,MAAMC,UAAY,uBAIxBF,EAAMG,SAGJ,UAAYC,MAAK,KAIjBJ,EAAMC,MAAMC,UAAY,Q,oFCTrB,MAAMG,EAAyB,EAAApG,WAAa,EAAAxE,WAAa,IAEhE,GAAG4K,EAAwB,CACzB,IAAIC,EAA2B,UAC3BC,EAAS,EACb,MAAMC,EAAI,CAACC,SAAS,EAAMC,SAAS,GAC7BC,EAAeC,IACnB,MAAMC,EAAQD,EAAEE,QAAQ,GAIlBC,GAAa,OAAgBF,EAAMG,OAAQ,gBACjD,GAAGD,EAAY,CACb,MAAME,EAAIJ,EAAMP,GACVY,EAAWX,EAASU,EAMpBE,EAAYJ,EAAWI,UACvBC,EAAeL,EAAWK,aAC1BC,EAAeN,EAAWM,aAC1BC,EAAgBH,EAAY5E,KAAKzD,MAAMqI,EAAYJ,EAAWM,aAAeH,GAAYC,EAAYD,GAExFE,IAAiBC,GAAgBC,GAAiBF,GAAgBE,GAAiB,IAEpGV,EAAEpB,sBAKJoB,EAAEpB,kBAaN,IAAI+B,EAAwB,EAC5BlI,SAASmI,iBAAiB,WAAYZ,KAC/BA,EAAEI,OAAuBS,UAAUC,SAAS,2BAA8Bd,EAAEe,UAAYJ,EAAyB,MAWvG,OAAqBX,EAAEI,QAEtC3H,SAASmI,iBAAiB,YAAab,EAAaH,GACpDnH,SAASmI,iBAAiB,cAAeZ,IACvC,GAAGA,EAAEE,QAAQzD,OAAS,EAAG,OACzB,MAAMuE,EAAahB,EAAEE,QAAQ,GAE7BP,EAASqB,EAAWtB,SAErB,CAACI,SAAS,IAEbrH,SAASmI,iBAAiB,YAAaZ,IAErCvH,SAASwI,oBAAoB,YAAalB,EAAaH,GAEvDe,EAAwBX,EAAEe,YAQzB,CAACjB,SAAS,IAEbrH,SAASmI,iBAAiB,oBAAoB,KAEzCnI,SAAS8F,eACV9F,SAAS8F,cAAcsC,UAAUC,SAAS,2BACzCrI,SAAS8F,cAA8BxH,OACxC,OAAqB0B,SAAS8F,iBAM/B,CAACuB,SAAS,IAGA,SAASoB,EAA6B9B,GAC/CK,GACJL,EAAMyB,UAAUhH,IAAI,4B,8CCtGtB,MAAMsH,EAAQ,CAAC,IAAK,KAGdC,EAIF,GAEEC,EAAsC,CAC1CC,KAAM,SACNC,MAAO,QACPC,UAAW,eAGE,SAASC,EAAUC,EAAiD,CACjFJ,KAAMH,EACNI,WAAOI,EACPH,UAAWL,IAEX,KAAK,UAAW1I,UACd,OAAOmJ,QAAQC,UAGjB,MAAMC,EAA2B,GACjC,IAAI,MAAMC,KAAQL,EAAO,CACvB,IAAIM,EAASN,EAAMK,GACL,QAAXC,IACDA,EAASb,GAGX,MAAMc,EAAOZ,EAAMU,GACbG,EAAmB,UAATH,EAAmB,CAAC,KAAO,CAAC,IAAK,KACjD,IAAI,MAAMI,KAAUD,EAAS,CAC3B,MAAME,GAAaJ,GAAU,MAACL,IAAYxE,KAAKmE,I,YAC7C,MAAM5B,EAAM,CAACyC,EAAQ,OAAQF,GAAM3E,KAAK,KAExC,OAD8C,QAA7B,GAAJ,EAAa,QAAV,EAAC8D,EAAM1B,UAAG,QAAT0B,EAAM1B,GAAS,IAAG,EAAC4B,GAAQ,WAAE,aAAM7I,SAAS4I,MAAMgB,KAAK3C,EAAK4B,MAG/EQ,EAASlF,QAAQwF,IAIrB,OAAOR,QAAQU,KAAK,CAClBV,QAAQW,IAAIT,IACZ,OAAM,S,wDC5CV,MAAMU,EAAmB,IAAqB,aAAe,YAEtD,MAAMC,UAAuB,IAQlCC,cACEC,QAEAC,KAAKC,SAAU,EACfD,KAAKE,aAAelB,QAAQC,UAC5Be,KAAKG,aAAe,OAEpB1I,OAAOuG,iBAAiB,QAAQ,KAC9BgC,KAAKI,QAAS,EAEd3I,OAAOuG,iBAAiB,SAAS,KAC/BgC,KAAKI,QAAS,IACb,CAACC,MAAM,OAIZ5I,OAAOuG,iBAAiB4B,GAAkB,KACxCI,KAAKI,QAAS,IACb,CAACC,MAAM,EAAMnD,SAAS,IAEzB8C,KAAKhC,iBAAiB,UAAWsC,IAC5BA,EACDN,KAAKE,aAAe,IAAIlB,SAASC,IAC/Be,KAAKG,aAAelB,KAGtBe,KAAKG,kBAKJI,kBACL,OAAOP,KAAKE,aAGHE,aACT,OAAOJ,KAAKC,QAGHG,WAAOI,GACbR,KAAKC,UAAYO,IAIpBR,KAAKC,QAAUO,EACfR,KAAKS,cAAc,SAAUD,KAIjC,MACA,EADuB,IAAIX,G,8CC5DpB,MAAMa,UAAuB,IAApC,c,oBAGS,KAAAC,eAAiB,EAEpBC,sBACF,OAAOZ,KAAKW,eAAiB,EAG3BC,oBAAgBJ,GAClBR,KAAKW,gBAAkBH,EAAQ,GAAK,EACpCR,KAAKS,cAAc,SAAUT,KAAKY,kBAItC,MACA,EADuB,IAAIF,G,eCG3B,IAAIG,EACG,SAASC,EAAQC,GAClBF,EASFA,EAAiB7G,KAAK+G,IARtBF,EAAmB,CAACE,GAEpBC,uBAAsB,KACpB,MAAMC,EAAmBJ,EACzBA,OAAmB9B,EACnBkC,EAAiBC,SAASC,GAAOA,U,6CAOvC,IAAIC,EAqBAC,EArBgEC,GAAa,EAC1E,SAASC,EAAoBR,GAC9BK,EAYME,EACRP,IAEAK,EAA6BpH,KAAK+G,IAdlCK,EAA+B,CAACL,GAEhCC,uBAAsB,KACpBM,GAAa,EACb,IAAI,IAAIvH,EAAI,EAAGA,EAAIqH,EAA6BvH,SAAUE,EACxDqH,EAA6BrH,KAG/BqH,OAA+BrC,EAC/BuC,GAAa,MAUZ,SAASE,IACd,OAAGH,IAEHA,EAAa,IAAIrC,SAAeC,GAAY6B,GAAQ,IAAM7B,QAC1DoC,EAAWzE,MAAK,KACdyE,OAAatC,KAGRsC,GAGF,SAASI,IACd,OAAO,IAAIzC,SAAeC,IACxB6B,GAAQ,KACNA,EAAQ7B,W,kEC8Bd,MAAMyC,EAAkB,IAhGjB,MAKL5B,cACE,qBAA2B,gBAAgB,KACzCE,KAAK2B,cAMGC,qBACV,YAA4B7C,IAAzBiB,KAAK6B,gBACC7B,KAAK6B,gBAGP7B,KAAK6B,gBAAkBhM,SAASiM,KAAKC,cAAc,yBAAsC,KAG3FC,cAAc3N,EAAQ2L,KAAKiC,YAC5B5N,IACFA,EAAQ2L,KAAKkC,UAAY,UAAY,WAGvC,MAAMN,EAAiB5B,KAAK4B,eACzBA,GACDA,EAAeO,aAAa,UAAW9N,GAIpC+N,mBACL,IACE,MAAMC,EAAqB5K,OAAO6K,WAAW,gCACvCC,EAAgB,KAEpBvC,KAAKwC,YAAcH,EAAmBI,QAAU,QAAU,MAGvD,SACD,kBAAwB,gBAExBzC,KAAK2B,YAIN,qBAAsBU,EACvBA,EAAmBrE,iBAAiB,SAAUuE,GACtC,gBAAiBF,GACxBA,EAA2BK,YAAYH,GAG1CA,IACA,MAAMhM,KAKHoM,0BACL,IAAI/H,EACJ,MAAMnG,EAAQiN,EAAgBkB,WAC3BnO,EAAMP,WAAWI,oBAClBsG,EAAOnG,EAAMP,WAAWI,mBACxBuB,SAASgN,gBAAgBpG,MAAMqG,YAAY,gCAAiClI,IAE5E/E,SAASgN,gBAAgBpG,MAAMsG,eAAe,kCAG5C,KAAsBnI,IACxB8G,EAAgBO,YAAa,QAAgBrH,IAI1C+G,WACL,MAAMO,EAAUlC,KAAKkC,UACfc,EAAcnN,SAASiM,KAAKC,cAAc,yBAC7CiB,GACDA,EAAYb,aAAa,UAAWD,EAAU,OAAS,SAGzDrM,SAASgN,gBAAgB5E,UAAUgF,OAAO,QAASf,GACnDlC,KAAKgC,gBAELhC,KAAK2C,0BAGAT,UACL,MAAgC,UAAzBlC,KAAK4C,WAAW3O,KAGlB2O,SAAS3O,GAAmD,WAA7B,mBAAwC+L,KAAKwC,YAAc,qBAC/F,OAAO,0BAAgC/I,GAAMA,EAAExF,OAASA,MAK5D,K,oGCtGe,WAEb,MAAMiP,EAAgB,CACpBC,UAAS,CAAC3F,EAAa4F,IAId,IAAI5F,EAFC4F,EAAK,GAAKC,SAASzM,SAMnC,CACE0M,OACyB,oBAAnB,cAAkCC,cACxCrC,SAASsC,IACLA,IACJ/L,OAAO+L,EAAEvP,MAAe,IAAIwP,MAAMD,EAAGN,OAIzCQ,G,oGCGA7N,SAASmI,iBAAiB,oBAAoB,KAAW,O,OAAD,E,OAAA,E,EAAA,YC5BlD2F,QAAQC,UAAUC,kBACpBF,QAAQC,UAAUC,gBAAkB,SAAS5P,EAAM6P,GAGjD,YAFa,IAAVA,IAAkBA,IAAUA,GAE5B9D,KAAK+D,aAAa9P,KAChB6P,IAEH9D,KAAKgE,gBAAgB/P,IACd,IAEI,IAAV6P,IAEH9D,KAAKmC,aAAalO,EAAM,KACjB,KDkBXgQ,EAAA,YAAqB,EAAAC,EAAA,KAEJrO,SAASsO,eAAe,YAChCC,KAAO,OAAO,EAAAxM,WAAa,EAAAP,gBAAkB,SAAW,8BAEjEgN,EAAA,UAGA,MAAMb,EAAI/L,OAAO6M,gBAAkB7M,OACnC,IACI8M,EADAC,GAAgB,EAEpB,MAAMC,EAAQ,KACZ,MAAMC,EAA2I,KAArIF,IAAkBG,EAAA,kBAAkCnB,EAAqBoB,QAAWpB,EAAaqB,YAAcpN,OAAOoN,aAC/HN,IAAWG,IAEJ,KAAsBH,EAASG,GAAOA,EAAKH,EAAU,IAC7D,EAAA7I,EAAA,KAGF6I,EAASG,EAGT7O,SAASgN,gBAAgBpG,MAAMqG,YAAY,OAAQ,GAAG4B,SAkCxD,GAHAjN,OAAOuG,iBAAiB,SAAUyG,GAClCA,IAEG,IAAwB,CACzB,MAAMK,EAAmB,KACvBN,EAA0B,IAAVO,GAAe,MAA2BJ,EAAA,kBAC1DF,IAEGjB,IAAM/L,SACJ+M,GACD/M,OAAO4G,oBAAoB,SAAUoG,GACrCjB,EAAExF,iBAAiB,SAAUyG,KAE7BjB,EAAEnF,oBAAoB,SAAUoG,GAChChN,OAAOuG,iBAAiB,SAAUyG,MAKxC,IAAIM,EACHtN,OAAeuN,cAAiBxQ,IAC/B,MAAMyQ,OAAqBlG,IAAVgG,EACjBA,EAAQvQ,GAELyQ,GAAsB,IAAVF,IACbD,KAIJH,EAAA,mBAAgC,UAAU,KACxCG,OAID,EAAAvN,aAAe,KAChB1B,SAASmI,iBAAiB,aAAcZ,IACtC,MAAMI,EAASJ,EAAEI,OACjB,GAAsB,QAAnBA,EAAO0H,SAAqB1H,EAAOS,UAAUC,SAAS,SAEvD,OADA,EAAAtC,EAAA,GAAYwB,IACL,KAMbvH,SAASmI,iBAAiB,aAAcZ,I,MACtC,GAA0C,SAAd,QAAzB,EAACA,EAAEI,cAAsB,eAAE0H,SAE5B,OADA9H,EAAEpB,kBACK,KAKXnG,SAASmI,iBAAiB,eAAgBZ,IACC,QAArCA,EAAEI,OAAuB0H,SAAuBzN,OAAe0N,iBACjE,EAAAvJ,EAAA,GAAYwB,MAIb,EAAA7F,YACD1B,SAASgN,gBAAgB5E,UAAUhH,IAAI,aAAc,eAGpD,EAAAhF,WACD4D,SAASgN,gBAAgB5E,UAAUhH,IAAI,aAGtC,EAAAW,UACE,EAAAnB,WACDZ,SAASgN,gBAAgB5E,UAAUhH,IAAI,aAKtC,EAAAI,gBACDxB,SAASgN,gBAAgB5E,UAAUhH,IAAI,UAEvCpB,SAASgN,gBAAgB5E,UAAUhH,IAAI,WAEjC,EAAAY,YACRhC,SAASgN,gBAAgB5E,UAAUhH,IAAI,cAYrC,IAGFpB,SAASgN,gBAAgB5E,UAAUhH,IAAI,YAFvCpB,SAASgN,gBAAgB5E,UAAUhH,IAAI,YAWzC,IAAImO,EAAOC,YAAY5T,MAIvB,MAAM6T,EAAc,yBAEbC,EAAaC,SAAkBxG,QAAQW,IAAI,CAEhD,gBAA4B/C,MAAK,EAAE2I,KAAiBA,IACpDD,IAaF,SAASG,EAAqBC,EAAmBC,GAC/CD,EAAKjJ,MAAMmJ,QAAU,IAErBD,EAAQ/I,MAAK,KACXnF,OAAOuJ,uBAAsB,KAC3B0E,EAAKjJ,MAAMmJ,QAAU,SAhB3B,mBAAmBL,EAAYM,MAAM1T,SAASyC,YAE9C8M,EAAA,qBAEG8D,EAASM,aAAe,qBACzB,iBAAiBN,EAASO,WAgB5BC,QAAQC,IAAI,mBAAoBZ,YAAY5T,MAAQ2T,GAEpD,MAAMrT,EAAYwT,EAAYM,MAAM9T,UACpC,GAAmB,sBAAhBA,EAAUC,EAA4C,CACvDgU,QAAQC,IAAI,wBAAyBlU,EAAUC,EAAGR,KAAKC,MAAQ,KAE/D,MAAM2K,EAAKvG,SAASsO,eAAe,cACnC,IAAI5G,EA6BA2I,EA5BJ,GAAG9J,EAAI,CACLmB,EAAanB,EAAG2F,cAAc,eACzB,MAAsB,EAAA3J,kBACzBmF,EAAWU,UAAUhH,IAAI,gBAI3BsG,EAAWd,MAAMmJ,QAAU,IAE3B,MAAMO,EAActQ,SAASC,cAAc,OAC3CqQ,EAAYlI,UAAUhH,IAAI,oBAE1BsG,EAAW6I,QAAQD,GACnB5I,EAAW8I,OAAOF,EAAYG,aAGhC,UACQtH,QAAQW,IAAI,CAChB,uCACA,yCACC/C,MAAK,EAAE2J,EAAUC,MAClBD,EAASE,QAAQC,eAAc,GAC/BF,EAAWC,QAAQE,sBAErB,MAAMpQ,IAMN,OAAOxE,EAAUC,GACf,IAAK,kBACHkU,SAAqB,0FAA8BO,QAAQG,QAC3D,MACF,IAAK,kBACHV,SAAqB,gEAA8BO,QAAQG,QAC3D,MACF,IAAK,oBACHV,SAAqB,2FAAgCO,QAAQG,MAAM7U,EAAU8U,UAC7E,MACF,IAAK,oBACHX,SAAqB,yEAAgCO,QAAQG,QAC7D,MACF,IAAK,kBACHV,SAAqB,iFAA8BO,QAAQG,MAAM7U,EAAU+U,UAK9EvJ,IAEE2I,UACKA,GASRT,EAAqBlI,EANL,UAAW1H,SACzBmJ,QAAQU,KAAK,EACX,EAAAqH,EAAA,GAAM,KACNlR,SAAS4I,MAAMuI,QAEjBhI,QAAQC,iBA+BZ+G,QAAQC,IAAI,sBAAuBzU,KAAKC,MAAQ,KAChDgU,EAAqB5P,SAASsO,eAAe,iBAAiB,EAAAtF,EAAA,aACvD,gEAA0B4H,QAAQG,S,YArSW,K,kTEsBxD,MACA,EAD0B,IAxCnB,MACEK,SACL,IACE5D,SAAS4D,SACT,MAAM7J,KAOH8J,QACL,IACEzP,OAAOyP,QACP,MAAM9J,KAMHT,QAeHlF,OAAOkF,W,8CCiDE,SAASuH,IACtB,IAAIiD,EAQJ,SAASC,EAAiBD,EAAcE,GACtC,OAAO,IAAI5D,MAAM0D,EAAS,CACxBG,IAAK,CAAC9J,EAAQjE,EAAGgO,K,MAEf,OAAe,QAAf,EAAO/J,EAAOjE,UAAC,QAARiE,EAAOjE,GAhDtB,SAAsCtF,EAAcoT,GA2BlD,OA1Bc,IAAI5D,MAAM,GAAI,CAC1B6D,IAAK,CAAC9J,EAAQjE,EAAGgO,IAQR,IAAInE,IACO,WAAuB,UAAW,CAChDnP,KAAAA,EACAuT,OAAQjO,EACR6J,KAAAA,GACCiE,KAiCkBI,CAAYlO,EAAa8N,MASpD,OAJAF,EAAUC,EAAiB,IAAI,GAE/BD,EAAQO,aAAeN,EAAiB,IAAI,GAErCD,I,kEC9EF,MAAMQ,EAUX7H,YAAY8H,IACV,OAAW5H,KAAM4H,GAEd,WACD5H,KAAK/L,MAAQ,SAGf+L,KAAK6H,oBAAqB,EAC1B7H,KAAKiG,KAAM,QAAO,CAAC,MAAO2B,EAAG3T,MAAMyG,KAAK,MACxCsF,KAAKiG,IAAI,eAETjG,KAAK8H,cAAa,GAElBH,EAAII,UAAU/N,KAAKgG,MAGdgI,cACL,OAAOhI,KAAK6H,mBAGPC,aAAaG,GAAY,GAC9B,GAAGjI,KAAKkI,gBAAkBD,EACxB,OAAOjI,KAAKkI,cAGd,MAAMC,EAAgB,CAACC,EAAoBC,K,MACzC,MAAMC,EAAaC,MAAMC,KAAKJ,EAAGE,YACjC,IAAI,MAAMG,KAAaH,EACrBF,EAAGM,YAAYD,GAGjB,GAAiB,QAAb,EAAAJ,EAAMM,eAAO,eAAE9O,OAInB,IAAI,MAAM+O,KAASP,EAAMM,QACpBP,EAAGE,WAAWpK,SAAS0K,EAAMH,YAIhCL,EAAGS,YAAYD,EAAMH,UAAWG,EAAME,QAASF,EAAMG,mBASzD,IACE,IAAIC,EAAUC,UAAUC,KAAKlJ,KAAK/L,KAAM+L,KAAKnO,SAE7C,IAAImX,EACF,OAAOhK,QAAQmK,SAEjB,MAAMC,GAGN,OAFApJ,KAAKiG,IAAImD,MAAM,mBAAqBA,EAAgBC,SACpDrJ,KAAK6H,oBAAqB,EACnB7I,QAAQmK,OAAOC,GAGxB,IAAIE,GAAW,EAOf,OANAC,YAAW,KACLD,GACFN,EAAQQ,QAAQ,CAACrK,KAAM,yBAExB,KAEIa,KAAKkI,cAAgB,IAAIlJ,SAAqB,CAACC,EAASkK,KAC7DH,EAAQS,UAAa5N,IACnByN,GAAW,EACX,MAAM1B,EAAKoB,EAAQU,OACnB,IAAIC,GAAY,EAEhB3J,KAAKiG,IAAI,UAET2B,EAAG4B,QAAWJ,IACZpJ,KAAK6H,oBAAqB,EAC1B7H,KAAKiG,IAAImD,MAAM,8CAA+CA,GAC9DD,EAAOC,IAGTxB,EAAGgC,QAAWxM,IACZ4C,KAAKiG,IAAImD,MAAM,UAAWhM,IACzBuM,GAAa3J,KAAK8H,gBAGrBF,EAAGiC,QAAWzM,IACZ4C,KAAKiG,IAAImD,MAAM,SAAUhM,GACzB,MAAM0M,EAAc1M,EAAEI,OAEtBwC,KAAK8H,aAAa6B,GAAY,GAE3BG,EAAYN,SACbM,EAAYN,QAAQpM,GAGtBwK,EAAGV,SAGLU,EAAGmC,gBAAmB3M,IACpB4C,KAAKiG,IAAImD,MAAM,0BAGjBnK,EAAQe,KAAK4H,GAAKA,IAGpBoB,EAAQQ,QAAW3N,IACjByN,GAAW,EACXtJ,KAAK6H,oBAAqB,EAC1B7H,KAAKiG,IAAImD,MAAM,8CAA+CvN,GAC9DsN,EAAOtN,IAGTmN,EAAQgB,gBAAmBnO,IACzByN,GAAW,EACXtJ,KAAKiG,IAAIgE,KAAK,8BAA+BpO,EAAMqO,WAAY,KAAMrO,EAAMsO,YAE3E,MAAM3M,EAAS3B,EAAM2B,OACfoK,EAAKpK,EAAOkM,OAClB1J,KAAKoK,OAAOlJ,SAASmH,IAOnB,GAAIT,EAAGyC,iBAAiBnM,SAASmK,EAAMpU,MAEhC,CACL,MACMmU,EADM5K,EAAOsM,YACJQ,YAAYjC,EAAMpU,MACjCkU,EAAcC,EAAIC,OAxFA,EAACT,EAAiBS,KAC1C,MAAMD,EAAKR,EAAG2C,kBAAkBlC,EAAMpU,MACtCkU,EAAcC,EAAIC,IAkFZkC,CAAkB3C,EAAIS,UAWzBmC,cAAuC5C,G,MAC5C,OAAmE,QAA5D,EAAA5H,KAAK+H,UAAU0C,MAAMC,GAAaA,EAASzW,OAAS2T,EAAG3T,cAAK,QAAI,IAAI0T,EAAIC,GAG1E4C,sBAAsBG,GAC3B3K,KAAK+H,UAAU7G,SAAS0J,IACtB,GAAGD,GAAYA,IAAaC,EAC1B,OAGF,MAAMhD,EAAKgD,EAAQhD,GAChBA,IACDA,EAAGgC,QAAU,OACbhC,EAAGV,aAjKM,EAAAa,UAAmB,GAuKrB,MAAM8C,EAKnB/K,YAAY8H,EAAOkD,GACjB9K,KAAK8K,UAAYA,EACjB9K,KAAKiG,KAAM,QAAO,CAAC,MAAO2B,EAAG3T,KAAM6W,GAAWpQ,KAAK,MACnDsF,KAAK+K,IAAMpD,EAAIqD,OAAOpD,GAqCjBqD,OAAOC,EAA8BJ,GAM1C,OAJIvC,MAAM4C,QAAQD,KAChBA,EAAY,GAAG/T,OAAO+T,IAGjBlL,KAAKoL,eAAe,aAAcd,GAC/BY,EAAuB3Q,KAAK2Q,GAAcZ,EAAYW,OAAOC,MACxB,GAAIJ,GAG9CO,MAAMP,GACX,OAAO9K,KAAKoL,eAAe,aAAcd,GAAgBA,EAAYe,SAA2B,GAAIP,GAG/FQ,KAAKJ,EAA8B1K,EAAoBsK,GAiB5D,OALIvC,MAAM4C,QAAQD,KAChBA,EAAY,GAAG/T,OAAO+T,GACtB1K,EAAQ,GAAGrJ,OAAOqJ,IAGbR,KAAKoL,eAAe,aAAcd,GAC/BY,EAAuB3Q,KAAI,CAAC2Q,EAAWK,IAAQjB,EAAYkB,IAAIhL,EAAM+K,GAAML,MACxC,GAAIJ,GA8E5CxD,IAAO4D,EAA8BJ,GAO1C,OAJIvC,MAAM4C,QAAQD,KAChBA,EAAY,GAAG/T,OAAO+T,IAGpBA,EAAUrR,OAIPmG,KAAKoL,eAAkB,YAAad,GACjCY,EAAuB3Q,KAAK2Q,GAAcZ,EAAYhD,IAAI4D,MACxB,GAAIJ,GALvC9L,QAAQC,QAAQ,IAQnBmM,eACNK,EACA1K,EACAkF,EACA6E,EAAY9K,KAAK8K,WAEjB,IAAI1F,EAOJ,OALGa,IACDb,EAAOC,YAAY5T,MACnBuO,KAAKiG,IAAIA,EAAM,YAGVjG,KAAK+K,IAAIjD,eAAelL,MAAMgL,GAC5B,IAAI5I,SAAW,CAACC,EAASkK,KAK9B,MAAMW,EAAclC,EAAGkC,YAAY,CAACgB,GAAYW,GAE1CC,EAAU,KACdC,aAAaC,GACbzC,EAAOW,EAAYV,QAIfyC,EAAa,KACjBF,aAAaC,GAEV3F,GACDjG,KAAKiG,IAAIA,EAAM,QAASZ,YAAY5T,MAAQ2T,GAQ9C,MAAM0G,EAAUC,EAASxR,KAAK7B,GAAMA,EAAEgR,SACtCzK,EAAQkM,EAAUW,EAAUA,EAAQ,KAGtChC,EAAYN,QAAUkC,EAGtB,MAAMM,EAAsC,cAATP,EAChCO,IACDlC,EAAYmC,WAAa,IAAMJ,KAGjC,MAAMD,EAAUrC,YAAW,KACzBvJ,KAAKiG,IAAImD,MAAM,2BAA4BU,EAAa7D,KACvD,KAOGiG,EAAiBnL,EAAS+I,EAAYQ,YAAYQ,IAElDK,EAAU5C,MAAM4C,QAAQe,GACxBH,EAAyBZ,EAAUe,EAAiB,GAAG/U,OAAO+U,GAEpE,GAAGF,EACD,OAGF,MAAMnS,EAASkS,EAASlS,OACxB,IAAIsS,EAAOtS,EAEX,MAAMuS,EAAoB,KACrBtC,EAAYV,SAIT+C,GACJN,KAIJ,IAAI,IAAI9R,EAAI,EAAGA,EAAIF,IAAUE,EAAG,CAC9B,MAAMiP,EAAU+C,EAAShS,GACzBiP,EAAQQ,QAAUkC,EAClB1C,EAAQS,UAAY2C,QAMrBC,OAAUvB,GACf,OAAO9K,KAAKoL,eAAoB,YAAad,GAAgBA,EAAY+B,UAA6B,GAAIvB,M,uMCncvG,MAAMtF,EAAgD,CAC3D,wBAA2B,oBAC3B,2BAA8B,uBAC/B,2BAA8B,qBAC9B,2BAA8B,qBAC9B,2BAA8B,qBAC9B,6BAAgC,qBAChC,wBAA2B,oBAC3B,2BAA8B,uBAC9B,wBAA2B,wBAC3B,2BAA8B,oBAC7B,yBAA4B,gBAC5B,0BAA6B,gBAC9B,uBAA0B,iBAC1B,0BAA6B,UAC7B,4BAA+B,iBAC/B,8BAAiC,mBAChC,wBAA2B,0CAC3B,2BAA8B,kCAC/B,2BAA8B,sBAC9B,8BAAiC,oCACjC,8BAAiC,oCACjC,8BAAiC,oCAChC,gCAAmC,oCACnC,0BAA6B,iBAC9B,+BAAkC,oBAEjC,gCAAmC,yBAEnC,qCAAsC,sCACvC,sCAAuC,sCACvC,sCAAuC,oCACvC,yCAA0C,uCACzC,+BAAgC,iCACjC,gCAAiC,iCACjC,gCAAiC,+BACjC,mCAAoC,kCAEpC,iCAAkC,wCAClC,oCAAqC,gCACrC,uCAAwC,mCACxC,+BAAgC,yCAChC,kCAAmC,iCACnC,qCAAsC,oCAEtC,wBAA2B,qCAQf8G,EAAyC,EAAAra,UAAY,6BAA+B,8BAEjG,IAAUsa,GAAV,SAAUA,GAGT,IAAIC,EAEAC,EAOH,SAASC,EAAYC,GACnB,EAAAC,sBAAwBD,EACxB,EAAAE,gCAAkCF,EAAS7R,MAAM,KAAK,GA4BxD,SAASgS,IACP,GAAkB,QAAf,EAAAlY,WACD,IACE,MAAMmY,EAAiBC,EAAkB,CAACC,KAAM,UAAWC,OAAQ,UAAWC,QAAQ,IAChFC,EAAO,IAAI5b,KACjB4b,EAAKC,SAAS,GACd,MAAMC,EAASP,EAAeQ,OAAOH,GACrC,EAAAI,UAAUC,GAAKH,EAAOxS,MAAM,KAAK,GACjCsS,EAAKC,SAAS,IACd,MAAMK,EAASX,EAAeQ,OAAOH,GACrC,EAAAI,UAAUG,GAAKD,EAAO5S,MAAM,KAAK,GACjC,MAAMvE,GACNyP,QAAQoD,MAAM,mBAAoB7S,GAClC,EAAAiX,UAAY,CAACC,GAAI,KAAME,GAAI,OA0BlC,SAAgBC,IACf,MAAMC,EAAc,iBAEpB,OADEnB,EAAYmB,GACP7O,QAAQW,IAAI,CAClB,8BACA,8BACA,8BACE/C,MAAK,EAAEkR,EAAMC,EAAUC,MACzB,MAAMC,EAA4B,GAalC,OAZAC,EAAmBJ,EAAKrH,QAASwH,GACjCC,EAAmBH,EAAStH,QAASwH,GAW9BE,EAT8B,CACpCnc,EAAG,qBACHoc,aAAc,EACdrI,UAAW8H,EACXI,QAAAA,EACApc,QAAS,EACTwc,OAAO,EACPL,UAAWA,EAAUvH,aAMxB,SAAgB6H,EAAa3B,EAAkB4B,GAC9C,EAAAC,yBAA0B,EACxB,MAAMC,EAAW,aACnB,OAAOzP,QAAQW,IAAI,CAClB8O,EAASC,WAAWC,mBAAmB,uBAAwB,CAC9D5I,UAAW4G,EACXiC,UAAWL,EAAM,MAAQ,gBAEzBA,GAAOE,EAASC,WAAWC,mBAAmB,uBAAwB,CACtE5I,UAAW4G,EACXiC,UAAW,YAEZ,8BACA,8BACAH,EAASC,WAAWC,mBAAmB,wBAAyB,CAC/D5I,UAAW4G,EACXkC,KAAM,IAEP,EAAAC,kBAYF,SAAgBZ,EAAmBD,EAAcc,EAA2B,IAC3E,IAAI,MAAMhV,KAAKkU,EAAS,CAEvB,MAAMzT,EAAIyT,EAAQlU,GACD,iBAAR,EACRgV,EAAO/U,KAAK,CACXhI,EAAG,iBACH8K,IAAK/C,EACLyG,MAAOhG,IAGRuU,EAAO/U,KAAK,OAAD,QACVhI,EAAG,2BACH8K,IAAK/C,GACFS,IAKN,OAAOuU,EAoBR,SAAgBZ,EAAa3I,GAG5B,OAFAA,EAASM,WAAa,oBAEf,QAAiB,CAACN,SAAAA,IAAW5I,MAAK,KACxCoS,EAAcxJ,GACPA,KAcT,SAAgBwJ,EAAcxJ,GAC3B,MAAMyJ,EAAkB,EAAArC,sBAC1B,GAAGpH,EAASO,YAAckJ,EAA1B,CAIA,IACCzC,EAAc,IAAI0C,KAAKC,YAAY,EAAAtC,iCAClC,MAAMtW,GACPyP,QAAQoD,MAAM,oBAAqB7S,GACnCiW,EAAc,IAAI0C,KAAKC,YAAY,EAAAtC,gCAAgC/R,MAAM,IAAK,GAAG,IAGlF,EAAAmT,QAAQ5C,QAER,IAAI,MAAM+D,KAAU5J,EAASyI,QAC5B,EAAAA,QAAQoB,IAAID,EAAOtS,IAAoBsS,GAGrC5J,EAASwI,YACX,EAAAsB,cAAczV,OAAS,EACvB,EAAAyV,cAActV,QAAQwL,EAASwI,UAAUA,WAEzCxI,EAASwI,UAAUA,UAAU9M,SAASqO,IACrC,GAAGA,EAAQtb,KAAM,CAChB,MAAMub,EAAmBD,EAAQE,aACjC,EAAAxB,QAAQoB,IAAIG,EAAa,CACxBxd,EAAG,iBACH8K,IAAK0S,EACLhP,MAAO+O,EAAQtb,YAMhB,EAAAyb,sBAAwBT,IAC1B,kBAAwB,kBAAmBA,GAC3C,EAAAS,oBAAsBT,EACnBU,EAAsBtE,QACtByB,KAGavE,MAAMC,KAAK3S,SAAS+Z,iBAAiB,UAC7C1O,SAAS2O,IACjB,MAAMnF,EAAW,EAAAoF,QAAQxI,IAAIuI,GAE1BnF,GACFA,EAASqF,aAcZ,SAAgBC,EAAexT,EAAe4G,EAA2B6M,EAAc,CAAClW,EAAG,IAC1F,IAAImW,EAAyC,GAGzCC,EAAY,EAyDhB,OAxDA3T,EAAMlF,QAHS,0DAGO,CAACxC,EAAOsb,EAASC,EAASC,EAASC,EAAY3W,EAAgBwV,KAKpF,GAFAc,EAAIlW,KAAKoV,EAAOtV,MAAMqW,EAAWvW,IAE9BwW,EAAI,CAEF,IAAIP,EACR,OAAOO,GACN,IAAK,KACEP,EAAUha,SAASC,cAAc,KACvC,MAGI,IAAK,KACH+Z,EAAUha,SAASC,cAAc,KAKrC+Z,EAAQxJ,UAAU2J,EAAeK,EAAIjN,EAAM6M,IAC3CC,EAAIlW,KAAK6V,QACP,GAAGS,EACTJ,EAAIlW,KAAKnE,SAASC,cAAc,YAC1B,GAAGya,EAAI,CACT,MAAMhF,EAAMgF,EAAGC,YAAY,KACzB9R,EAAO6R,EAAGzW,MAAM,EAAGyR,GAEnBkF,EAAMF,EAAGzW,MAAMyR,EAAM,EAAGgF,EAAG1W,OAAS,GACtC,IAAIhB,EACR,GAAG4X,IAAO,OAAiBA,GAAM,CAC3B5X,EAAIhD,SAASC,cAAc,KAC3B,MAAM4a,GAAa,OAAQD,GAC3B5X,EAAEuL,KAAOsM,EAAWD,IACjBC,EAAWC,SAAS9X,EAAEsJ,aAAa,UAAWuO,EAAWC,SAC5D9X,EAAE2E,OAAS,cAEX3E,EAAIuK,EAAK6M,EAAYlW,KACrBlB,EAAE+X,YAAc,GAGlB/X,EAAEwN,UAAU2J,EAAetR,EAAM0E,EAAM6M,IAE3CC,EAAIlW,KAAKnB,QACAuK,GA1DX,SAA0B8M,EAAwC9M,EAA0B6M,GAC1F,MAAMY,EAAMzN,EAAK6M,EAAYlW,KAC5BwO,MAAM4C,QAAQ0F,GAChBX,EAAIlW,QAAQ6W,GAEZX,EAAIlW,KAAK6W,GAsDJC,CAAiBZ,EAAK9M,EAAM6M,GAIjC,OADAE,EAAYvW,EAAS9E,EAAM+E,OACpB,MAGLsW,IAAc3T,EAAM3C,QACtBqW,EAAIlW,KAAKwC,EAAM1C,MAAMqW,IAGfD,EAKR,SAAgB3C,EAAOzQ,EAAkBiU,GAAQ,EAAO3N,GACvD,MAAM4N,EAAM,EAAA/C,QAAQ3G,IAAIxK,GACxB,IAAIN,EACJ,GAAGwU,EACF,GAAa,6BAAVA,EAAIhf,IAAoCoR,MAAAA,OAAI,EAAJA,EAAMvJ,QAAQ,CACxD,IAAIW,EAAI4I,EAAK,GACI,iBAAR,IAAkB5I,GAAKA,EAAElD,QAAQ,MAAO,KAGjDkF,EAAQwU,EAFExE,EAAYyE,OAAOzW,GAEb,WAAawW,EAAiB,iBAE9CxU,EADmB,mBAAVwU,EAAIhf,EACLgf,EAAIxQ,MAGJ1D,OAITN,EAAQM,EAGP,MAAM4M,EAASsG,EAAexT,EAAO4G,GACrC,OAAG2N,EACMrH,EAAOnP,KAAK2W,GAASA,aAAgBC,KAAOD,EAAKN,YAAcM,IAAMxW,KAAK,IAE1EgP,EAzVC,EAAAuE,QAA4C,IAAImD,IAChD,EAAA9B,cAA+B,GAOjC,EAAAd,yBAA0B,EAQrB,EAAA6C,iBAAhB,WACC,OAAG5E,IACIA,EAAuBzN,QAAQW,IAAI,CACzC,QAAiB,YACjB,EAAAmP,kBACElS,MAAK,EAAE4I,KACLA,GAEM,KAMN,EAAAoH,uBACCF,EAAYlH,EAASO,WAG1BiJ,EAAcxJ,GACPA,GAZCoI,MAaN0D,SAAQ,KACV7E,OAAuB1N,OAsBR,EAAAwS,cAAhB,SACEhE,EACAiE,IAAiB,EAAA5c,YAAc,EAAAA,aAAe2Y,GAE9C,EAAA3Y,WAAa2Y,EAEbT,IAEG0E,IACD7B,EAAsBtE,QACL9C,MAAMC,KAAK3S,SAAS+Z,iBAAiB,UAC7C1O,SAAS2O,IAChB,MAAMnF,EAAW,EAAAoF,QAAQxI,IAAIuI,GAE1BnF,aAAoB+G,GACrB/G,EAASqF,cAMF,EAAAnC,kBAAiB,EAyBjB,EAAAU,aAAY,EAsBZ,EAAAoD,WAAhB,SAA2B/E,EAAkBsB,GAC5C,OAAO,kCAAwC,sBAAuB,CACrEW,UAAW,aACX7I,UAAW4G,EACXgF,KAAM1D,KAIQ,EAAAC,mBAAkB,EAsBlB,EAAA0D,YAAhB,SAA4BjF,EAAkB4B,GAE7C,OADE7B,EAAYC,GACP2B,EAAa3B,EAAU4B,GAAK3R,MAAK,EAAEiV,EAAWC,EAAWC,EAAgBC,EAAgBhE,EAAWhc,MAC1G,IAAIic,EAA4B,GAUhC,MARA,CAAC8D,EAAgBC,GAAgB9Q,SAAS/H,IACzC+U,EAAmB/U,EAAEsN,QAAgBwH,MAGtCA,EAAUA,EAAQ9W,UAAU,CAAC0a,EAAU5D,QAAS6D,EAAU7D,SAASgE,OAAOC,UAE1EL,EAAU5D,QAAUA,EACpB4D,EAAU7D,UAAYA,EACfG,EAAa0D,OAIN,EAAA1D,aAAY,EASf,EAAAW,gBACQ,oBAAX,WAAuD,IAAtBI,KAAgB,YAClDlQ,QAAQC,UAER,8BAA2BrC,MAAMuV,IACtC1a,OAAeyX,KAAOkD,OAAOC,OAAwB,oBAAX,KAAyBnD,KAAO,GAAIiD,EAAM1L,YAKxE,EAAAuI,cAAa,EA6Db,EAAAgB,eAAc,EAkEd,EAAAzC,OAAM,EA2CT,EAAAuC,QAAyE,IAAIwC,QAO1F,MAAeC,EAIdzS,YAAY0S,GACXxS,KAAK6P,SAAU2C,MAAAA,OAAO,EAAPA,EAAS3C,UAAWha,SAASC,cAAc,QAC1DkK,KAAK6P,QAAQ5R,UAAUhH,IAAI,QAExB+I,KAAKyS,SAAWD,MAAAA,OAAO,EAAPA,EAASC,SACtBD,IAAaA,EAAsC1V,KAAQ0V,EAA0CpF,OACtGpN,KAAK+P,OAAOyC,GAGjB,EAAA1C,QAAQT,IAAIrP,KAAK6P,QAAS7P,OAU5B,MAAa0S,UAAoBH,EAI9BzS,YAAY0S,EAA8B,I,MACxCzS,MAAM,OAAD,wBAAKyS,GAAO,CAAEC,SAA0B,QAAhB,EAAAD,EAAQC,gBAAQ,QAAI,eAG9C1C,OAAOyC,GAGb,IAFA,OAAWxS,KAAMwS,GAEI,cAAlBxS,KAAKyS,SACPzS,KAAK6P,QAAQe,YAAc,GAC3B5Q,KAAK6P,QAAQxJ,UAAUkH,EAAOvN,KAAKlD,KAAK,EAAOkD,KAAKoD,WAC9C,CAEN,MAAM5I,EAAIwF,KAAK6P,QAAQ7P,KAAKyS,UACtBE,EAAYpF,EAAOvN,KAAKlD,KAAK,EAAMkD,KAAKoD,WAGrCrE,IAANvE,EAAiBwF,KAAK6P,QAAQ+C,QAAQ5S,KAAKyS,UAAYE,EACpD3S,KAAK6P,QAA6B7P,KAAKyS,UAAYE,GAIlDE,iBAAiBL,GACtB,GAAGxS,KAAKlD,MAAQ0V,EAAQ1V,OAAO,OAAUkD,KAAKoD,KAAMoP,EAAQpP,MAI5D,OAAOpD,KAAK+P,OAAOyC,IA9BX,EAAAE,YAAW,EAkCvB,MAAM/C,EAA0D,IAAIyB,IACpE,SAASpE,EAAkBwF,EAAsC,IAC/D,MAAMM,EAAOC,KAAKC,UAAUR,GAC5B,IAAIzF,EAAiB4C,EAAsBrI,IAAIwL,GAM/C,OALI/F,IACFA,EAAiB,IAAImC,KAAK+D,eAAe,EAAApG,gCAAkC,SAAW,EAAAjY,WAAY4d,GAClG7C,EAAsBN,IAAIyD,EAAM/F,IAG3BA,EAGE,EAAAS,UAAY,CAACC,GAAI,KAAME,GAAI,MAKvC,MAAa8D,UAAwBc,EAIlCzS,YAAY0S,G,MACVzS,MAAM,OAAD,wBAAKyS,GAAO,CAAEC,SAA0B,QAAhB,EAAAD,EAAQC,gBAAQ,QAAI,iBAG9C1C,OAAOyC,GAGV,IAAI9T,EACJ,IAHH,OAAWsB,KAAMwS,GAGXxS,KAAKwS,QAAQvF,MAAQjN,KAAKwS,QAAQtF,QAA+C,IAArCkF,OAAOT,KAAK3R,KAAKwS,SAAS3Y,OAA6B,CACpG,IAAIqZ,EAAQlT,KAAKoN,KAAK+F,WACtBzU,GAAQ,KAAsB,QAAf,EAAA9J,WAAwBse,EAAQ,IAAO,GAAKA,IAAQpZ,OAAO,GAAK,KAAO,IAAMkG,KAAKoN,KAAKgG,cAActZ,OAAO,GAKzG,QAAf,EAAAlF,aACD8J,GAAQ,KAAOwU,EAAQ,GAAK,EAAA1F,UAAUC,GAAK,EAAAD,UAAUG,SAElD,CAEL,MAAMZ,EAAiBC,EAAkBhN,KAAKwS,SAC9C9T,GAAO,OAAsBqO,EAAeQ,OAAOvN,KAAKoN,OAGzDpN,KAAK6P,QAAgB7P,KAAKyS,UAAY/T,GA5B/B,EAAA+S,gBAAe,EAgCZ,EAAA4B,KAAhB,SAAqBvW,EAAkBsG,GACtC,OAAO,IAAIsP,EAAY,CAAC5V,IAAAA,EAAKsG,KAAAA,IAAOyM,SAGrB,EAAAyD,MAAhB,SAAsBd,GACrB,OAAO,IAAIE,EAAYF,GAAS3C,SAGjB,EAAA0D,MAAhB,SAAsB1D,EAAsB/S,EAAkBsG,EAA2BqP,GACxF,OAAO,IAAIC,EAAY,CAAC7C,QAAAA,EAAS/S,IAAAA,EAAKsG,KAAAA,EAAMqP,SAAAA,IAAW5C,SAtezD,CAAUtD,IAAAA,EAAI,KA2ed,UAEM8G,EAAO9G,EAAK8G,KAGZC,EAAQ/G,EAAK+G,MAGbC,EAAQhH,EAAKgH,MAGZ,SAASC,EAAiBC,EAA6BC,GAC7D,MAAMxc,EAAMuc,EAAS3Z,MAAM,EAAG,GAC7B,IAAI,IAAIC,EAAI,EAAGA,EAAI0Z,EAAS5Z,SAAUE,EAAG,CACvC,MAAM4Z,EAAUF,EAAS5Z,OAAS,IAAOE,EACzC7C,EAAI8C,KAAwB,mBAAb,EAA0B0Z,EAAOC,GAAUD,GAC1Dxc,EAAI8C,KAAKyZ,EAAS1Z,IAGrB,OAAO7C,EAOD,SAASwD,EAAK+Y,EAA6BG,GAAU,EAAM7C,GACjE,MAAM8C,EAASL,EAAiBC,GAAWE,IACxC,MAAMnE,EAA2BmE,GAAUC,EAAU,qCAAuC,iCAC5F,OAAO7C,EAAQxE,EAAKgB,OAAOiC,GAAa,GAAQ6D,EAAK7D,MAGvD,OAAOuB,EAAQ8C,EAAOnZ,KAAK,IAAMmZ,EAGnC,UAAsBtH,G,8EC9kBf,MAAMuH,EAAuB,EACvBC,EAA0B,WAC1BC,EAAoC,IACpCC,EAA0B,MAC1BC,EAAa,WACbC,EAAkB,I,kRCf/B,MAEA,IAF4Bte,SAASC,cAAc,SAASsB,YAAY,gBAAkB,EAAAX,YAAc,EAAAY,gB,sDCoBxG,MAwBA,EAxBoB,OAAH,QACfb,sBAAqB,IACrBb,YAAW,IACXye,kBAAiB,IACjBC,2BAA0B,IAC1BC,mBAAkB,IAClBC,yBAAwB,IACxBC,wBAAuB,IACvBC,iBAAgB,IAChBC,sBAAqB,IACrBC,4BAA2B,IAC3BC,mBAAkB,IAClBC,qBAAoB,IACpBC,kBAAiB,IACjBC,2BAA0B,IAC1BC,kBAAiB,EACjBC,kBAAiB,IACjBC,oBAAmB,IACnBne,2BAA0B,IAC1Boe,2BAA0B,IAC1B7c,2BAA0B,KACvB3B,G,kFCtBL,MAIM7F,EAAgB,YAChBC,EAAQ,UAERqkB,EAAWhD,OAAOT,KAAK,KAEvB0D,EAAmC,CACvC,yBACA,mBACA,eACA,WAKF,SAAeC,I,qCACb,MAAMrP,GAAM,EAAAsP,EAAA,IAAO,gBAEbC,EAAYnQ,YAAY5T,MACxBgkB,GAAgB,OAAmBxP,GAEnC/G,EAAWkW,EAAS7a,KAAKuC,GAAQ2Y,EAAcC,EAAA,MAAiB5Y,GAAM,SAAWA,KACtF3F,OACCse,EAAcE,EAAA,MAAmB,aAAc,QAC/CF,EAAcE,EAAA,MAAmB,YAAa,QAC9CF,EAAcE,EAAA,MAAmB,WAAY,SAE9Cxe,OAAOse,EAAcC,EAAA,MAAiB,aAAc,aAE/Cxe,QAAY8H,QAAQW,IAAIT,GAC9B+G,EAAIgE,KAAK,WAAY5E,YAAY5T,MAAQ+jB,GAkCzC,MAAMI,EAA8B,GAC9BC,EAAc,CAAwB/Y,EAAQ0D,KAElDqF,EAAM/I,GAAO0D,EAEboV,EAAW5b,KAAK8C,IAalB,IAAI+I,EAAe,GAGnB,IAAI,IAAI9L,EAAI,EAAGF,EAASub,EAASvb,OAAQE,EAAIF,IAAUE,EAAG,CACxD,MAAM+C,EAAMsY,EAASrb,GACfyG,EAAQtJ,EAAI6C,QACLgF,IAAVyB,EAEDqF,EAAM/I,GAAO0D,EAEbqV,EAAY/Y,GAAK,EAAAgZ,EAAA,GAAK,IAAWhZ,KAIrC5F,EAAI6e,OAAO,EAAGX,EAASvb,QAGvB,IAAImc,EAAO9e,EAAI+e,QACf,MAAMxgB,EAAUyB,EAAI+e,QACdC,EAAehf,EAAI+e,QACnBE,EAAkBjf,EAAI+e,QAC5B,IAAID,GAAQG,EAAiB,CAC3BH,EAAOG,EACP,MAAMxE,EAAiB,CAAC,KAAM,qBAAsB,eACpD,IAAI,IAAI5X,EAAI,EAAGA,GAAK,IAAKA,EACvB4X,EAAK3X,KAAK,KAAKD,iBACf4X,EAAK3X,KAAK,KAAKD,cAGjB,MAAMqc,QAAepX,QAAQW,IAAIgS,EAAKpX,KAAKuC,GAAQ4Y,EAAA,MAAiB5Y,MACpE6U,EAAK3X,KAAK,aACVoc,EAAOpc,KAAsB,iBAAX,GAAwC,iBAAX,EAAsB,CAACqc,KAAMD,EAAO,IAAM,aAAchJ,KAAM5b,KAAKC,MAAQ,IAAO,EAAG+C,GAAIwhB,EAAKM,UAAS,IAAsBN,GAE5K,IAAIO,EAAW,GACf5E,EAAKzQ,SAAQ,CAACpE,EAAKyO,KACjBgL,EAAIzZ,GAAOsZ,EAAO7K,YAGdoK,EAAA,MAAmBY,GA2BxBP,IAEDnQ,EAAM9T,UAAY,CAACC,EAAG,qBACtBiS,EAAA,gBAAwB,YAA8B,iBAAX,GAAwC,iBAAX,EACtE,CAACoS,KAAM,EAAGjJ,KAAM5b,KAAKC,MAAQ,IAAO,EAAG+C,GAAIwhB,EAAKM,UAAS,IACzDN,IAGJ,MAAMQ,EAA4C,IAAIxf,IACtD,GAAG6O,EAAMpQ,UAAYA,EAAS,CAC5B,QAAesJ,IAAZtJ,EAAuB,CACxB,MAAMkV,EAAiD,IAAIyG,IAAI,CAC7D,CAAC,iBAAarS,GACd,CAAC,eAAWA,KAGd4L,EAASzJ,SAAQ,CAAClP,EAAG8K,KACnB6N,EAAS0E,IAAIvS,GAAK,EAAAgZ,EAAA,GAAKjQ,EAAM/I,QAG/B+I,GAAQ,EAAAiQ,EAAA,GAAK,KAEbnL,EAASzJ,SAAQ,CAACV,EAAO1D,KAEvB+I,EAAM/I,GAAO0D,KAGf,MAAM9H,EAA4C,CAChD+d,MAAO,EACPC,QAAS,EACTC,MAAO,GAET,IAAI,MAAM7Z,KAAOpE,EACf8d,EAAcvf,IAAI6F,GA5GF8Z,EAgHL/Q,EA9Gf+P,EAAW/b,OAAS,EACpBgM,EAAQ+Q,EACRhB,EAAW5b,QAAQoY,OAAOT,KAAK9L,UA+GzB8P,EAAA,MAAmB,CACvBkB,SAAUhR,EAAMpQ,UApHC,IAACmhB,EAwHtB,MAAME,EAAOtlB,KAAKC,MAsClB,GArCIoU,EAAMtU,iBApMU,MAoM0BulB,IACzC,MACD7Q,EAAI,qBAAsBJ,EAAMtU,iBAAkBulB,GAelDzB,EAXKnU,SAASpE,IACZ+Y,EAAY/Y,GAAK,EAAAgZ,EAAA,GAAK,IAAWhZ,UAwBnC+I,EAAM1T,SAAS4kB,eAAe,UAAYlR,EAAM1T,SAAS4kB,eAAe,gBAC1ElR,EAAM1T,SAASsC,MAAQoR,EAAM1T,SAAS6kB,WAAa,QAAU,MAC7DnB,EAAY,WAAYhQ,EAAM1T,YAI5B0T,EAAM1T,SAAS4kB,eAAe,WAAalR,EAAM1T,SAAS+B,WAAY,CACxE2R,EAAM1T,SAAS6B,QAAS,EAAA8hB,EAAA,GAAK,qBAC7B,MAAMrhB,EAAQoR,EAAM1T,SAAS6B,OAAOyW,MAAMhR,GAAMA,EAAExF,OAAS4R,EAAM1T,SAASsC,QACvEA,IACDA,EAAMP,WAAa2R,EAAM1T,SAAS+B,WAClC2hB,EAAY,WAAYhQ,EAAM1T,WAKlC,MAAM8kB,EAAuBpR,EAAM1T,SAASK,aAC5C,QAAqCuM,KAAlCkY,MAAAA,OAAoB,EAApBA,EAAsBtkB,SAAuB,CAC9C,MAAMukB,EAAW,CACf,WACA,UACA,SACA,YAGiB,CACjB,QACA,QACA,QAGShW,SAASiW,IAClB,MAAMC,EAAiDH,EAAqBE,GAAa,GACzFD,EAAShW,SAASmW,IAChBD,EAAiBC,GAAYJ,EAAqBI,SAItDH,EAAShW,SAASmW,WACTJ,EAAqBI,MAG9BxB,EAAY,WAAYhQ,EAAM1T,UAOhC,IAAIgY,EAAoBD,EACxB,IALA,EAAAoN,EAAA,GAAmB,IAAYzR,GAAQ0R,IACrC1B,EAAY0B,EAA2B1R,EAAM0R,OAI5C1R,EAAMhU,UAAYf,GAAiB+U,EAAM/T,QAAUf,EAAqB,CAUzE,KAR+C,KAA5C,EAAAsK,EAAA,GAAewK,EAAMhU,QAAS,UAAmBgU,EAAM/T,MAAQ,OAChE+T,EAAM5U,kBAAmB,EAAA6kB,EAAA,GAAK,sBAC9BjQ,EAAMxU,SAAU,EAAAykB,EAAA,GAAK,aAErBU,EAAcvf,IAAI,aAI2B,KAA5C,EAAAoE,EAAA,GAAewK,EAAMhU,QAAS,SAAiB,CAChD,IAAI2lB,GAAW,EACf3R,EAAM1T,SAAS6B,OAAOkN,SAAQ,CAACzM,EAAO8W,EAAKrU,KACzC,GACiB,QAAfzC,EAAMR,MACoB,gCAA1BQ,EAAMP,WAAWE,MACS,UAA1BK,EAAMP,WAAWiL,MAEF,UAAf1K,EAAMR,MACqB,YAA3BQ,EAAMP,WAAWG,OACS,UAA1BI,EAAMP,WAAWiL,KAChB,CACD,MAAMsY,EAAW,0BAAiCA,GAAaA,EAASxjB,OAASQ,EAAMR,OACpFwjB,IACDvgB,EAAIqU,IAAO,EAAAuK,EAAA,GAAK2B,GAChBD,GAAW,OAKdA,GACD3B,EAAY,WAAYhQ,EAAM1T,UAIkB,KAAjD,EAAAkJ,EAAA,GAAewK,EAAMhU,QAASf,KAC/BqZ,EAAarZ,EACboZ,EAAarE,EAAMhU,SAGrBgkB,EAAY,UAAW/kB,GACvB+kB,EAAY,QAAS9kB,GAoBvB,OAjBGmlB,IAAiBnlB,KAAWmlB,GAAgBA,EAAenlB,IAC5D4kB,EAAA,MAAmB,CAAC+B,QAAS3mB,IAI/BkT,EAAA,WAAqB4B,EAAM1T,SAExB,MACD8T,EAAI,YAAaJ,GAAO,EAAAiQ,EAAA,GAAKjQ,IAK/BI,EAAIgE,KAAK,QAAS5E,YAAY5T,MAAQ+jB,GAI/B,CAAC3P,MAAAA,EAAO2Q,cAAAA,EAAerM,WAAAA,EAAYD,WAAAA,EAAY0L,WAAAA,I,+RAGxD,IAAIjQ,E,4VChTJ,MAAMgS,WAAwB,IAY5B7X,cACEC,QAiVM,KAAA6X,aAAgBC,I,QACtB,MAAM,KAAC5jB,EAAI,IAAE6I,EAAG,MAAE0D,GAASqX,EAC3B,IAAIA,EAAQd,eAAe,OAEzB,YADA/W,KAAK8X,QAAQ7jB,GAAQuM,GAIvB,MAAMuX,EAA0B,QAApB,KAAG/X,KAAK8X,SAAQ7jB,UAAI,UAAJA,GAAU,QACzB8K,IAAVyB,SACMuX,EAAOjb,GAEdib,EAAOjb,GAAO0D,GA1VhBR,KAAKgY,gBAAiB,EACtBhY,KAAKiY,gBAAkB,GACvBjY,KAAK8X,QAAU,GACf9X,KAAKkY,SAAW,CACdC,YAAa,GACbC,cAAe,GAGjBpY,KAAKiG,IAAI,eAGTjG,KAAKqY,iBAGLrY,KAAKsY,wBACLtY,KAAKuY,uBAELvY,KAAKwY,2BAA2B,CAC9BC,YAAa,EAAEC,SAAAA,EAAUC,MAAAA,KAChBC,EAAA,UAA6BF,EAAUC,GAGhDE,YAAa,EAAEH,SAAAA,EAAUC,MAAAA,KAChBG,EAAA,iBAAoCH,GAAO,GAAO/b,MAAM8M,GAAWA,EAAOiP,QAGnF9c,MAAO,EAAE5H,KAAAA,EAAMmP,KAAAA,MAEba,EAAA,sBAA8BhQ,KAASmP,IAGzC2V,kBAAoBlB,IAClB,MAAMmB,EAAcnB,EACpB,OAAQlC,EAAA,EAAeqD,EAAY7Z,SAAiB6Z,EAAY5V,OAGlE2U,OAAQ/X,KAAK4X,eA2Df3T,EAAA,mBAA2B,mBAAoBgV,IAC7ChV,EAAA,wCAAgDgV,MAGlDxhB,OAAOuG,iBAAiB,UAAU,KAChCiG,EAAA,uDAGFA,EAAA,mBAA2B,eAAe,KAExCjF,QAAQW,IAAI,EACV,EAAAuZ,EAAA,IAAe,GAAO,GACtBvD,EAAA,UACA3W,QAAQU,KAAK,CACXyZ,EAAA,uBAAmC,IACnC,EAAApS,EAAA,GAAM,OAERqS,EAAA,2BACApa,QAAQW,IAT4B,CAAC,cAAe,sBAShCpF,KAAK8e,GAAcC,OAAOrO,OAAOoO,QACpD/H,SAAQ,KACTiI,EAAA,iBAIJC,EAAA,mBAAgC,UAAWlZ,IACzCN,KAAKyZ,mBAAmBnZ,MAE1BN,KAAKyZ,mBAAmBD,EAAA,UAExBxZ,KAAKiG,IAAI,uBAAwB,GACjCjG,KAAK0Z,OAAO,cAAe,GAIrBpB,wBACN,KAAK,kBAAmB5hB,WAAY,OAGpC,MAAMijB,EAASjjB,UAAUkjB,cACzBljB,UAAUkjB,cAAcC,SAEtB,IAAIC,IAAI,kBACR,CAACC,MAAO,OACRnd,MAAMod,IACNha,KAAKiG,IAAI,gBAAiB+T,GAC1Bha,KAAKgY,gBAAiB,GAEXgC,EAAaC,YAAcD,EAAaE,SAAWF,EAAaG,QACxEnc,iBAAiB,eAAgBZ,IAClC4C,KAAKiG,IAAI,iBAAkB7I,SAS3B7G,IACFyJ,KAAKgY,gBAAiB,EACtBhY,KAAKiG,IAAImD,MAAM,0BAA2B7S,GAE1CyJ,KAAKoa,WAAW,uBAAuB,MAGzCT,EAAO3b,iBAAiB,oBAAoB,KAC1CgC,KAAKiG,IAAIgE,KAAK,oBAEd0P,EAAOU,WAAWrc,iBAAiB,SAAUZ,IAC3C4C,KAAKiG,IAAImD,MAAM,oBAAqBhM,SAQxCuc,EAAO3b,iBAAiB,WAAYZ,IAClC,MAAMkd,EAA0Bld,EAAEmd,KAClC,KAAI,EAAAC,EAAA,GAASF,GACX,OAGF,MAAMvZ,EAAWf,KAAKiY,gBAAgBqC,EAAKnb,MACxC4B,GACDA,EAASuZ,MAIbta,KAAKya,6BAA6B,mBAAoBH,IACpD,MAAMI,EAA4C,CAChDvb,KAAMmb,EAAKnb,KACX3K,GAAI8lB,EAAK9lB,KAGL,MAACmmB,EAAK,KAAEC,EAAI,OAAEhhB,EAAM,MAAEihB,GAASP,EAAKzC,QAC1C5T,EAAA,yCAAiD0W,EAAOC,EAAMhhB,EAAQihB,GACrEje,MAAMke,IACLJ,EAAa7C,QAAUiD,EACvB9a,KAAK+a,cAAcL,MACjBnkB,IACFmkB,EAAaM,gBAAkBV,EAAKzC,QACpC6C,EAAatR,MAAQ7S,EACrByJ,KAAK+a,cAAcL,SAKvBf,EAAO3b,iBAAiB,gBAAiBZ,IACvC4C,KAAKiG,IAAImD,MAAM,mBAAoBhM,MAI/Bmb,uBACN,IAAIoB,EAEFA,EADC,IACQ,IAAIpW,aAEX,IAAIuW,IAAI,kBACR,CAAC3a,UAAM,IAGA,IAAImE,OAEX,IAAIwW,IAAI,kBACR,CAAC3a,UAAM,IAIX8b,EAAA,mBAAmC,QAAQ,CAACpD,EAASqD,EAAQrf,KAC3DmE,KAAKoa,WAAW,kBAAcrb,OAAWA,EAAW,CAAClD,EAAMsf,MAAM,QAGnEnb,KAAKob,mBAAmBzB,EAAQsB,EAAA,EAAmB,UAI7C5C,iBAGN,IAAIsB,EAEFA,EADC,IACQ,IAAIpW,aAEX,IAAIuW,IAAI,kBACR,CAAC3a,UAAM,IAGA,IAAImE,OAEX,IAAIwW,IAAI,kBACR,CAAC3a,UAAM,IAIXa,KAAKqb,qBAAqB1B,GAIpByB,mBAAmBzB,EAA+B2B,EAA8Cnc,GACtG,MAAMoc,EAAqB5B,EAAwB4B,MAAQ5B,EAC3D2B,EAAYE,WAAWD,GAEvB5B,EAAO3b,iBAAiB,SAAUzH,IAChCyJ,KAAKiG,IAAImD,MAAMjK,EAAM,eAAgB5I,MAIlCwkB,cAAc1R,GAChB3S,UAAUkjB,cAAcS,YACzB3jB,UAAUkjB,cAAcS,WAAWoB,YAAYpS,GAI3CgS,qBAAqB1B,GAC3B3Z,KAAKiG,IAAI,iBAETjG,KAAK2Z,OAASA,EAId3Z,KAAKob,mBAAmBzB,EAAQ3Z,KAAM,WAIjCya,6BAA6BxmB,EAAgD8M,GAClFf,KAAKiY,gBAAgBhkB,GAAQ8M,EAGvB2a,YACN,OAAO1c,QAAQW,IAAI,EDMdgG,MAAAA,EAAAA,EAAAA,EAAY2P,KCLH1Y,MAAM2I,IAChBvF,KAAKmK,WAAa5E,EAAY4E,WAC9BnK,KAAKkK,WAAa3E,EAAY2E,WAC9BlK,KAAK8X,QAAe,MAAIvS,EAAYM,MAC7BN,OAMNoW,YACL,OAAO3b,KAAK0b,YAAY9e,MAAM8M,IAC5B,MAAOnE,GAAemE,EAEtB,OADA1J,KAAK0Z,OAAO,QAAS,OAAF,wBAAMnU,GAAW,CAAEqW,OAAQ3X,EAAA,qBACvCyF,KAKJmS,aAAiDrU,KAAmBpE,GACzE,OAAO6X,EAAA,eAA+BzT,KAAWpE,GAItC8V,eAAe4C,EAAkBC,G,+CACtC,EAAA7C,EAAA,GAAe4C,EAASC,GAC9B/b,KAAK0Z,OAAO,iBAAkB,CAACoC,QAAAA,EAASC,WAAAA,IACxC,MAAMzB,EAA0B,CAACnb,KAAM,iBAAkB0Y,QAAS,CAACiE,QAAAA,EAASC,WAAAA,IAC5E/b,KAAK+a,cAAcT,MAGR0B,UAAmC/nB,G,yCAE9C,OADe+L,KAAK8X,QAAQ7jB,MAIvBgoB,WACL,OAAOjc,KAAKgc,UAAU,SAGjBE,eAAyCpf,EAAQ0D,GACtDR,KAAKkY,SAASpb,GAAO0D,EACrBR,KAAKoa,WAAW,WAAYpa,KAAKkY,UAG5BuB,mBAAmBnZ,GACxBN,KAAKkc,eAAe,gBAAiB5b,EAAO9O,KAAKC,MAAQ,IAqB7D,MAAM0qB,GAAkB,IAAIxE,GAC5B,qBAAiCwE,GACjC,a,sIC9YA,MAGMC,EAA6B,IAE5B,MAAMC,UAAuB,IAWlCvc,cACEC,OAAM,GAHA,KAAAkG,KAAM,QAAO,YAmCb,KAAAqW,cAAgB,KACnBtc,KAAKuc,iBAAmBvc,KAAKwc,cAC9Bxc,KAAKiG,IAAIgE,KAAK,yBACd,WAAsB,iBA+BlB,KAAAwS,cAAgB,CAAMnc,EAAO,cAA0B,O,EAAD,K,OAAA,E,EAAA,YAC5D,GAAGN,KAAKwc,YACN,OAGF,MAAM1F,EAAOtlB,KAAKC,MACZirB,EAA2B,CAC/BloB,GAAIwL,KAAK2c,WACTrc,KAAAA,EACAwW,KAAAA,IAGK8F,EAAa9qB,EAAQ,iBAAmBkN,QAAQW,IAAI,CACzD,QAAmB,eAAe,GAClC,QAAmB,WAAW,KAGhC,GAAG7N,EAAQ,UAKT,OAJAkO,KAAKuc,gBAAiB,EACtB,wCACAvc,KAAK6c,mBAAmB,gBACxB,oBAA+B,GAAO,GAE9BT,EACR,QAAmB,CAACU,YAAaJ,KAK/Bpc,IACCsc,GACDA,EAAYpoB,KAAOwL,KAAK2c,YACxBC,EAAY9F,KAAQA,EAjHI,KAkH1B,QAAmB,CAACgG,YAAaJ,IAE7B1c,KAAKuc,iBACPvc,KAAKuc,gBAAiB,EACtB,yCACAvc,KAAKiG,IAAIgE,KAAK,sBAAuByS,IAGvC1c,KAAK+c,0BACG/c,KAAKuc,iBACbvc,KAAKuc,gBAAiB,EACtB,wCACAvc,KAAKiG,IAAIgE,KAAK,oBAAqByS,GACnC1c,KAAKgd,oBAALhd,KAAKgd,kBAAsBvlB,OAAO8R,YAAW,IAAMvJ,KAAK6c,mBAAmB,SAhItD,Q,YAkFqC,K,+QAhE5D7c,KAAKiG,KAAM,QAAO,YAClBjG,KAAK2c,WAAa,IAGTM,wBACT,OAAOjd,KAAKwc,YAGPU,QAGL,GAFAld,KAAKmd,SAEDnd,KAAKod,QAAmE,CAC1Epd,KAAKod,SAAU,EAEf,qBAAgC,SAAUpd,KAAKyc,eAC/CY,YAAYrd,KAAKyc,cAlCS,KAmC1Bzc,KAAKyc,gBAEL,IACE5mB,SAASgN,gBAAgB7E,iBAAiB,eAAgBgC,KAAKsc,eAC/D,MAAMlf,MAIJ+f,QACNnd,KAAKuc,gBAAiB,EACtBvc,KAAK+c,yBACL/c,KAAKwc,iBAAczd,EAUdue,mBACFtd,KAAKwc,cACNxc,KAAKmd,QACLnd,KAAKyc,eAAc,GACnBzc,KAAKS,cAAc,cAIfoc,mBAAmBU,GACtBvd,KAAKuc,gBAAkBvc,KAAKwc,cAI/Bxc,KAAKiG,IAAIgE,KAAK,aAAcsT,GAC5Bvd,KAAK+c,yBACL/c,KAAKwc,YAAce,EAEnBvd,KAAKS,cAAc,cAAe8c,IAG5BR,yBACH/c,KAAKgd,oBACNrR,aAAa3L,KAAKgd,mBAClBhd,KAAKgd,kBAAoB,IAuD/B,MAAM3Y,EAAiB,IAAIgY,EAC3B,OAAmB,oBAAgChY,GACnD,W,uICpJO,MAAMmZ,EAAb,cACU,KAAAC,SAA2B,WAA0D,IAA5C,oBAAoBpa,SAASqa,UAEvEhX,cAAciX,GACnB,IAAG3d,KAAKyd,SAIR,OAAO,QAAmB,aAAa7gB,MAAMghB,IAC3C,MAAMC,GAAK,QAAM,GACjB,GACEF,IACAC,MAAAA,OAAQ,EAARA,EAAUD,eAAgBA,GACzBC,EAASC,GAAK,MAASA,EAExB,OAGF,QAAmB,CACjBC,UAAW,CACTH,YAAAA,EACAE,GAAAA,KAIJ,MAAME,EAAO,oBAAoBJ,EAAc,IAAM,eAAeK,mBAAmB,YAAc,IAAM,cAMrG9e,EALO,CACX,iBAAmB6e,EACnB,UAAYA,GAGQxjB,KAAKkW,IAClB,OAAWA,GAAK7T,MAAMqhB,IAC3BA,EAAOC,cAIX,OAAOlf,QAAQW,IAAIT,OAKzB,MAAMia,EAAuB,IAAIqE,EACjC,OAAmB,0BAAsCrE,GACzD,W,iKC9BO,MAAMgF,UAA0B,IAgBrCre,cACEC,OAAM,GAXD,KAAAiI,aAAc,EACb,KAAAoW,eAAgB,EAChB,KAAAC,6BAA8B,EAC9B,KAAAjB,SAAU,EACV,KAAAjrB,SAAsD,GAEtD,KAAAmsB,UAAY5nB,UAAUC,UAAUmB,cAAcxB,QAAQ,YAAc,EACpE,KAAAioB,iBAAkBve,KAAKse,UACvB,KAAArY,KAAM,QAAO,MA6Cd,KAAAuY,UAAY,KACbxe,KAAKgI,aAITtR,UAAUkjB,cAAc5S,MAAMpK,MAAM6hB,IAClCA,EAAIC,YAAYF,UAAU,CAACD,gBAAiBve,KAAKue,kBAAkB3hB,MAAM+hB,IAEvE3e,KAAKoe,eAAgB,EACrBpe,KAAK4e,uBAAuB,YAAaD,MACxCE,OAAOzhB,IACuB,WAA5B0hB,aAAaC,WACd/e,KAAKiG,IAAI,4CAETjG,KAAKiG,IAAI,+BAAgC7I,GACrC4C,KAAKue,kBACPve,KAAKue,iBAAkB,EACvBhV,WAAWvJ,KAAKwe,UAAW,YAyD9B,KAAAQ,cAAgB,KACrB,IAAIhf,KAAKgI,aAAe,sBACtB,OAGFhI,KAAK7N,SAAS8sB,SAAW5b,SAASe,MAAQ,IAAI9M,QAAQ,OAAQ,IAE9D,MAAMwW,EAAiD,GACjDoR,EAAwF,CAC5FC,mBAAoB,EAAAltB,UAAY,wCAA0C,iCAC1EmtB,qBAAsB,EAAAntB,UAAY,0CAA4C,mCAC9EotB,uBAAwB,sCAG1B,IAAI,MAAMC,KAAUJ,EAClBpR,EAAKwR,GAA2C,YAAYJ,EAAiBI,IAA0C,GAGzH,MAAMhF,EAA8B,CAClCnb,KAAM,OACN0Y,QAAS,CACP0H,mBAAoBvf,KAAKqe,4BACzBvQ,KAAMA,EACN3b,SAAU6N,KAAK7N,WAInB,kBAA8BmoB,GAE9Bta,KAAKwf,UAAYjW,WAAWvJ,KAAKgf,cAAe,MA/I3C,gBAAiBvnB,QAClB,iBAAkBA,QAClB,kBAAmBf,YACrBsJ,KAAKiG,IAAIgE,KAAK,oCACdjK,KAAKgI,aAAc,EACnBhI,KAAKqe,6BAA8B,GAGlCre,KAAKgI,aAA2C,WAA5B8W,aAAaC,YAClC/e,KAAKiG,IAAIgE,KAAK,uCAIXiT,QACDld,KAAKod,UACPpd,KAAKod,SAAU,EACfpd,KAAKyf,kBACLzf,KAAK0f,6BAIFC,gCACL3f,KAAKqe,6BAA8B,EAG9BoB,kBACDzf,KAAKgI,aAITtR,UAAUkjB,cAAc5S,MAAMpK,MAAM6hB,IAClCA,EAAIC,YAAYe,kBAAkB7iB,MAAM+hB,IACtC3e,KAAKoe,gBAAkBO,EACvB3e,KAAK4e,uBAAuB,OAAQD,MACnCE,OAAOtoB,IACRyJ,KAAKiG,IAAImD,MAAM,iCAAkC7S,SA6BhDqpB,cACD5f,KAAKgI,aAITtR,UAAUkjB,cAAc5S,MAAMpK,MAAM6hB,IAClCA,EAAIC,YAAYe,kBAAkB7iB,MAAM+hB,IACtC3e,KAAKoe,eAAgB,EAElBO,IACD3e,KAAK4e,uBAAuB,cAAeD,GAE3CpV,YAAW,KACToV,EAAaiB,cAAchjB,MAAMijB,IAC/B7f,KAAKoe,eAAgB,KACpBS,OAAOzhB,IACR4C,KAAKiG,IAAImD,MAAM,yBAA0BhM,QAE1C,SAEJyhB,OAAOzhB,IACR4C,KAAKiG,IAAImD,MAAM,wDACMhM,SAKpBuJ,mBACD3G,KAAKgI,aAITtR,UAAUkjB,cAAc5S,MAAMpK,MAAM6hB,IAClCA,EAAIC,YAAYe,kBAAkB7iB,MAAM+hB,IACtC3e,KAAKiG,IAAIgE,KAAK,oBAAqB0U,GAChCA,GACDA,EAAaiB,cAAchjB,MAAMijB,IAC/B7f,KAAKiG,IAAIgE,KAAK,+BAAgC4V,GAC9C7f,KAAKoe,eAAgB,KACpBS,OAAOzhB,IACR4C,KAAKiG,IAAImD,MAAM,yBAA0BhM,SAG5CyhB,OAAOzhB,IACR4C,KAAKiG,IAAImD,MAAM,wDACMhM,SAqCpB0iB,YAAYC,GACjB/f,KAAK7N,UAAW,OAAK4tB,GACrBpU,aAAa3L,KAAKwf,WAClBxf,KAAKgf,gBAGAgB,wBACDhgB,KAAKgI,aAKT,kBADkD,CAAC7I,KAAM,wBAIpDugB,4BACD1f,KAAKgI,cAIT,iCAA6C,cAAesS,IACvD,sBACD,aAIFta,KAAKS,cAAc,0BAA2B6Z,EAAKzC,YAGrDnhB,UAAUkjB,cAAc5S,MAAMpK,KAAKoD,KAAKgf,gBAGnCJ,uBAAuB/iB,EAAmC8iB,GAC/D,GAAGA,EAAc,CACf,MAAMsB,EAAwCtB,EAAauB,SAC3D,KAAID,GACDA,EAAgBE,UAChBF,EAAgBtO,MAChBsO,EAAgBtO,KAAKyO,QACrBH,EAAgBtO,KAAKqE,MAKtB,OAJAhW,KAAKiG,IAAIgE,KAAK,4BAA6BgW,GAC3CjgB,KAAK4f,cACL5f,KAAKgI,aAAc,OACnBhI,KAAK4e,uBAAuB/iB,GAI9BmE,KAAKiG,IAAIgE,KAAK,OAAQpO,EAAOokB,GAC7BjgB,KAAKS,cAAe,QAAU5E,EAAuC,CACnEwkB,UAAW,GACXC,WAAYvN,KAAKC,UAAUiN,UAG7BjgB,KAAKiG,IAAIgE,KAAK,OAAQpO,GAAO,GAC7BmE,KAAKS,cAAe,QAAU5E,GAAuC,IAK3E,MAAMud,EAAoB,IAAI+E,EAC9B,OAAmB,uBAAmC/E,GACtD,W,2XC1EA,MAAMN,EAAuB,IAzJtB,MAAP,cAGU,KAAAyH,WAAa,KACb,KAAAC,MAAqB,GACrB,KAAAC,WAAY,EACZ,KAAAxa,KAAM,QAAO,OAAQ,YAEtBya,kBACL,OAAO,IAGFC,gBACF3gB,KAAK4gB,YAER5gB,KAAK4gB,UAAY,IAAItd,OAAO,qBAC5BtD,KAAK4gB,UAAU5iB,iBAAiB,WAAYZ,IAC1C,MAAMmd,EAAOnd,EAAEmd,KAGf,GADAva,KAAKiG,IAAI,qBAAsBsU,GAC5BA,GAAQA,EAAKsG,KAAM,CACpB,MAAMlI,EAAQ4B,EAAKsG,KACnB7gB,KAAK8gB,UAAU9gB,KAAKwgB,MAAMvK,QAAS0C,QAKlCoI,aACF/gB,KAAK2Z,SAER3Z,KAAK2Z,OAAS,IAAIrW,OAAO,wBACzBtD,KAAK2Z,OAAO3b,iBAAiB,WAAYZ,IACvC,MAAMmd,EAAOnd,EAAEmd,KAEfva,KAAKiG,IAAI,wBAAyBsU,GACjB,SAAdA,EAAKpb,MAENa,KAAK4gB,UAAUnF,YAAY,CAACuF,QAAS,SAElCzG,EAAK0G,WACNjhB,KAAKwgB,MAAM,GAAGS,SAAW1G,EAAK0G,WAIhCjhB,KAAK4gB,UAAUnF,YAAY,CACzBuF,QAAS,SACTE,QAAS9jB,EAAEmd,MACV,EAAA9jB,eAAYsI,EAAYwb,EAAKhgB,KAAK4mB,GAA2BA,EAAWC,cAK1EC,aAAaZ,GAClBzgB,KAAKygB,UAAYA,EACdzgB,KAAKygB,WACNzgB,KAAK+gB,aACL/gB,KAAK2gB,iBACI3gB,KAAKwgB,MAAM3mB,QACpBmG,KAAKshB,mBAIFR,UAAUxG,EAAY5Q,GACvBA,GAGFiC,aAAa2O,EAAK1O,SAClB0O,EAAKvZ,SAAS9B,QAAQ,CAAC0Z,MAAOjP,EAAQuX,SAAU3G,EAAK2G,YAHrD3G,EAAKvZ,SAASoI,OAAO,WAMpBnJ,KAAKwgB,MAAM3mB,QACZmG,KAAKuhB,eAAevhB,KAAKwgB,MAAM,IAGjCxgB,KAAKshB,mBAGAA,iBAAiBE,GAAO,KACzBxhB,KAAKygB,YAAazgB,KAAKwgB,MAAM3mB,QAAY2nB,KAE1CxhB,KAAK2Z,SACN3Z,KAAK2Z,OAAO8H,YACZzhB,KAAK2Z,OAAS,MAGb3Z,KAAK4gB,YACN5gB,KAAK4gB,UAAUa,YACfzhB,KAAK4gB,UAAY,OAIdW,eAAejH,GACpBta,KAAK2Z,OAAO8B,YAAY,CACtBuF,QAAS,OACTU,kBAAmB1hB,KAAKugB,WACxBoB,uBAAwB3hB,KAAKugB,aAG/BvgB,KAAK4gB,UAAUnF,YAAY,CACzBuF,QAAS,OACTY,YAAa,GACbC,cAAe7hB,KAAKugB,aAKpBvgB,KAAKiG,IAAI,yBACTjG,KAAK2Z,OAAO8B,YAAY,CACtBuF,QAAS,SACTc,MAAOxH,EAAKwH,MACZb,SAAU3G,EAAKyH,cACd,EAAAtrB,eAAYsI,EAAY,CAACub,EAAKwH,MAAMV,SAGzC9G,EAAK1O,QAAUnU,OAAO8R,YAAW,KAC/BvJ,KAAKiG,IAAImD,MAAM,kBAEfpJ,KAAKshB,kBAAiB,GACnBthB,KAAKwgB,MAAM3mB,SACZmG,KAAK+gB,aACL/gB,KAAK2gB,iBAGP3gB,KAAK8gB,UAAU9gB,KAAKwgB,MAAMvK,WACzB,KAGE+L,eAAeF,EAAmBC,GACvC,OAAO,IAAI/iB,SAAgB,CAACC,EAASkK,KACnC,MAAMmR,EAAO,CACXwH,MAAAA,EACAC,aAAAA,EACAhhB,SAAU,CAAC9B,QAAAA,EAASkK,OAAAA,GACpByC,QAAS,GAGX5L,KAAK+gB,aACL/gB,KAAK2gB,gBAEwB,IAA1B3gB,KAAKwgB,MAAMxmB,KAAKsgB,IACjBta,KAAKuhB,eAAejH,MAKb2H,OAAOd,EAAwBY,GAAe,G,yCACzD,OAAO/hB,KAAKgiB,eAAeb,EAAYY,GAAcnlB,MAAW8M,GAAW,EAAD,gCACxE,MAAMwY,EAAW,IAAIC,KAAK,CAACzY,EAAOiP,OAAQ,CAACxZ,KAAM,cACjD,MAAO,CAACsR,UAAW,WAAuB,kBAAmByR,GAAWjB,SAAUvX,EAAOuX,oBAM/F,0BAAsCnI,EACtC,W,sHC5KA,MAMasJ,EAAsB,w3BA4BtBC,EAAgC,IAAMD,EAAsB,OAC5DE,EAA4B,+BAC5BC,EAAcD,EAEzB,MAAQD,EAAgC,aAAeA,EAF9BC,oIAQzBD,EAAgC,IAAMD,EARbE,qBAUdD,EAAgC,IAAMD,EAVxBE,iDAYOF,EAZPE,uEAmBdE,GADuB,IAAIC,OAAO,IAAMH,EAA0BxoB,MAAM,GAAI,GAAI,KACrD,+BAG3B4oB,EAAe,IAAID,OAAO,iCAAyCF,EAAc,YAAc,IAArE,w9BAA8K,KACxMI,EAAgB,4JAEhBC,EAAmB,+JACnBC,EAA8C,CACzDC,SAAU,kCACVC,QAAS,kCACTC,UAAW,0CACX,cAAe,uCAUJC,EAA8D,CACzE,IAAK,oBACL,KAAM,mBACN,KAAM,oBACN,GAAM,sBACN,KAAM,sBACN,MAAO,yBACP,KAAM,wBAGKC,EAAqD,IAAIlsB,IAAI,CACxE,qBACA,yBACA,uBAEF,IAAI,IAAI+C,KAAKkpB,EACXC,EAA0BjsB,IAAIgsB,EAAkBlpB,IAG3C,MAAMopB,EAAuB,W,qFCwC7B,MAAMC,UAAkB,IAO7BtjB,cACEC,QAPK,KAAAsjB,KAAe,KACd,KAAAC,iBAA6D,GAQnEtjB,KAAKujB,SAAU,EAEfvjB,KAAKhC,iBAAiB,aAAa,EAAExJ,GAAAA,MACnCwL,KAAKqjB,KAAO7uB,EAAG8hB,cAGjBtW,KAAKhC,iBAAiB,4BAA6BwlB,IACjDxjB,KAAKsjB,iBAAiBE,EAAOvvB,MAAQuvB,KAGvCxjB,KAAKS,cAAgB,CAACrD,KAAMgG,KAC1BrD,MAAMU,cAAcrD,KAAMgG,GAC1B,kBAAiCgX,WAAW,QAAS,CAACnmB,KAAMmJ,EAAagG,KAAAA,KAGvE,MACFpD,KAAKhC,iBAAiB,oBAAoB,EAAE7L,SAAAA,MAC1C6N,KAAK7N,SAAWA,KAKfsxB,sBACL,OAAOzjB,KAAKsjB,iBAGPI,uBAAuBtgB,GAE5BrD,MAAMU,iBAAiB2C,IAI3B,MAAMa,EAAY,IAAImf,EACtB,eAA2Bnf,EAC3B,W,uDCvIA,MAAM2U,EAAuB,IAxCtB,MAAP,cAEU,KAAA+K,gBAAwE,GAExEC,OACN5jB,KAAK2Z,OAAS,IAAIrW,OAAO,IAAIwW,IAAI,kBACjC9Z,KAAK2Z,OAAO3b,iBAAiB,WAAYZ,IACvC,MACMya,EADOza,EAAEmd,KACM1C,QAEflS,EAAU3F,KAAK2jB,gBAAgB9L,EAAQa,UAC1C/S,IACDkS,EAAQc,MAAQhT,EAAQ1G,QAAQ4Y,EAAQc,OAAShT,EAAQwD,gBAClDnJ,KAAK2jB,gBAAgB9L,EAAQa,cAKlC+C,YAAYlB,GACfva,KAAK4jB,OACN5jB,KAAK4jB,OACL5jB,KAAK4jB,KAAO,MAGd5jB,KAAK2Z,OAAO8B,YAAYlB,GAGnBsJ,QAAQnL,EAAkBC,GAC/B,GAAG3Y,KAAK2jB,gBAAgB5M,eAAe2B,GACrC,OAAO1Y,KAAK2jB,gBAAgBjL,GAG9B,MAAMoL,GAAiB,SAIvB,OAFA9jB,KAAKyb,YAAY,CAACtc,KAAM,cAAe0Y,QAAS,CAACa,SAAAA,EAAUC,MAAAA,KAEpD3Y,KAAK2jB,gBAAgBjL,GAAYoL,IAK5C,0BAAsClL,EACtC,YC3DImL,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBllB,IAAjBmlB,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CAGjDE,QAAS,IAOV,OAHAE,EAAoBJ,GAAUK,KAAKF,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAGpEI,EAAOD,QAIfH,EAAoBO,EAAIF,EzDzBpBh0B,EAAW,GACf2zB,EAAoBQ,EAAI,CAAC9a,EAAQ+a,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAeC,EAAAA,EACnB,IAAS9qB,EAAI,EAAGA,EAAI1J,EAASwJ,OAAQE,IAAK,CAGzC,IAFA,IAAK0qB,EAAUC,EAAIC,GAAYt0B,EAAS0J,GACpC+qB,GAAY,EACPC,EAAI,EAAGA,EAAIN,EAAS5qB,OAAQkrB,MACpB,EAAXJ,GAAsBC,GAAgBD,IAAavS,OAAOT,KAAKqS,EAAoBQ,GAAGQ,OAAOloB,GAASknB,EAAoBQ,EAAE1nB,GAAK2nB,EAASM,MAC9IN,EAAS1O,OAAOgP,IAAK,IAErBD,GAAY,EACTH,EAAWC,IAAcA,EAAeD,IAG7C,GAAGG,EAAW,CACbz0B,EAAS0lB,OAAOhc,IAAK,GACrB,IAAIrB,EAAIgsB,SACE3lB,IAANrG,IAAiBgR,EAAShR,IAGhC,OAAOgR,EAvBNib,EAAWA,GAAY,EACvB,IAAI,IAAI5qB,EAAI1J,EAASwJ,OAAQE,EAAI,GAAK1J,EAAS0J,EAAI,GAAG,GAAK4qB,EAAU5qB,IAAK1J,EAAS0J,GAAK1J,EAAS0J,EAAI,GACrG1J,EAAS0J,GAAK,CAAC0qB,EAAUC,EAAIC,I0DJ/BX,EAAoBiB,EAAKb,IACxB,IAAIc,EAASd,GAAUA,EAAOe,WAC7B,IAAOf,EAAiB,QACxB,IAAM,EAEP,OADAJ,EAAoB5qB,EAAE8rB,EAAQ,CAAErsB,EAAGqsB,IAC5BA,GzDNJ30B,EAAW6hB,OAAOgT,eAAkB7O,GAASnE,OAAOgT,eAAe7O,GAASA,GAASA,EAAa,UAQtGyN,EAAoBvqB,EAAI,SAAS+G,EAAOiL,GAEvC,GADU,EAAPA,IAAUjL,EAAQR,KAAKQ,IAChB,EAAPiL,EAAU,OAAOjL,EACpB,GAAoB,iBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAPiL,GAAajL,EAAM2kB,WAAY,OAAO3kB,EAC1C,GAAW,GAAPiL,GAAoC,mBAAfjL,EAAM5D,KAAqB,OAAO4D,EAE5D,IAAI6kB,EAAKjT,OAAOpH,OAAO,MACvBgZ,EAAoBtrB,EAAE2sB,GACtB,IAAIC,EAAM,GACVh1B,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,IAAKA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAIg1B,EAAiB,EAAP9Z,GAAYjL,EAAyB,iBAAX+kB,KAAyBj1B,EAAegG,QAAQivB,GAAUA,EAAUh1B,EAASg1B,GACxHnT,OAAOoT,oBAAoBD,GAASrkB,SAASpE,GAASwoB,EAAIxoB,GAAO,IAAO0D,EAAM1D,KAI/E,OAFAwoB,EAAa,QAAI,IAAM,EACvBtB,EAAoB5qB,EAAEisB,EAAIC,GACnBD,G0DvBRrB,EAAoB5qB,EAAI,CAAC+qB,EAASsB,KACjC,IAAI,IAAI3oB,KAAO2oB,EACXzB,EAAoBhnB,EAAEyoB,EAAY3oB,KAASknB,EAAoBhnB,EAAEmnB,EAASrnB,IAC5EsV,OAAOsT,eAAevB,EAASrnB,EAAK,CAAE6oB,YAAY,EAAMre,IAAKme,EAAW3oB,MCJ3EknB,EAAoB4B,EAAI,GAGxB5B,EAAoB5mB,EAAKyoB,GACjB7mB,QAAQW,IAAIyS,OAAOT,KAAKqS,EAAoB4B,GAAGE,QAAO,CAAC5mB,EAAUpC,KACvEknB,EAAoB4B,EAAE9oB,GAAK+oB,EAAS3mB,GAC7BA,IACL,KCNJ8kB,EAAoB+B,EAAKF,KAEX,CAAC,IAAM,gBAAgB,IAAM,sBAAsB,IAAM,KAAK,IAAM,kBAAkBA,IAAYA,GAAW,IAAM,CAAC,EAAI,uBAAuB,GAAK,uBAAuB,GAAK,uBAAuB,GAAK,uBAAuB,GAAK,uBAAuB,GAAK,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,wBAAwBA,GAAW,aCF7+B7B,EAAoBgC,SAAYH,MCDhC7B,EAAoBrrB,EAAI,WACvB,GAA0B,iBAAfstB,WAAyB,OAAOA,WAC3C,IACC,OAAOjmB,MAAQ,IAAIkmB,SAAS,cAAb,GACd,MAAO9oB,GACR,GAAsB,iBAAX3F,OAAqB,OAAOA,QALjB,GCAxBusB,EAAoBhnB,EAAI,CAACuZ,EAAK4P,IAAU/T,OAAOxO,UAAUmT,eAAeuN,KAAK/N,EAAK4P,G9DA9E31B,EAAa,GACbC,EAAoB,QAExBuzB,EAAoB7qB,EAAI,CAACsX,EAAK2V,EAAMtpB,EAAK+oB,KACxC,GAAGr1B,EAAWigB,GAAQjgB,EAAWigB,GAAKzW,KAAKosB,OAA3C,CACA,IAAInI,EAAQoI,EACZ,QAAWtnB,IAARjC,EAEF,IADA,IAAIwpB,EAAUzwB,SAAS0wB,qBAAqB,UACpCxsB,EAAI,EAAGA,EAAIusB,EAAQzsB,OAAQE,IAAK,CACvC,IAAIb,EAAIotB,EAAQvsB,GAChB,GAAGb,EAAEstB,aAAa,QAAU/V,GAAOvX,EAAEstB,aAAa,iBAAmB/1B,EAAoBqM,EAAK,CAAEmhB,EAAS/kB,EAAG,OAG1G+kB,IACHoI,GAAa,GACbpI,EAASpoB,SAASC,cAAc,WAEzB2wB,QAAU,QACjBxI,EAAOrS,QAAU,IACboY,EAAoB0C,IACvBzI,EAAO9b,aAAa,QAAS6hB,EAAoB0C,IAElDzI,EAAO9b,aAAa,eAAgB1R,EAAoBqM,GACxDmhB,EAAO0I,IAAMlW,GAEdjgB,EAAWigB,GAAO,CAAC2V,GACnB,IAAIQ,EAAmB,CAACC,EAAMhrB,KAE7BoiB,EAAOzU,QAAUyU,EAAO6I,OAAS,KACjCnb,aAAaC,GACb,IAAImb,EAAUv2B,EAAWigB,GAIzB,UAHOjgB,EAAWigB,GAClBwN,EAAO+I,YAAc/I,EAAO+I,WAAWC,YAAYhJ,GACnD8I,GAAWA,EAAQ7lB,SAASwjB,GAAQA,EAAG7oB,KACpCgrB,EAAM,OAAOA,EAAKhrB,IAGlB+P,EAAUrC,WAAWqd,EAAiBM,KAAK,UAAMnoB,EAAW,CAAEI,KAAM,UAAW3B,OAAQygB,IAAW,MACtGA,EAAOzU,QAAUod,EAAiBM,KAAK,KAAMjJ,EAAOzU,SACpDyU,EAAO6I,OAASF,EAAiBM,KAAK,KAAMjJ,EAAO6I,QACnDT,GAAcxwB,SAASiM,KAAKqlB,YAAYlJ,K+DvCzC+F,EAAoBtrB,EAAKyrB,IACH,oBAAXiD,QAA0BA,OAAOC,aAC1CjV,OAAOsT,eAAevB,EAASiD,OAAOC,YAAa,CAAE7mB,MAAO,WAE7D4R,OAAOsT,eAAevB,EAAS,aAAc,CAAE3jB,OAAO,K,MCLvD,IAAI8mB,EACAtD,EAAoBrrB,EAAE4uB,gBAAeD,EAAYtD,EAAoBrrB,EAAE0K,SAAW,IACtF,IAAIxN,EAAWmuB,EAAoBrrB,EAAE9C,SACrC,IAAKyxB,GAAazxB,IACbA,EAAS2xB,gBACZF,EAAYzxB,EAAS2xB,cAAcb,MAC/BW,GAAW,CACf,IAAIhB,EAAUzwB,EAAS0wB,qBAAqB,UACzCD,EAAQzsB,SAAQytB,EAAYhB,EAAQA,EAAQzsB,OAAS,GAAG8sB,KAK7D,IAAKW,EAAW,MAAM,IAAIG,MAAM,yDAChCH,EAAYA,EAAUhwB,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpF0sB,EAAoBzqB,EAAI+tB,G,G/DbhB52B,EAAeszB,EAAoB+B,EACnCp1B,EAAgBqzB,EAAoB5mB,EACpCxM,EAAW,IAAIwgB,IACfvgB,EAAW,IAAIugB,IACnB4S,EAAoB+B,EAAI,SAAUF,GAEhC,OADan1B,EAAam1B,IAEdj1B,EAAS82B,IAAI7B,GAAW,IAAMj1B,EAAS0W,IAAIue,GAAW,KAGpE7B,EAAoB5mB,EAAI,SAAUyoB,GAEhC,OADal1B,EAAck1B,GACbhH,OAAM,SAAUzV,GAC5B,IAAIue,EAAU92B,EAAS62B,IAAI7B,GAAWh1B,EAASyW,IAAIue,GAAW,OAC9D,GAAI8B,EAAU,EAAG,CACf,IAAIC,EAAUl3B,EAAam1B,GAQ3B,MAPAzc,EAAMC,QACJ,iBACAwc,EACA,mCACA+B,EACA,IACFxe,EAAMJ,QAAU4e,EACVxe,EAER,OAAO,IAAIpK,SAAQ,SAAUC,GAC3BsK,YAAW,WACT,IAEIse,EACKr2B,KAAKC,MAGdb,EAASye,IAAIwW,EAASgC,GACtBh3B,EAASwe,IAAIwW,EAAS8B,EAAU,GAChC1oB,EAAQ+kB,EAAoB5mB,EAAEyoB,MAC7B,Y,MgEtCb7B,EAAoBprB,EAAI/C,SAASiyB,SAAWC,KAAK1kB,SAASe,KAK1D,IAAI4jB,EAAkB,CACrB,IAAK,GAGNhE,EAAoB4B,EAAEb,EAAI,CAACc,EAAS3mB,KAElC,IAAI+oB,EAAqBjE,EAAoBhnB,EAAEgrB,EAAiBnC,GAAWmC,EAAgBnC,QAAW9mB,EACtG,GAA0B,IAAvBkpB,EAGF,GAAGA,EACF/oB,EAASlF,KAAKiuB,EAAmB,QAC3B,CAGL,IAAItiB,EAAU,IAAI3G,SAAQ,CAACC,EAASkK,IAAY8e,EAAqBD,EAAgBnC,GAAW,CAAC5mB,EAASkK,KAC1GjK,EAASlF,KAAKiuB,EAAmB,GAAKtiB,GAGtC,IAAI8K,EAAMuT,EAAoBzqB,EAAIyqB,EAAoB+B,EAAEF,GAEpDzc,EAAQ,IAAIqe,MAgBhBzD,EAAoB7qB,EAAEsX,GAfF5U,IACnB,GAAGmoB,EAAoBhnB,EAAEgrB,EAAiBnC,KAEf,KAD1BoC,EAAqBD,EAAgBnC,MACRmC,EAAgBnC,QAAW9mB,GACrDkpB,GAAoB,CACtB,IAAIC,EAAYrsB,IAAyB,SAAfA,EAAMsD,KAAkB,UAAYtD,EAAMsD,MAChEyoB,EAAU/rB,GAASA,EAAM2B,QAAU3B,EAAM2B,OAAOmpB,IACpDvd,EAAMC,QAAU,iBAAmBwc,EAAU,cAAgBqC,EAAY,KAAON,EAAU,IAC1Fxe,EAAMnV,KAAO,iBACbmV,EAAMjK,KAAO+oB,EACb9e,EAAMJ,QAAU4e,EAChBK,EAAmB,GAAG7e,MAIgB,SAAWyc,EAASA,KAclE7B,EAAoBQ,EAAEO,EAAKc,GAA0C,IAA7BmC,EAAgBnC,GAGxD,IAAIsC,EAAuB,CAACC,EAA4B7N,KACvD,IAGI0J,EAAU4B,GAHTpB,EAAU4D,EAAaC,GAAW/N,EAGhBxgB,EAAI,EAC3B,GAAG0qB,EAAS8D,MAAM/zB,GAAgC,IAAxBwzB,EAAgBxzB,KAAa,CACtD,IAAIyvB,KAAYoE,EACZrE,EAAoBhnB,EAAEqrB,EAAapE,KACrCD,EAAoBO,EAAEN,GAAYoE,EAAYpE,IAGhD,GAAGqE,EAAS,IAAI5e,EAAS4e,EAAQtE,GAGlC,IADGoE,GAA4BA,EAA2B7N,GACrDxgB,EAAI0qB,EAAS5qB,OAAQE,IACzB8rB,EAAUpB,EAAS1qB,GAChBiqB,EAAoBhnB,EAAEgrB,EAAiBnC,IAAYmC,EAAgBnC,IACrEmC,EAAgBnC,GAAS,KAE1BmC,EAAgBnC,GAAW,EAE5B,OAAO7B,EAAoBQ,EAAE9a,IAG1B8e,EAAqBxoB,KAAuB,iBAAIA,KAAuB,kBAAK,GAChFwoB,EAAmBtnB,QAAQinB,EAAqBjB,KAAK,KAAM,IAC3DsB,EAAmBxuB,KAAOmuB,EAAqBjB,KAAK,KAAMsB,EAAmBxuB,KAAKktB,KAAKsB,K,GClFvF,IAAIC,EAAsBzE,EAAoBQ,OAAEzlB,EAAW,CAAC,IAAI,MAAM,IAAOilB,EAAoB,QACjGyE,EAAsBzE,EAAoBQ,EAAEiE,I","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/webpack/runtime/compat","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/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/loadFonts.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.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/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/webmSupport.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/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.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/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\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 if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\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 { AppMediaPlaybackController } from \"../components/appMediaPlaybackController\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\nimport getTimeFormat from \"../helpers/getTimeFormat\";\nimport { nextRandomUint } from \"../helpers/random\";\nimport { AutoDownloadSettings, NotifyPeer, PeerNotifySettings } from \"../layer\";\nimport { TopPeerType, MyTopPeer } from \"../lib/appManagers/appUsersManager\";\nimport DialogsStorage from \"../lib/storages/dialogs\";\nimport FiltersStorage from \"../lib/storages/filters\";\nimport { AuthState } from \"../types\";\nimport App from \"./app\";\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string, \n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst BACKGROUND_DAY_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 0,\n id: '1'\n};\n\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst BACKGROUND_NIGHT_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n intensity: 0,\n id: '-1'\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","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;","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;\r\n","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","const IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined'/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\nexport default IS_TOUCH_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = 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","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n \r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = hexa[0] === '#' ? 1 : 0;\r\n if(hexa.length === (5 + offset)) {\r\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\r\n }\r\n\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//export function findUpClassName(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className)) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n \r\n // setTimeout(() => {\r\n doubleRaf().then(() => {\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n \r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n });\r\n // }, 0);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"../schedulers/pause\";\r\n\r\nconst texts = ['b', 'б'];\r\ntype FontType = 'text' | 'icons' | 'monospace';\r\n\r\nconst cache: {\r\n [key: string]: {\r\n [text: string]: Promise\r\n }\r\n} = {};\r\n\r\nconst fonts: {[type in FontType]: string} = {\r\n text: 'Roboto',\r\n icons: 'tgico',\r\n monospace: 'Roboto Mono'\r\n};\r\n\r\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\r\n text: texts,\r\n icons: undefined,\r\n monospace: texts\r\n}): Promise {\r\n if(!('fonts' in document)) {\r\n return Promise.resolve();\r\n }\r\n \r\n const promises: Promise[] = [];\r\n for(const type in types) {\r\n let _texts = types[type as FontType];\r\n if(_texts === 'all') {\r\n _texts = texts;\r\n }\r\n\r\n const font = fonts[type as FontType];\r\n const weights = type === 'icons' ? [500] : [400, 500];\r\n for(const weight of weights) {\r\n const _promises = (_texts || [undefined]).map((text) => {\r\n const key = [weight, '1rem', font].join(' ');\r\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\r\n return promise;\r\n });\r\n promises.push(..._promises);\r\n }\r\n }\r\n\r\n return Promise.race([\r\n Promise.all(promises),\r\n pause(1000)\r\n ]);\r\n}\r\n","/*\n * 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';\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Theme } 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: Theme['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.background.highlightningColor) {\n hsla = theme.background.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: Theme['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 //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n\n [\n Worker, \n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].forEach((w) => {\n if(!w) return;\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\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 // 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 let 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 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 const authState = stateResult.state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n pause(1000), \n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n \n if(this.hasAttribute(name)) {\n if(force) return true;\n \n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n \n this.setAttribute(name, \"\");\n return true;\n };\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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\";\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\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 // 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>;\nexport default function getProxiedManagers() {\n let proxied: {\n [name in keyof T]?: ModifyFunctionsToAsync;\n } & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n };\n\n function 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\n proxied = createProxyProxy({}, false);\n\n proxied.acknowledged = createProxyProxy({}, true);\n\n return proxied;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode, \r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], \r\n log?: string, \r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\n * 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\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\",\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string, web?: boolean) {\n\t\trequestedServerLanguage = true;\n const managers = rootScope.managers;\n\t\treturn Promise.all([\n\t\t\tmanagers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: web ? 'web' : App.langPack\n\t\t\t}),\n\t\t\t!web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tmanagers.apiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n\t\treturn loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach((l) => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n\t\tif(langPack.lang_code !== currentLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach((country) => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== currentLangCode) {\n\t\t\trootScope.dispatchEvent('language_change', currentLangCode);\n\t\t\tlastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach((element) => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && 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\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'];\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n const cachedDateTimeFormats: Map = 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\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n let hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","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","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 } 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\";\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 'filters'\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 let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n 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 // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find((t) => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const, \n 'private' as const, \n 'groups' as const, \n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n });\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) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.filters = copy(STATE_INIT.filters);\n\n resetStorages.add('dialogs');\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' && \n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' && \n theme.background.type === 'image' \n ) || (\n theme.name === 'night' && \n theme.background.color === '#0f0f0f' && \n theme.background.type === 'color' \n )) {\n const newTheme = STATE_INIT.settings.themes.find((newTheme) => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n 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 { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport type { Awaited, WorkerTaskVoidTemplate } from '../../types';\nimport type { CacheStorageDbName } from '../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 isObject from '../../helpers/object/isObject';\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';\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorages',\n payload: {enabled: boolean, clearWrite: boolean}\n};\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 isSWRegistered: boolean;\n // private sockets: Map = new Map();\n private taskListenersSW: {[taskType: string]: (task: any) => void};\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n constructor() {\n super();\n\n this.isSWRegistered = true;\n this.taskListenersSW = {};\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 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\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 private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWork will do it.\n const worker = navigator.serviceWorker;\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 this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n\n const {docId, dcId, offset, limit} = task.payload;\n rootScope.managers.appDocsManager.requestDocPart(docId, dcId, offset, limit)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private registerCryptoWorker() {\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url), \n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url), \n {type: 'module'}\n );\n }\n\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n });\n\n this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\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 public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\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 public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\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 const task: ToggleStorageTask = {type: 'toggleStorages', payload: {enabled, clearWrite}};\n this.postSWMessage(task);\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport loadScript from \"../../helpers/dom/loadScript\";\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(\r\n canRedirect &&\r\n curValue?.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts\r\n ) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map((url) => {\r\n return loadScript(url).then((script) => {\r\n script.remove();\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { logger } from \"../logger\";\r\nimport apiManagerProxy from \"./mtprotoworker\";\r\nimport I18n, { LangPackKey } from \"../langPack\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appRuntimeManager from \"../appManagers/appRuntimeManager\";\r\nimport copy from \"../../helpers/object/copy\";\r\nimport type { NotificationSettings } from \"../appManagers/uiNotificationsManager\";\r\nimport singleInstance from \"./singleInstance\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport type { PushNotificationObject } from \"../serviceWorker/push\";\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager extends EventListenerBase<{\r\n push_notification_click: (n: PushNotificationObject) => void,\r\n push_init: (n: PushSubscriptionNotify) => void,\r\n push_subscribe: (n: PushSubscriptionNotify) => void,\r\n push_unsubscribe: (n: PushSubscriptionNotify) => void\r\n}> {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n super(false);\r\n\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n \r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\r\n\r\n const lang: ServiceWorkerPingTask['payload']['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManagerProxy.postSWMessage(task);\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManagerProxy.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManagerProxy.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(singleInstance.deactivatedReason) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n this.dispatchEvent('push_notification_click', task.payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n \r\n this.log.warn('Push', event, subscriptionObj);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport IS_OPUS_SUPPORTED from \"../environment/opusSupport\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { Modify } from \"../types\";\r\nimport { logger, LogTypes } from \"./logger\";\r\nimport apiManagerProxy from \"./mtproto/mtprotoworker\";\r\nimport type { ConvertWebPTask } from \"./webp/webpWorkerController\";\r\n\r\ntype Result = {\r\n bytes: Uint8Array, \r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport interface ConvertOpusTask extends Modify {\r\n type: 'convertOpus'\r\n}\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker: Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n return IS_OPUS_SUPPORTED;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n \r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n //this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n //this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n \r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({ \r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({ \r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n //console.log('sending command to worker:', task);\r\n //setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n //}, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \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(let 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\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 { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall } from \"../layer\";\nimport type { AppMessagesManager, Dialog, 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 { 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\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, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {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 '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_recent': MyDocument[],\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, 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': string,\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': string,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\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 = NULL_PEER_ID;\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.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\r\nimport { WorkerTaskVoidTemplate } from '../../types';\r\n\r\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n \r\n private init() {\r\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\r\n this.worker.addEventListener('message', (e) => {\r\n const task = e.data as ConvertWebPTask;\r\n const payload = task.payload;\r\n\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n });\r\n }\r\n\r\n private postMessage(data: ConvertWebPTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","// 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\":\"15a67f69d99bd6da42da\",\"25\":\"7268088042b01ecb2f03\",\"27\":\"0409c6d29d5c2ee62ee6\",\"53\":\"6410540cf22127bc7705\",\"61\":\"37d7af7b4663f378384c\",\"77\":\"808c5b447b007ee7aa9d\",\"104\":\"637ee92c4436d936af0a\",\"106\":\"e317337dd2e7c9940c22\",\"126\":\"25016da268c3c399afac\",\"301\":\"908ec7163f3671b91bdb\",\"339\":\"6f9573a4830d89de5c12\",\"392\":\"8a7508144c4d4d66df01\",\"436\":\"66de9e85049775fcc1d9\",\"437\":\"613a8ab2d0385dea0bb4\",\"442\":\"7c20450a077c518900a1\",\"458\":\"b31331308efe622d392d\",\"589\":\"6e8ad0f36f5d4772b86c\",\"591\":\"02c6c72707bff66682b2\",\"630\":\"5c8af6e9c411419a66e1\",\"641\":\"be55089deabe08a3e958\",\"642\":\"f2d4e67ea15d5329cd0b\",\"665\":\"bd7f059d45a21bedf74a\",\"670\":\"bdb55a9321cdc95dda81\",\"678\":\"d4c394cfcd75943f854f\",\"709\":\"c86dad481a67083f516b\",\"725\":\"12c1ba16de4c3fac7523\",\"765\":\"e78c17ede1cf4eff6bac\",\"774\":\"04c4656f821730d3e97b\",\"781\":\"a117406973cdcf8db64d\",\"810\":\"3054249999128f0d7a84\"}[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;","__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, [960,740], () => (__webpack_require__(6873)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","oldGetScript","oldLoadScript","queryMap","countMap","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","document","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","window","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","s","l","d","hslaToRgba","hue2rgb","p","q","t","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","map","v","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","texts","cache","fonts","text","icons","monospace","loadFonts","types","undefined","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","workerHandler","construct","args","location","Worker","SharedWorker","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","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","elem","promise","opacity","state","appVersion","lang_code","console","log","pagePromise","placeholder","prepend","append","cloneNode","meModule","pushModule","default","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","proxied","createProxyProxy","ack","get","receiver","method","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","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","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","hash","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","set","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","url","wrappedUrl","onclick","textContent","arg","pushNextArgument","plain","str","select","item","Node","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","filter","Boolean","_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","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","hasOwnProperty","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","k_build","ApiManagerProxy","onMirrorTask","payload","mirrors","mirror","isSWRegistered","taskListenersSW","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","worker","serviceWorker","register","URL","scope","registration","installing","waiting","active","invokeVoid","controller","task","data","isObject","addServiceWorkerTaskListener","responseTask","docId","dcId","limit","uploadFile","postSWMessage","originalPayload","cryptoMessagePort","source","ports","attachWorkerToPort","onWorkerFirstMessage","messagePort","port","attachPort","postMessage","loadState","sendState","userId","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","tgme_sync","path","encodeURIComponent","script","remove","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","catch","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","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","Blob","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","Telegram","Twitter","Instagram","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","RootScope","myId","connectionStatus","premium","status","getConnectionStatus","dispatchEventSingle","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","u","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","src","onScriptComplete","prev","onload","doneFns","parentNode","removeChild","bind","appendChild","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","has","retries","realSrc","cacheBust","baseURI","self","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.400f0f28cc15cf642401.bundle.js b/public/main.400f0f28cc15cf642401.bundle.js new file mode 100644 index 000000000..6d5b3a026 --- /dev/null +++ b/public/main.400f0f28cc15cf642401.bundle.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,s,i,o,a,r,c,l={236:(e,t,n)=>{n.d(t,{h:()=>c});var s=n(4762),i=n(144),o=n(4159);const a=o.Z.version,r=o.Z.build,c={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],topPeersCache:{},recentSearch:[],version:a,build:r,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:[{name:"day",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:0,id:"1"}:{blur:!1,slug:"pattern",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:50,id:"1"}},{name:"night",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)",intensity:0,id:"-1"}:{blur:!1,slug:"pattern",color:"#fec496,#dd6cb9,#962fbf,#4f5bd5",highlightningColor:"hsla(299.142857, 44.166666%, 37.470588%, .4)",intensity:-50,id:"-1"}}],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:()=>a});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),a=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:()=>s});const s="undefined"!=typeof SharedWorker},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:()=>a,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>r,IS_FIREFOX:()=>u,IS_MOBILE:()=>h,IS_MOBILE_SAFARI:()=>d,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),a=-1!==navigator.userAgent.toLowerCase().indexOf("android"),r=/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"))),u=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=l&&c,h=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},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 a,r;const c=(i+o)/2;if(i===o)a=r=0;else{const s=i-o;switch(r=c>.5?s/(2-i-o):s/(i+o),i){case e:a=(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},r=n<.5?n*(1+t):n+t-n*t,c=2*n-r;i=s(c,r,e+1/3),o=s(c,r,e),a=s(c,r,e-1/3)}return[Math.round(255*i),Math.round(255*o),Math.round(255*a),Math.round(255*s)]}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:()=>r,dI:()=>s,oo:()=>a,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(){return!(!document.activeElement||!document.activeElement.blur||(document.activeElement.blur(),0))}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e=e||window.event){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:()=>r,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),a=n(5494);const r=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(r){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],a=t-o,r=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,u=r?Math.round(r+i.clientHeight+a):r+a;(c===l||u>=c||u<=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,a.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,a.Z)(document.activeElement)}),{passive:!0})}function c(e){r&&e.classList.add("is-sticky-input-bugged")}},4541:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5418);const i=["b","б"],o={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function r(e={text:i,icons:void 0,monospace:i}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=i);const r=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,i,a;const c=[e,"1rem",r].join(" ");return null!==(s=(i=null!==(n=o[c])&&void 0!==n?n:o[c]={})[a=t||""])&&void 0!==s?s:i[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t),(0,s.Z)(1e3)])}},2586:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class a 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 r=new a},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:()=>u});let o,a,r=!1;function c(e){o?r?e():o.push(e):(o=[e],requestAnimationFrame((()=>{r=!0;for(let e=0;ei((()=>e())))),a.then((()=>{a=void 0})),a)}function u(){return new Promise((e=>{i((()=>{i(e)}))}))}},6714:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(5432),i=n(3512),o=n(2064);const a=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(){let e;const t=a.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&e&&(a.themeColor=(0,o.K5)(e))}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))}},r=a},6873:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),a=n(8090),r=n(4541),c=n(9976),l=n(4762),u=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 d=n(3512),h=n(5432),g=n(2325),m=(n(4110),n(690),n(3789)),f=n(2554),v=n(6714),p=n(3815),b=n(490);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,S=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)}),d.Z.managers=(0,f.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,y=!1;const S=()=>{const n=.01*(y&&!p.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",S),S(),a.T){const t=()=>{y=1===n&&a.T&&!p.Z.isOverlayActive,S(),e!==window&&(y?(window.removeEventListener("resize",S),e.addEventListener("resize",S)):(e.removeEventListener("resize",S),window.addEventListener("resize",S)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},p.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})),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");const w=performance.now(),P=g.ZP.getCacheLangPack(),[k,E]=yield Promise.all([m.Z.sendState().then((([e])=>e)),P]);function A(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(k.state.settings.timeFormat),v.Z.setThemeListener(),E.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(E.lang_code),console.log("got state, time:",performance.now()-w);const _=k.state.authState;if("authStateSignedIn"!==_._){console.log("Will mount auth page:",_._,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,5228)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(_._){case"authStateSignIn":s=(yield Promise.all([n.e(458),n.e(725),n.e(661),n.e(665),n.e(709),n.e(810)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(725),n.e(661),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(458),n.e(725),n.e(661),n.e(665),n.e(709),n.e(106)]).then(n.bind(n,6392))).default.mount(_.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(458),n.e(725),n.e(661),n.e(442)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(458),n.e(725),n.e(661),n.e(765),n.e(25)]).then(n.bind(n,8339))).default.mount(_.authCode)}t&&(s&&(yield s),A(t,"fonts"in document?Promise.race([(0,u.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),A(document.getElementById("main-columns"),(0,r.Z)()),(yield Promise.all([n.e(725),n.e(661),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((y=void 0)||(y=Promise))((function(n,s){function i(e){try{a(S.next(e))}catch(e){s(e)}}function o(e){try{a(S.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof y?t:new y((function(e){e(t)}))).then(i,o)}a((S=S.apply(e,t||[])).next())}));var e,t,y,S}))},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:()=>i});var s=n(3789);function i(){let e;function t(e,t){return new Proxy(e,{get:(e,n,i)=>{var o;return null!==(o=e[n])&&void 0!==o?o:e[n]=function(e,t){return new Proxy({},{get:(n,i,o)=>(...n)=>s.Z.invoke("manager",{name:e,method:i,args:n},t)})}(n,t)}})}return e=t({},!1),e.acknowledged=t({},!0),e}},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),a=n(5003);class r{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,a.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),r.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 a=!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),!a&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(a=!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 r(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}r.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,a.kg)(["IDB",e.name,t].join("-")),this.idb=r.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(((a,r)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(h),r(c.error)},u=()=>{clearTimeout(h),n&&this.log(n+": end",performance.now()-i);const e=f.map((e=>e.result));a(m?e:e[0])};c.onerror=l;const d="readwrite"===e;d&&(c.oncomplete=()=>u());const h=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),f=m?g:[].concat(g);if(d)return;const v=f.length;let p=v;const b=()=>{c.error||--p||u()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>y,A1:()=>S,Hz:()=>g,XZ:()=>b,ZP:()=>v,ag:()=>p,nK:()=>m,v_:()=>w});var s=n(410),i=n(7922),o=n(4159),a=n(3512),r=n(4762),c=n(6848),l=n(5953),u=n(9005),d=n(6637),h=n(3591);const g={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"},m=r.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,r;function g(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function m(){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 g(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 p(t.default,i),p(n.default,i),b({_:"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=a.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:s?"web":o.Z.langPack}),!s&&i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"android"}),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 p(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 b(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(y(e),e)))}function y(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&&(a.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),m()),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,a,r,c,l,u)=>{if(s.push(u.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...S(a,t,n)),s.push(e)}else if(r)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 a;if(o&&(0,d.Z)(o)){a=document.createElement("a");const e=(0,h.Z)(o);a.href=e.url,e.onclick&&a.setAttribute("onclick",e.onclick),a.target="_blank"}else a=t[n.i++],a instanceof DocumentFragment&&(a=a.firstChild),a.textContent="";a.append(...S(i,t,n)),s.push(a)}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 w(n,s=!1,i){const o=e.strings.get(n);let a;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),a=o[t.select(e)+"_value"]||o.other_value}else a="langPackString"===o._?o.value:n;else a=n;const r=S(a,i);return s?r.map((e=>e instanceof Node?e.textContent:e)).join(""):r}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.getCacheLangPack=function(){return r||(r=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||g(t.lang_code),y(t),t):f())).finally((()=>{r=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,m(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof _&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=v,e.getStrings=function(e,t){return a.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return g(e),v(e,t).then((([e,t,n,s,i,o])=>{let a=[];return[n,s].forEach((e=>{p(e.default,a)})),a=a.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=a,e.countries=i,b(e)}))},e.saveLangPack=b,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=y,e.superFormatter=S,e.format=w,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 k 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(...w(this.key,!1,this.args));else{const e=this.element[this.property],t=w(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=k;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 _ extends P{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}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,u.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=_,e.i18n=function(e,t){return new k({key:e,args:t}).element},e.i18n_=function(e){return new k(e).element},e._i18n=function(e,t,n,s){return new k({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const v=f,p=f.i18n,b=f.i18n_,y=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):p(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{DZ:()=>h,IA:()=>o,Iw:()=>l,J$:()=>u,NM:()=>s,Zi:()=>d,gZ:()=>c,hj:()=>i,rU:()=>r,yF:()=>a});const s=0,i=1271266957,o=777,a=777e3,r=2147483647,c="",l=20971520,u=0,d=1,h=new Set([u,d]);Math.max(...Array.from(h))},3789:(e,t,n)=>{n.d(t,{Z:()=>ne});var s=n(3512),i=n(7730),o=n(410),a=n(7487),r=n(6702),c=n(1722),l=n(5228),u=n(5418),d=n(993),h=n(7328),g=n(6663),m=n(9976),f=n(3731),v=n(6818),p=n(1174),b=n(2341),y=n(9030),S=n(2365),w=n(2820),P=n(5432),k=n(2131),E=n(554),A=n(4762);const _=!!document.createElement("video").canPlayType("video/webm")&&!A.IS_SAFARI&&!A.IS_APPLE_MOBILE;var Z=n(5269),I=n(4089),C=n(5783),L=n(2045),O=n(8189);const T=Object.assign({CAN_USE_TRANSFERABLES:h.Z,IS_APPLE_MX:O.Z,IS_CALL_SUPPORTED:d.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:f.Z,IS_GROUP_CALL_SUPPORTED:v.Z,IS_MOV_SUPPORTED:y.Z,IS_PARALLAX_SUPPORTED:S.Z,IS_SCREEN_SHARING_SUPPORTED:w.Z,IS_TOUCH_SUPPORTED:P.Z,IS_VIBRATE_SUPPORTED:k.Z,IS_OPUS_SUPPORTED:C.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:_,IS_WEBP_SUPPORTED:Z.Z,IS_WEBRTC_SUPPORTED:I.Z,IMAGE_MIME_TYPES_SUPPORTED:p.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:E.Z},A);var M=n(4159),D=n(236),R=n(6009),W=n(8479),x=n(946),N=n(7922),U=n(5466),F=n(5003);const j=D.h.version,B=D.h.build,V=Object.keys(D.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(a.Z.get("user_auth"),"auth"),n(a.Z.get("state_id"),"auth"),n(a.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),r=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{u[e]=t,c.push(e)};let u={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof d||"string"==typeof d?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:d.toPeerId(!1)}:d);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield a.Z.set(n)}d&&(u.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof d||"string"==typeof d?{dcID:0,date:Date.now()/1e3|0,id:d.toPeerId(!1)}:d));const f=new Set;if(u.stateId!==h){if(void 0!==h){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,W.Z)(u[n]))})),u=(0,W.Z)(D.h),e.forEach(((e,t)=>{u[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)f.add(e);v=u,c.length=0,u=v,c.push(...Object.keys(u))}yield a.Z.set({state_id:u.stateId})}var v;const p=Date.now();if(u.stateCreatedTime+864e5{l(e,(0,W.Z)(D.h[e]))}))),!u.settings.hasOwnProperty("theme")&&u.settings.hasOwnProperty("nightTheme")&&(u.settings.theme=u.settings.nightTheme?"night":"day",l("settings",u.settings)),!u.settings.hasOwnProperty("themes")&&u.settings.background){u.settings.themes=(0,W.Z)(D.h.settings.themes);const e=u.settings.themes.find((e=>e.name===u.settings.theme));e&&(e.background=u.settings.background,l("settings",u.settings))}const b=u.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",u.settings)}let y,S;if((0,x.Z)(D.h,u,(e=>{l(e,u[e])})),u.version!==j||u.build!==B){if((-1===(0,R.Z)(u.version,"0.8.7")||u.build<179)&&(u.allDialogsLoaded=(0,W.Z)(D.h.allDialogsLoaded),f.add("dialogs")),-1===(0,R.Z)(u.version,"1.3.0")){let e=!1;u.settings.themes.forEach(((t,n,s)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const i=D.h.settings.themes.find((e=>e.name===t.name));i&&(s[n]=(0,W.Z)(i),e=!0)}})),e&&l("settings",u.settings)}0!==(0,R.Z)(u.version,j)&&(y=j,S=u.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 a=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete a[i]:a[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})=>$.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return a.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,J.Z)(!1,!0),a.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,u.Z)(3e3)]),r.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),X.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(X.Z.isIdle),this.log("Passing environment:",T),this.invoke("environment",T)}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]])}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return Q(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=yield(o=s.url,fetch(o).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 o;const a=(yield this.invoke("createProxyWorkerURLs",i)).map((e=>new(L.Z?SharedWorker:Worker)(e,{type:"module"})));Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),a.forEach((e=>{this.attachWorkerToPort(e,Y.Z,"crypto")}))}))}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!=q?q:q=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 Q(this,void 0,void 0,(function*(){yield(0,J.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return Q(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 te=new ee;o.GO.apiManagerProxy=te;const ne=te},490:(e,t,n)=>{n.d(t,{Z:()=>v});var s=n(4159),i=n(410),o=n(2219),a=n(2045),r=n(3241),c=n(2586),l=n(5003),u=n(3512),d=n(7487),h=n(3789);const g=a.Z;class m extends r.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),d.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([d.Z.get("xt_instance",!1),d.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,u.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void h.Z.toggleStorages(!1,!1);g?d.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 a(e){try{c(o.next(e))}catch(e){s(e)}}function r(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(a,r)}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 f=new m;i.GO&&(i.GO.singleInstance=f);const v=f},5228:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>l,default:()=>d});var s=n(4159),i=n(410),o=n(1267),a=n(5659),r=n(7298),c=n(7487);class l{constructor(){this.disabled=o.Z.test||-1===s.Z.domains.indexOf(location.hostname)}setAuthorized(e){if(!this.disabled)return c.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;c.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=>(0,a.Z)(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const u=new l;i.GO&&(i.GO.telegramMeWebManager=u);const d=u},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>h,default:()=>m});var s=n(410),i=n(5003),o=n(3789),a=n(2325),r=n(4762),c=n(1722),l=n(8479),u=n(490),d=n(3241);class h extends d.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||u.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:r.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:r.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=a.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=>{u.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:()=>u});var s=n(410),i=n(5783),o=n(4762),a=n(5003),r=n(3789),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function a(e){try{c(s.next(e))}catch(e){o(e)}}function r(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(a,r)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,a.kg)("OPUS",a.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 r.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const u=l},2423:(e,t,n)=>{n.d(t,{$2:()=>l,E:()=>u,Hk:()=>h,QB:()=>d,SC:()=>g,bu:()=>c,it:()=>r,kO:()=>f,tY:()=>m});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="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",r=a+"(?:"+o+"{1,64}(?::"+o+"{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}|"+o+"["+i+"·0-9-]{0,64}(?:\\."+o+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",c=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),l=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+r+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_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]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),u=/^(([^<>()[\]\\.,;:\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,}))$/,d=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={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}"},g={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},m=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in g)m.add(g[e]);const f=/^\+\d+$/},3512:(e,t,n)=>{n.d(t,{Z:()=>u});var s=n(1507),i=n(3241),o=n(410),a=n(3206),r=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",(e=>{this.premium=e})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),a.Z.getInstance().invokeVoid("event",{name:e,args:t})},r.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const u=l},7730:(e,t,n)=>{n.d(t,{Z:()=>a});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 a=o}},u={};function d(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return l[e].call(n.exports,n,n.exports,d),n.exports}d.m=l,e=[],d.O=(t,n,s,i)=>{if(!n){var o=1/0;for(l=0;l=i)&&Object.keys(d.O).every((e=>d.O[e](n[r])))?n.splice(r--,1):(a=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[n,s,i]},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.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);d.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var a=2&s&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,d.d(i,o),i},d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce(((t,n)=>(d.f[n](e,t),t)),[])),d.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"2f5d5f4973ca9d0d4616",25:"481fbe1a27468243ce6c",53:"64ea484cf91c9ae29792",61:"9c41f4a95f7a1c80dfdb",77:"808c5b447b007ee7aa9d",104:"6cbeda302cb4e61b3268",106:"6eb2d4df03e16a5c7742",292:"fd1c65cea6105dcd77a3",301:"ffb4a949577b521c6089",339:"10c5e684562141ca65db",392:"c5f7e9130471b94d2250",436:"9cbf04ee8ad06e3a5339",442:"43a09c275fa800a5a70a",458:"05455564683cc3681625",589:"2a79612de974833cfd09",630:"5c8af6e9c411419a66e1",641:"44a7297520d91123114d",642:"97f14a340993585fd1ff",661:"93c62f6378053baa4749",665:"36cc8e85c02a51d78eff",670:"02a19ec38e23a6d6a681",678:"8a161a7807437aff19b2",709:"77e1421caf56d9ff127a",725:"3353d4069deb997f1a89",765:"439d96cf9275d8e367ac",774:"dfdd32ba1b66733e84bc",781:"bf470a21924f5738e502",810:"67da4e1ee7f6571792cd",836:"c6892c261234c713a6ec",911:"4ab2cba0db01b5782509"}[e]+".chunk.js"),d.miniCssF=e=>{},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",d.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var a,r;if(void 0!==n)for(var c=document.getElementsByTagName("script"),l=0;l{a.onerror=a.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],a.parentNode&&a.parentNode.removeChild(a),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=h.bind(null,a.onerror),a.onload=h.bind(null,a.onload),r&&document.head.appendChild(a)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;d.g.importScripts&&(e=d.g.location+"");var t=d.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(/\/[^\/]+$/,"/"),d.p=e})(),o=d.u,a=d.e,r=new Map,c=new Map,d.u=function(e){return o(e)+(r.has(e)?"?"+r.get(e):"")},d.e=function(e){return a(e).catch((function(t){var n=c.has(e)?c.get(e):999999;if(n<1){var s=o(e);throw t.message="Loading chunk "+e+" failed after 999999 retries.\n("+s+")",t.request=s,t}return new Promise((function(t){setTimeout((function(){var s=Date.now();r.set(e,s),c.set(e,n-1),t(d.e(e))}),3e3)}))}))},(()=>{d.b=document.baseURI||self.location.href;var e={179:0};d.f.j=(t,n)=>{var s=d.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=d.p+d.u(t),a=new Error;d.l(o,(n=>{if(d.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;a.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",a.name="ChunkLoadError",a.type=i,a.request=o,s[1](a)}}),"chunk-"+t,t)}},d.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,a,r]=n,c=0;if(o.some((t=>0!==e[t]))){for(s in a)d.o(a,s)&&(d.m[s]=a[s]);if(r)var l=r(d)}for(t&&t(n);cd(6873)));h=d.O(h)})(); +//# sourceMappingURL=main.400f0f28cc15cf642401.bundle.js.map \ No newline at end of file diff --git a/public/main.400f0f28cc15cf642401.bundle.js.map b/public/main.400f0f28cc15cf642401.bundle.js.map new file mode 100644 index 000000000..02a7a7664 --- /dev/null +++ b/public/main.400f0f28cc15cf642401.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.400f0f28cc15cf642401.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/webpack/runtime/compat","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/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/loadFonts.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.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/webmSupport.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/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.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/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\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 if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\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 {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, NotifyPeer, PeerNotifySettings} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n 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 topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst BACKGROUND_DAY_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 0,\n id: '1'\n};\n\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst BACKGROUND_NIGHT_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n intensity: 0,\n id: '-1'\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","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 */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;\r\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","const IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined'/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\nexport default IS_TOUCH_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nconst VIDEO_MIME_TYPES_SUPPORTED = 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","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h: number, s: number;\r\n const l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n const d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch(max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n\r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = hexa[0] === '#' ? 1 : 0;\r\n if(hexa.length === (5 + offset)) {\r\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\r\n }\r\n\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// export function findUpClassName(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className))\r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {doubleRaf} from '../schedulers';\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n\r\n // setTimeout(() => {\r\n doubleRaf().then(() => {\r\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n\r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n });\r\n // }, 0);\r\n}\r\n","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from '../schedulers/pause';\r\n\r\nconst texts = ['b', 'б'];\r\ntype FontType = 'text' | 'icons' | 'monospace';\r\n\r\nconst cache: {\r\n [key: string]: {\r\n [text: string]: Promise\r\n }\r\n} = {};\r\n\r\nconst fonts: {[type in FontType]: string} = {\r\n text: 'Roboto',\r\n icons: 'tgico',\r\n monospace: 'Roboto Mono'\r\n};\r\n\r\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\r\n text: texts,\r\n icons: undefined,\r\n monospace: texts\r\n}): Promise {\r\n if(!('fonts' in document)) {\r\n return Promise.resolve();\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const type in types) {\r\n let _texts = types[type as FontType];\r\n if(_texts === 'all') {\r\n _texts = texts;\r\n }\r\n\r\n const font = fonts[type as FontType];\r\n const weights = type === 'icons' ? [500] : [400, 500];\r\n for(const weight of weights) {\r\n const _promises = (_texts || [undefined]).map((text) => {\r\n const key = [weight, '1rem', font].join(' ');\r\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\r\n return promise;\r\n });\r\n promises.push(..._promises);\r\n }\r\n }\r\n\r\n return Promise.race([\r\n Promise.all(promises),\r\n pause(1000)\r\n ]);\r\n}\r\n","/*\n * 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';\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport {NoneToVoidFunction} from '../types';\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Theme} 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: Theme['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.background.highlightningColor) {\n hsla = theme.background.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: Theme['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","/*\n * 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';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\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 // 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 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 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 const authState = stateResult.state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n\n }\n\n let pagePromise: Promise;\n // langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn':\n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr':\n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n // });\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ?\n Promise.race([\n pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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';\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\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 // 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>;\nexport default function getProxiedManagers() {\n let proxied: {\n [name in keyof T]?: ModifyFunctionsToAsync;\n } & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n };\n\n function 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\n proxied = createProxyProxy({}, false);\n\n proxied.acknowledged = createProxyProxy({}, true);\n\n return proxied;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport Modes from '../../config/modes';\r\nimport makeError from '../../helpers/makeError';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport {logger} from '../logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string,\r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n\r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n\r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n\r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n\r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n\r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n\r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n // return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n\r\n reader.onerror = reject;\r\n });\r\n\r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n\r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n // return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode,\r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\r\n log?: string,\r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n\r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n\r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\n * 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';\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\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 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 }\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDialogFilter} from '../storages/filters';\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\nexport type REAL_FOLDER_ID = 0 | 1;\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\n\r\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\r\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\r\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\r\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\r\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","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} 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';\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 // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find((t) => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n });\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) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n // state.filters = copy(STATE_INIT.filters);\n\n resetStorages.add('dialogs');\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' &&\n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' &&\n theme.background.type === 'image'\n ) || (\n theme.name === 'night' &&\n theme.background.color === '#0f0f0f' &&\n theme.background.type === 'color'\n )) {\n const newTheme = STATE_INIT.settings.themes.find((newTheme) => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n 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';\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 serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\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 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 \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 blob = await get((worker as any).url);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', blob);\n const workers = urlsPromise.map((url) => {\n return new (IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker)(url, {type: 'module'});\n });\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 workers.forEach((worker) => {\n this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n });\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../config/app';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport Modes from '../../config/modes';\r\nimport loadScript from '../../helpers/dom/loadScript';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(\r\n canRedirect &&\r\n curValue?.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts\r\n ) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect,\r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map((url) => {\r\n return loadScript(url).then((script) => {\r\n script.remove();\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {PushNotificationObject} from '../serviceWorker/push';\r\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\r\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {logger} from '../logger';\r\nimport apiManagerProxy from './mtprotoworker';\r\nimport I18n, {LangPackKey} from '../langPack';\r\nimport {IS_MOBILE} from '../../environment/userAgent';\r\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\r\nimport copy from '../../helpers/object/copy';\r\nimport singleInstance from './singleInstance';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager extends EventListenerBase<{\r\n push_notification_click: (n: PushNotificationObject) => void,\r\n push_init: (n: PushSubscriptionNotify) => void,\r\n push_subscribe: (n: PushSubscriptionNotify) => void,\r\n push_unsubscribe: (n: PushSubscriptionNotify) => void\r\n}> {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n super(false);\r\n\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\r\n\r\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n });\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\r\n if(singleInstance.deactivatedReason) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n this.dispatchEvent('push_notification_click', payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n\r\n this.log.warn('Push', event, subscriptionObj);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\r\nimport {IS_SAFARI} from '../environment/userAgent';\r\nimport {Modify} from '../types';\r\nimport {logger, LogTypes} from './logger';\r\nimport apiManagerProxy from './mtproto/mtprotoworker';\r\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\r\n\r\ntype Result = {\r\n bytes: Uint8Array,\r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport interface ConvertOpusTask extends Modify {\r\n type: 'convertOpus'\r\n}\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker: Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n return IS_OPUS_SUPPORTED;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n // this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n // this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n\r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({\r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({\r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n // console.log('sending command to worker:', task);\r\n // setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n // }, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\r\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\r\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \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 {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config} from '../layer';\nimport type {AppMessagesManager, Dialog, 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 {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';\nimport {MTAppConfig} from './mtproto/appConfig';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': 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 '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 '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,\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': string,\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': string,\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\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', (isPremium) => {\n this.premium = isPremium;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport {WorkerTaskVoidTemplate} from '../../types';\r\n\r\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\r\n type: 'convertWebp',\r\n payload: {\r\n fileName: string,\r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n\r\n private init() {\r\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\r\n this.worker.addEventListener('message', (e) => {\r\n const task = e.data as ConvertWebPTask;\r\n const payload = task.payload;\r\n\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n });\r\n }\r\n\r\n private postMessage(data: ConvertWebPTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n\r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;\n","// 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\":\"2f5d5f4973ca9d0d4616\",\"25\":\"481fbe1a27468243ce6c\",\"53\":\"64ea484cf91c9ae29792\",\"61\":\"9c41f4a95f7a1c80dfdb\",\"77\":\"808c5b447b007ee7aa9d\",\"104\":\"6cbeda302cb4e61b3268\",\"106\":\"6eb2d4df03e16a5c7742\",\"292\":\"fd1c65cea6105dcd77a3\",\"301\":\"ffb4a949577b521c6089\",\"339\":\"10c5e684562141ca65db\",\"392\":\"c5f7e9130471b94d2250\",\"436\":\"9cbf04ee8ad06e3a5339\",\"442\":\"43a09c275fa800a5a70a\",\"458\":\"05455564683cc3681625\",\"589\":\"2a79612de974833cfd09\",\"630\":\"5c8af6e9c411419a66e1\",\"641\":\"44a7297520d91123114d\",\"642\":\"97f14a340993585fd1ff\",\"661\":\"93c62f6378053baa4749\",\"665\":\"36cc8e85c02a51d78eff\",\"670\":\"02a19ec38e23a6d6a681\",\"678\":\"8a161a7807437aff19b2\",\"709\":\"77e1421caf56d9ff127a\",\"725\":\"3353d4069deb997f1a89\",\"765\":\"439d96cf9275d8e367ac\",\"774\":\"dfdd32ba1b66733e84bc\",\"781\":\"bf470a21924f5738e502\",\"810\":\"67da4e1ee7f6571792cd\",\"836\":\"c6892c261234c713a6ec\",\"911\":\"4ab2cba0db01b5782509\"}[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;","__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, [437,21], () => (__webpack_require__(6873)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","oldGetScript","oldLoadScript","queryMap","countMap","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","document","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","window","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","s","l","d","hslaToRgba","hue2rgb","p","q","t","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","map","v","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","texts","cache","fonts","text","icons","monospace","loadFonts","types","undefined","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setAttribute","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","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","elem","promise","opacity","state","appVersion","lang_code","console","log","pagePromise","placeholder","prepend","append","cloneNode","meModule","pushModule","default","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","proxied","createProxyProxy","ack","get","receiver","method","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","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","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","hash","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","set","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","str","select","item","Node","Map","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","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","hasOwnProperty","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","k_build","ApiManagerProxy","onMirrorTask","payload","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","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","originals","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","workers","cryptoMessagePort","attachWorkerToPort","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","userId","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","tgme_sync","path","encodeURIComponent","script","remove","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","catch","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","data","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","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","RootScope","myId","connectionStatus","premium","isPremium","status","getConnectionStatus","dispatchEventSingle","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","u","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","src","onScriptComplete","prev","onload","doneFns","parentNode","removeChild","bind","appendChild","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","has","retries","realSrc","cacheBust","baseURI","self","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.c93ffbcdcd27accf9d40.css b/public/main.c93ffbcdcd27accf9d40.css new file mode 100644 index 000000000..0a565091a --- /dev/null +++ b/public/main.c93ffbcdcd27accf9d40.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;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}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;-ms-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{left:50%;position:absolute!important;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)}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:.25s 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:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s 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-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-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:1.3125;--line-height-20:23px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--esg-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;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--peer-avatar-red-top:#ff885e;--peer-avatar-red-bottom:#ff516a;--peer-avatar-orange-top:#ffcd6a;--peer-avatar-orange-bottom:#ffa85c;--peer-avatar-violet-top:#82b1ff;--peer-avatar-violet-bottom:#665fff;--peer-avatar-green-top:#a0de7e;--peer-avatar-green-bottom:#54cb68;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#72d5fd;--peer-avatar-blue-bottom:#2a9ef1;--peer-avatar-pink-top:#e0a2f3;--peer-avatar-pink-bottom:#d669ed;--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;--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-text-color:#000;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-blue-top);--avatar-color-bottom:var(--peer-avatar-blue-bottom);--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);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-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-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-audio-play-button-color:#fff;--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-text-color:#fff;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-violet-top);--avatar-color-bottom:var(--peer-avatar-violet-bottom);--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-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--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:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?h1cbu) format("truetype"),url(assets/fonts/tgico.woff?h1cbu) format("woff"),url(assets/fonts/tgico.svg?h1cbu#tgico) format("svg")}.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-family:tgico!important;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-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-help: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-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-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools: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}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;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;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}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;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;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}:-ms-input-placeholder{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{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@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){.input-search{margin-left:1rem}}.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);max-height:var(--height)!important;min-height:var(--height)!important;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:-ms-input-placeholder~.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:24px;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}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{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{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;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,background-color .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.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;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.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{-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%,.75);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%;transform:scale(.8)!important;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{-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{--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;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-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;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;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}.btn-menu-item{--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);cursor:pointer!important;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:0 .3125rem;padding:0 var(--padding-right) 0 var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}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{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@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{margin-top:1px;pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);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{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;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;margin:.5rem 0;padding:0}.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%,.75);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}.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-left:var(--other-side-offset);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}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);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:background-color .2s,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}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:20px;display:flex;height:40px;margin:15px auto 1rem;padding:0 24px 0 12px;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3.5rem;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)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right: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;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)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;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{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;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){-webkit-animation-name:fade-in-opacity;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;-ms-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{border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;line-height:1.25rem!important;min-width:1.25rem;padding:0 .375rem}.badge-24{height:1.5rem;line-height:1.5rem!important;min-width:1.5rem;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.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;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;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}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;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}}.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;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);left:var(--offset-left);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;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}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);padding-left:3.375rem;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}.checkbox-field.hover-effect .checkbox-box{left: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}.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;text-align:left}.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)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);left:var(--offset-left);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}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:calc(var(--offset-left) + .3125rem);transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[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;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.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;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}.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;-ms-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:4px 0 0}.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);flex-direction:column;margin:0;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist,.chatlist-chat{display:flex;position:relative}.chatlist-chat{--background:unset;-webkit-user-drag:none;align-items:flex-start;background:var(--background);border-radius:10px;cursor:pointer;flex-direction:row;height:72px;overflow:hidden;padding:.5625rem}@media only screen and (max-width:600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{align-items:flex-start;display:flex;flex-direction:row;height:27px;margin:0}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@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 .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-caption,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active b{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;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist-chat span{line-height:27px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem;margin-right:-3px;margin-top:4px}.chatlist .dialog-subtitle-media{border-radius:.125rem;display:inline-block;flex:0 0 auto;height:1.25rem;margin-right:.375rem;margin-top:-.125rem;position:relative;vertical-align:middle;width:1.25rem}.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;height:inherit;-o-object-fit:cover;object-fit:cover;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 .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);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 .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s 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 .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);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 .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s 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 .user-caption{color:#707579;color:var(--secondary-text-color);flex:1 1 auto;overflow:hidden;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:4px;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}.chatlist .user-last-message i,.chatlist .user-title i{font-style:normal}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;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;padding:0}html.is-mac .chatlist .mention{line-height:22px!important}.chatlist .mention-badge{margin-right:-2px}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.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;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{align-items:center;height:4.5rem;padding:0 .75rem}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto!important}.chatlist-new span{line-height:1.3125!important;line-height:var(--line-height)!important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width:600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width:600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-last-message b,.contacts-container .user-title,.contacts-container b,.search-group-contacts .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b{font-weight:400}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width:600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.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;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;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;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 .input-message-input{background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}.chat-input .btn-record-cancel{background-color:#df3f40!important;background-color:var(--danger-color)!important;opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;right:5px;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{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:color .2s,background-color .2s,opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;z-index:3}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.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{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{color:#fff!important;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:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(0,0,0,.2);border-radius:50%;height:300px;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}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-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}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@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{bottom:0;left:0;position:fixed!important;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{align-items:center;display:flex!important;flex-direction:column;transition:transform .25s ease-in-out,filter .25s 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;-ms-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{bottom:0;left:0;position:absolute!important;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{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@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{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;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.is-right-column-shown .chat-background-item{transform:scale(.666666667);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}}.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:overlay}.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){body.is-right-column-shown .chat .drops-container{right: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.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:12px;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,.18);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}}.chat-input-control-button:before{margin-right: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;-ms-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}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;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}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);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}.rows-wrapper{border-bottom-right-radius:0;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}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;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:.75rem;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;-ms-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:0 .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 .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 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){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.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}.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;margin-left:var(--commands-margin-left);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}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;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}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right: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:50%;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{display:flex;flex-direction:column;justify-content:center;line-height:1!important;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))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));padding-right:var(--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 .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%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.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.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.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.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.is-chat .is-in .bubble-content-wrapper{margin-left: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:not(.is-channel) .message{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,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;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.is-visible{cursor:pointer;opacity:1;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;visibility:visible}.bubbles-corner-button{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:50%;bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;overflow:visible;position:absolute;right:var(--chat-input-padding);z-index:2}body.animation-level-0 .bubbles-corner-button{transition:none!important}.bubbles-corner-button .badge{position:absolute;right:-.25rem;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){.bubbles-corner-button .badge{right:.1875rem;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{--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;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;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}.chat:first-child .topbar .chat-info{padding-left:.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;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}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left: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}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.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}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;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){.topbar-call-container{left: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}.topbar-call-left .btn-icon{margin-right:.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}@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%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@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{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;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{display:flex;flex-wrap:wrap;margin:0 auto .25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-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:-.125rem;content:" ";left:-50%;position:absolute;top:-.125rem;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{-webkit-animation:bubbleSelected 2s linear;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(.125rem + 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{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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;-ms-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;-ms-user-select:text;user-select:text}.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:-.125rem;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{opacity:.99999;padding-bottom:.25rem;pointer-events:none;position:-webkit-sticky;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.type-chat .bubble.is-date .bubble-content,.chat.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{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.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);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}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}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:-webkit-min-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;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.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.5rem;padding-top:.5rem}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none!important;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{margin-left:auto;position:relative!important;right:0!important}.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;-ms-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{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;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:-webkit-max-content;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;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;flex-direction:column;padding:.75rem 1rem .875rem!important}.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;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{cursor:pointer;height:200px;margin-top:.75rem!important;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;-ms-user-select:none;user-select:none;width:-webkit-max-content;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:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-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 .25rem .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}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 .name,.bubble.just-media .reply{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:10px;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .name,.bubble.just-media .reply{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .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{margin-top:0;max-width:none!important;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{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: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;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;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;-ms-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;-ms-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{border-radius:inherit;padding:0!important}.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:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:rgba(0,0,0,.06);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.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,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;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,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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:-.125rem}.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:-.125rem}.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{background-color:#fff;background-color:var(--message-background-color);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 .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:18px;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}.bubble.is-message-empty.with-replies:not(.sticker) .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:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;height:12px;line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-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;display:flex;height:12px;line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:12px;color:#fff;display:flex;font-size:12px;height:1.125rem;left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:1.25rem;padding:0 1px 0 3px}.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;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:.875rem;font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:1.25rem;max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .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):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;-ms-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.1875rem;min-width:15rem;padding:0 .5rem;position:relative}.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;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.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:.9375rem;justify-content:center;line-height:1.25rem;padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-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:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{cursor:pointer;text-decoration:underline}.bubble.service .service-msg .peer-title{cursor:pointer}.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}.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 .name,.bubble.is-in.just-media .reply{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{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{color:#707579;color:var(--secondary-text-color);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(--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);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}.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 .name,.bubble.is-out.just-media .reply{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;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;line-height:16px;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 .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:#eeffde;color:var(--message-out-background-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.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{width:100%}.reply-markup-row{border-radius:.375rem;display:flex;margin-top:.3125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:inherit;color:#fff!important;cursor:pointer;font-size:.875rem;outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button.anchor-url{text-decoration:none!important}.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}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.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-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.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{align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;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:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{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:2rem;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;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;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;margin-top:-.125rem}.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.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;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:80px;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{height:50px;padding:.25rem 0!important}.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:.1875rem}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;-ms-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;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.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{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(80px,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{left:0;position:absolute!important;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{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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);-webkit-animation:drop-outline-move .5s linear infinite;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}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!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,.18);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{align-items:flex-start;border-radius:0!important;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%}.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:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .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);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;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;-ms-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}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.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 .profile-name{margin-bottom:-1px}.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}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.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:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;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{color:#707579;color:var(--secondary-text-color);font-size:.875rem;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:3.5rem;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,3.5rem);--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;-ms-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}.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;transition:none!important}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:calc(-.6875rem - 6px);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 .25s 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 .25s 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: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}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;right:-1px;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-size:3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size:var(--menu-size);background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;padding:0 0 5px;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left: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}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left: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{flex:0 0 auto;position:relative!important}#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{--offset-top:-3px;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;transition:opacity .2s,background-color .15s;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,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);width:300px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding-bottom:1px;padding-left:4px}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:98px;margin:0 5px 0 0;max-width:78px;padding:12px 0 0!important;width:78px}@media only screen and (max-width:600px){#column-left .search-group-people .chatlist-chat{max-width:77px;width:77px}}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .user-caption{font-size:12px;max-width:65px;padding:2px 0 9px}@media only screen and (max-width:600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center;overflow:visible}#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{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;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))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;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{padding:0 .25rem;width:100%}}#search-container{display:flex;top:-3px!important}#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}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.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;-ms-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;line-height:1.3125;line-height:var(--line-height);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}.chat-folders-container .row .btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);transition:width .2s;width:auto}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.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-list .chatlist-chat{height:50px;padding:9px 12px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:400}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.folder-category-button{height:50px}.included-chatlist-container .selector .chatlist-chat,.popup-forward .selector .chatlist-chat{height:3.75rem;padding:7px .75rem!important}.included-chatlist-container .selector .chatlist .user-caption,.popup-forward .selector .chatlist .user-caption{margin-top:-2px;padding:0 0 0 14px}.included-chatlist-container .selector .chatlist .user-last-message,.popup-forward .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.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}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left: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 .chatlist-chat{height:62px;padding-bottom:7px;padding-top:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.search-group-recent .dialog-avatar{--size:46px;--multiplier:1.173913}.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{box-shadow:none;padding-top:0!important}.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}.sidebar-left-section-content>.checkbox-field .checkbox-box{left: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-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{opacity:.25;pointer-events:none!important}.sidebar-left-section .media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.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;-ms-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}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.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{margin-top:0;padding-bottom:.9375rem;padding-top:1rem}.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)}.blocked-users-container .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}@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 .grid-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 .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.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;-ms-user-select:none;user-select:none;width:21rem!important}.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}.empty-placeholder .btn-control:before{margin-right:.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}#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{max-width:100%;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 .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{bottom:14px;height:54px;position:fixed!important;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{--padding-horizontal:.25rem;flex:1 1 auto;padding:.25rem 0;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;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;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{padding:0;position:absolute!important;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:1}.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{margin:0;position:absolute;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{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-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.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 li: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;-ms-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{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{color:#707579;color:var(--secondary-text-color);float:left;font-size:24px;padding-left:16.5px;padding-right:32px}#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{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:400}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width:601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.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;padding-bottom:1rem}.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}.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{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.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{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;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 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;-ms-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;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.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 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{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;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;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.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;-ms-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;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{--menu-height:3.0625rem;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;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{border-radius:10px;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;position:absolute!important;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);width:26.25rem!important;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-container .menu-horizontal-div{background-color:#fff;background-color:var(--surface-color);z-index:4}.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-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 1rem}.emoji-dropdown .category-title{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);line-height:18px;line-height:var(--line-height-14);padding:.8125rem .875rem .6875rem;position:relative;width:100%}.emoji-dropdown .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{background-color:#fff;background-color:var(--surface-color);flex:1;padding:0;position:relative}.emoji-dropdown .emoji-padding .super-emojis{padding:0 .5rem}@media only screen and (max-width:600px){.emoji-dropdown .emoji-padding .menu-horizontal-div-item{flex:initial;padding:0}}.emoji-dropdown .emoji-category{position:relative}.emoji-dropdown .menu-horizontal-div{align-items:center;height:var(--menu-height);min-height:var(--menu-height);width:100%}.emoji-dropdown .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:2.5rem;line-height:2.5rem;padding:0;width:2.5rem}.emoji-dropdown .stickers-padding .category-title{cursor:pointer}.emoji-dropdown .stickers-padding .category-items{padding:0 .3125rem}.emoji-dropdown .stickers-padding .menu-wrapper{background-color:#fff;background-color:var(--surface-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);height:var(--menu-height);max-width:100%;padding:0;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto;margin:0 .3125rem;padding:.25rem}.emoji-dropdown .stickers-padding .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent):not(.tgico-saved){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}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%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@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;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:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.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;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-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{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;left:0;line-height:32px!important;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 .chatlist-chat{padding-bottom:.75rem;padding-top:.75rem}@media only screen and (max-width:600px){.selector .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px!important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;pointer-events:none;position:absolute;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{cursor:pointer;flex:1 0 auto;height:100px;margin:2.5px;max-width:100%;position:relative}.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{-webkit-animation:rotate 1s linear infinite;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{-webkit-animation:none;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{-webkit-animation:rotate 2s linear infinite;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{-webkit-animation:rotate 1s linear infinite!important;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}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-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 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}}@-webkit-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 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}}@-webkit-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%}}@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;-ms-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{-webkit-animation:ripple-effect .7s forwards;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}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}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(25px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element.is-premium:before{bottom:-.0625rem;color:#fff;font-size:.6875rem;line-height:1!important;pointer-events:none;position:absolute;right:0;z-index:1}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;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 path{fill:#fff}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-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;-o-object-fit:cover;object-fit:cover;width:100%!important}.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)}.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}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);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{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;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)}.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;text-align:left;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{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;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{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;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{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;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{-webkit-animation:eye 1.8s ease-in-out infinite;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{-webkit-animation:eye-move 1.8s ease-in-out infinite;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}@-webkit-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 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)}}@-webkit-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 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)}}@-webkit-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 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)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-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{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)}}@-webkit-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%)}}@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;-ms-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{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}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;text-align:right;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;-webkit-animation:pollAnswerRotate .65s linear infinite;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;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{-webkit-animation:none;animation:none;display:flex!important;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)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;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{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;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{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;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{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;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{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-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)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@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}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row a{position:relative;z-index:1}.row-title-row{align-items:center;display:flex;justify-content:space-between;order:0}.row-title-row .row-title{flex:1 1 auto;white-space:nowrap}.row-title,.row-title-row .row-title{overflow:hidden;text-overflow:ellipsis}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word}.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;margin-top:-.125rem;pointer-events:none;position:absolute}.row-with-padding .row-subtitle:not(:empty):not(.hide)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .checkbox-field,.row .radio-field{margin-bottom:0;margin-top:0}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem 0 0;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:.875rem!important;line-height:18px;line-height:var(--line-height-14);margin-bottom:.0625rem;margin-top:.125rem;order:1}.row-subtitle:empty{display:none}.row-media{align-items:center;display:flex;height:3rem!important;justify-content:center;left:.5rem;margin:0!important;position:absolute!important;width:3rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.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:-webkit-grab;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{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;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);width:26.25rem!important;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}.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:#2a9ef1;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{-webkit-animation:waves-animation 3s infinite;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{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;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;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@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);position:relative}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit!important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.message: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;-ms-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{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) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.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;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}.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:scale3d(0,0,0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scaleX(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;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)}.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;position:fixed!important;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;-ms-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)}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0;padding:0 1rem 0 1.5rem}.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}.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}.popup-buttons .btn+.btn{margin-right:.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}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.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-weight:400;height:36px;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-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-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.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{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.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}.popup-peer .popup-container{max-width:min(400px,100%);min-width:17.5rem;padding:.75rem .5rem}.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:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width: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;-ms-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 .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set-stickers{display:grid;grid-template-columns:repeat(5,1fr);padding:0 5px}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4,1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{cursor:pointer;height:80px;height:var(--esg-sticker-size);justify-self:center;margin-bottom:2px;position:relative;width:80px;width:var(--esg-sticker-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker: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;-ms-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;-ms-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;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;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;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:3px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1;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:1.25rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .selector .chatlist-chat{height:3.875rem!important;padding-bottom:.5rem!important;padding-top:.5rem!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;-ms-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;-ms-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:1em -.5rem .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;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{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.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{align-items:center;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-muted-icon-container{flex:0 0 auto}.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;margin-left:.75rem}.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-participants .dialog-subtitle{margin-top:-.25rem}.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;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.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{--additional-height:.75rem;--reaction-size:1.5rem;--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{align-items:center;display:flex;font-size:1.25rem!important;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{height:1.5rem;margin:0;top:50%;transform:translateY(-50%);width:1.5rem}.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:1.25rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.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;display:inline;font-weight:inherit!important}.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-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}#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{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.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}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.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}.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 .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.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;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;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 .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100);overflow:hidden}}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{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@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)}.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)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@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;cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.user-last-message b{font-weight:400}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#72d5fd,#2a9ef1);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:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);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}.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;text-align:left}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}.phone-code{color:#9e9e9e;text-align:right}.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}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@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:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right: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;-ms-user-select:text;user-select:text;white-space:pre-wrap}[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,80px);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;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@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;-ms-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{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;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{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;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{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;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;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.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-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.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;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:.875rem;margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;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{grid-column-gap:2.44px;display:grid;font-size:2.125rem;grid-template-columns:repeat(auto-fill,2.625rem);justify-content:space-between;line-height:2.125rem}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:2.625rem;line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem}.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%}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)}.tgico-char:before{font-family:Roboto!important;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-icon{line-height:1!important;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)}.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;margin-left:.125rem;width:1.25rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.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);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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} + +/*# sourceMappingURL=main.c93ffbcdcd27accf9d40.css.map*/ \ No newline at end of file diff --git a/public/main.c93ffbcdcd27accf9d40.css.map b/public/main.c93ffbcdcd27accf9d40.css.map new file mode 100644 index 000000000..5507719c3 --- /dev/null +++ b/public/main.c93ffbcdcd27accf9d40.css.map @@ -0,0 +1 @@ +{"version":3,"file":"main.c93ffbcdcd27accf9d40.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;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}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;-ms-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{left:50%;position:absolute!important;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)}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:.25s 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:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s 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-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-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:1.3125;--line-height-20:23px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--esg-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;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--peer-avatar-red-top:#ff885e;--peer-avatar-red-bottom:#ff516a;--peer-avatar-orange-top:#ffcd6a;--peer-avatar-orange-bottom:#ffa85c;--peer-avatar-violet-top:#82b1ff;--peer-avatar-violet-bottom:#665fff;--peer-avatar-green-top:#a0de7e;--peer-avatar-green-bottom:#54cb68;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#72d5fd;--peer-avatar-blue-bottom:#2a9ef1;--peer-avatar-pink-top:#e0a2f3;--peer-avatar-pink-bottom:#d669ed;--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;--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-text-color:#000;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-blue-top);--avatar-color-bottom:var(--peer-avatar-blue-bottom);--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);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-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-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-audio-play-button-color:#fff;--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-text-color:#fff;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-violet-top);--avatar-color-bottom:var(--peer-avatar-violet-bottom);--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-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--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:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?h1cbu) format(\"truetype\"),url(assets/fonts/tgico.woff?h1cbu) format(\"woff\"),url(assets/fonts/tgico.svg?h1cbu#tgico) format(\"svg\")}.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-family:tgico!important;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-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-help: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-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-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools: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}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;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;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}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;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;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}:-ms-input-placeholder{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{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@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){.input-search{margin-left:1rem}}.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);max-height:var(--height)!important;min-height:var(--height)!important;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:-ms-input-placeholder~.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:24px;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}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{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{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;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,background-color .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.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;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.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{-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%,.75);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%;transform:scale(.8)!important;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{-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{--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;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-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;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;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}.btn-menu-item{--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);cursor:pointer!important;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:0 .3125rem;padding:0 var(--padding-right) 0 var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}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{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@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{margin-top:1px;pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);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{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;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;margin:.5rem 0;padding:0}.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%,.75);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}.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-left:var(--other-side-offset);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}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);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:background-color .2s,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}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:20px;display:flex;height:40px;margin:15px auto 1rem;padding:0 24px 0 12px;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3.5rem;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)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right: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;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)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;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{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;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){-webkit-animation-name:fade-in-opacity;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;-ms-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{border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;line-height:1.25rem!important;min-width:1.25rem;padding:0 .375rem}.badge-24{height:1.5rem;line-height:1.5rem!important;min-width:1.5rem;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.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;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;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}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;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}}.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;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);left:var(--offset-left);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;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}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);padding-left:3.375rem;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}.checkbox-field.hover-effect .checkbox-box{left: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}.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;text-align:left}.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)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);left:var(--offset-left);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}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:calc(var(--offset-left) + .3125rem);transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[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;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.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;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}.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;-ms-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:4px 0 0}.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);flex-direction:column;margin:0;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist,.chatlist-chat{display:flex;position:relative}.chatlist-chat{--background:unset;-webkit-user-drag:none;align-items:flex-start;background:var(--background);border-radius:10px;cursor:pointer;flex-direction:row;height:72px;overflow:hidden;padding:.5625rem}@media only screen and (max-width:600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{align-items:flex-start;display:flex;flex-direction:row;height:27px;margin:0}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@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 .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-caption,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active b{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;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist-chat span{line-height:27px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem;margin-right:-3px;margin-top:4px}.chatlist .dialog-subtitle-media{border-radius:.125rem;display:inline-block;flex:0 0 auto;height:1.25rem;margin-right:.375rem;margin-top:-.125rem;position:relative;vertical-align:middle;width:1.25rem}.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;height:inherit;-o-object-fit:cover;object-fit:cover;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 .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);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 .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s 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 .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);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 .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s 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 .user-caption{color:#707579;color:var(--secondary-text-color);flex:1 1 auto;overflow:hidden;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:4px;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}.chatlist .user-last-message i,.chatlist .user-title i{font-style:normal}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;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;padding:0}html.is-mac .chatlist .mention{line-height:22px!important}.chatlist .mention-badge{margin-right:-2px}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.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;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{align-items:center;height:4.5rem;padding:0 .75rem}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto!important}.chatlist-new span{line-height:1.3125!important;line-height:var(--line-height)!important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width:600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width:600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-last-message b,.contacts-container .user-title,.contacts-container b,.search-group-contacts .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b{font-weight:400}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width:600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.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;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;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;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 .input-message-input{background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}.chat-input .btn-record-cancel{background-color:#df3f40!important;background-color:var(--danger-color)!important;opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;right:5px;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{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:color .2s,background-color .2s,opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;z-index:3}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.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{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{color:#fff!important;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:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(0,0,0,.2);border-radius:50%;height:300px;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}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-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}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@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{bottom:0;left:0;position:fixed!important;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{align-items:center;display:flex!important;flex-direction:column;transition:transform .25s ease-in-out,filter .25s 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;-ms-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{bottom:0;left:0;position:absolute!important;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{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@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{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;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.is-right-column-shown .chat-background-item{transform:scale(.666666667);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}}.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:overlay}.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){body.is-right-column-shown .chat .drops-container{right: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.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:12px;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,.18);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}}.chat-input-control-button:before{margin-right: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;-ms-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}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;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}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);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}.rows-wrapper{border-bottom-right-radius:0;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}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;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:.75rem;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;-ms-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:0 .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 .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 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){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.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}.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;margin-left:var(--commands-margin-left);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}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;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}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right: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:50%;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{display:flex;flex-direction:column;justify-content:center;line-height:1!important;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))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));padding-right:var(--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 .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%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.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.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.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.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.is-chat .is-in .bubble-content-wrapper{margin-left: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:not(.is-channel) .message{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,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;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.is-visible{cursor:pointer;opacity:1;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;visibility:visible}.bubbles-corner-button{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:50%;bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;overflow:visible;position:absolute;right:var(--chat-input-padding);z-index:2}body.animation-level-0 .bubbles-corner-button{transition:none!important}.bubbles-corner-button .badge{position:absolute;right:-.25rem;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){.bubbles-corner-button .badge{right:.1875rem;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{--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;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;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}.chat:first-child .topbar .chat-info{padding-left:.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;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}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left: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}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.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}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;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){.topbar-call-container{left: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}.topbar-call-left .btn-icon{margin-right:.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}@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%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@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{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;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{display:flex;flex-wrap:wrap;margin:0 auto .25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-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:-.125rem;content:\" \";left:-50%;position:absolute;top:-.125rem;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{-webkit-animation:bubbleSelected 2s linear;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(.125rem + 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{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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;-ms-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;-ms-user-select:text;user-select:text}.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:-.125rem;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{opacity:.99999;padding-bottom:.25rem;pointer-events:none;position:-webkit-sticky;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.type-chat .bubble.is-date .bubble-content,.chat.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{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.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);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}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}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:-webkit-min-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;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.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.5rem;padding-top:.5rem}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none!important;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{margin-left:auto;position:relative!important;right:0!important}.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;-ms-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{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;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:-webkit-max-content;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;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;flex-direction:column;padding:.75rem 1rem .875rem!important}.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;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{cursor:pointer;height:200px;margin-top:.75rem!important;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;-ms-user-select:none;user-select:none;width:-webkit-max-content;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:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-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 .25rem .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}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 .name,.bubble.just-media .reply{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:10px;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .name,.bubble.just-media .reply{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .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{margin-top:0;max-width:none!important;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{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: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;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;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;-ms-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;-ms-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{border-radius:inherit;padding:0!important}.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:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:rgba(0,0,0,.06);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.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,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;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,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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:-.125rem}.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:-.125rem}.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{background-color:#fff;background-color:var(--message-background-color);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 .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:18px;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}.bubble.is-message-empty.with-replies:not(.sticker) .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:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;height:12px;line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-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;display:flex;height:12px;line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:12px;color:#fff;display:flex;font-size:12px;height:1.125rem;left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:1.25rem;padding:0 1px 0 3px}.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;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:.875rem;font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:1.25rem;max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .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):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;-ms-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.1875rem;min-width:15rem;padding:0 .5rem;position:relative}.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;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.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:.9375rem;justify-content:center;line-height:1.25rem;padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-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:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{cursor:pointer;text-decoration:underline}.bubble.service .service-msg .peer-title{cursor:pointer}.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}.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 .name,.bubble.is-in.just-media .reply{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{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{color:#707579;color:var(--secondary-text-color);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(--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);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}.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 .name,.bubble.is-out.just-media .reply{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;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;line-height:16px;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 .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:#eeffde;color:var(--message-out-background-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.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{width:100%}.reply-markup-row{border-radius:.375rem;display:flex;margin-top:.3125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:inherit;color:#fff!important;cursor:pointer;font-size:.875rem;outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button.anchor-url{text-decoration:none!important}.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}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.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-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.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{align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;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:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{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:2rem;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;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;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;margin-top:-.125rem}.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.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;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:80px;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{height:50px;padding:.25rem 0!important}.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:.1875rem}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;-ms-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;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.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{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(80px,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{left:0;position:absolute!important;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{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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);-webkit-animation:drop-outline-move .5s linear infinite;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}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!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,.18);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{align-items:flex-start;border-radius:0!important;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%}.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:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .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);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;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;-ms-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}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.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 .profile-name{margin-bottom:-1px}.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}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.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:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;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{color:#707579;color:var(--secondary-text-color);font-size:.875rem;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:3.5rem;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,3.5rem);--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;-ms-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}.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;transition:none!important}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:calc(-.6875rem - 6px);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 .25s 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 .25s 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: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}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;right:-1px;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-size:3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size:var(--menu-size);background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;padding:0 0 5px;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left: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}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left: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{flex:0 0 auto;position:relative!important}#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{--offset-top:-3px;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;transition:opacity .2s,background-color .15s;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,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);width:300px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding-bottom:1px;padding-left:4px}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:98px;margin:0 5px 0 0;max-width:78px;padding:12px 0 0!important;width:78px}@media only screen and (max-width:600px){#column-left .search-group-people .chatlist-chat{max-width:77px;width:77px}}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .user-caption{font-size:12px;max-width:65px;padding:2px 0 9px}@media only screen and (max-width:600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center;overflow:visible}#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{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;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))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;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{padding:0 .25rem;width:100%}}#search-container{display:flex;top:-3px!important}#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}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.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;-ms-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;line-height:1.3125;line-height:var(--line-height);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}.chat-folders-container .row .btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);transition:width .2s;width:auto}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.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-list .chatlist-chat{height:50px;padding:9px 12px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:400}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.folder-category-button{height:50px}.included-chatlist-container .selector .chatlist-chat,.popup-forward .selector .chatlist-chat{height:3.75rem;padding:7px .75rem!important}.included-chatlist-container .selector .chatlist .user-caption,.popup-forward .selector .chatlist .user-caption{margin-top:-2px;padding:0 0 0 14px}.included-chatlist-container .selector .chatlist .user-last-message,.popup-forward .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.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}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left: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 .chatlist-chat{height:62px;padding-bottom:7px;padding-top:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.search-group-recent .dialog-avatar{--size:46px;--multiplier:1.173913}.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{box-shadow:none;padding-top:0!important}.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}.sidebar-left-section-content>.checkbox-field .checkbox-box{left: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-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{opacity:.25;pointer-events:none!important}.sidebar-left-section .media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.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;-ms-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}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.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{margin-top:0;padding-bottom:.9375rem;padding-top:1rem}.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)}.blocked-users-container .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}@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 .grid-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 .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.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;-ms-user-select:none;user-select:none;width:21rem!important}.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}.empty-placeholder .btn-control:before{margin-right:.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}#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{max-width:100%;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 .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{bottom:14px;height:54px;position:fixed!important;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{--padding-horizontal:.25rem;flex:1 1 auto;padding:.25rem 0;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;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;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{padding:0;position:absolute!important;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:1}.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{margin:0;position:absolute;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{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-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.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 li: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;-ms-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{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{color:#707579;color:var(--secondary-text-color);float:left;font-size:24px;padding-left:16.5px;padding-right:32px}#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{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:400}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width:601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.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;padding-bottom:1rem}.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}.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{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.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{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;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 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;-ms-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;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.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 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{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;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;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.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;-ms-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;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{--menu-height:3.0625rem;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;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{border-radius:10px;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;position:absolute!important;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);width:26.25rem!important;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-container .menu-horizontal-div{background-color:#fff;background-color:var(--surface-color);z-index:4}.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-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 1rem}.emoji-dropdown .category-title{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);line-height:18px;line-height:var(--line-height-14);padding:.8125rem .875rem .6875rem;position:relative;width:100%}.emoji-dropdown .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{background-color:#fff;background-color:var(--surface-color);flex:1;padding:0;position:relative}.emoji-dropdown .emoji-padding .super-emojis{padding:0 .5rem}@media only screen and (max-width:600px){.emoji-dropdown .emoji-padding .menu-horizontal-div-item{flex:initial;padding:0}}.emoji-dropdown .emoji-category{position:relative}.emoji-dropdown .menu-horizontal-div{align-items:center;height:var(--menu-height);min-height:var(--menu-height);width:100%}.emoji-dropdown .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:2.5rem;line-height:2.5rem;padding:0;width:2.5rem}.emoji-dropdown .stickers-padding .category-title{cursor:pointer}.emoji-dropdown .stickers-padding .category-items{padding:0 .3125rem}.emoji-dropdown .stickers-padding .menu-wrapper{background-color:#fff;background-color:var(--surface-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);height:var(--menu-height);max-width:100%;padding:0;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto;margin:0 .3125rem;padding:.25rem}.emoji-dropdown .stickers-padding .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent):not(.tgico-saved){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}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%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@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;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:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.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;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-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{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;left:0;line-height:32px!important;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 .chatlist-chat{padding-bottom:.75rem;padding-top:.75rem}@media only screen and (max-width:600px){.selector .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px!important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;pointer-events:none;position:absolute;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{cursor:pointer;flex:1 0 auto;height:100px;margin:2.5px;max-width:100%;position:relative}.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{-webkit-animation:rotate 1s linear infinite;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{-webkit-animation:none;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{-webkit-animation:rotate 2s linear infinite;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{-webkit-animation:rotate 1s linear infinite!important;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}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-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 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}}@-webkit-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 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}}@-webkit-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%}}@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;-ms-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{-webkit-animation:ripple-effect .7s forwards;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}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}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(25px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element.is-premium:before{bottom:-.0625rem;color:#fff;font-size:.6875rem;line-height:1!important;pointer-events:none;position:absolute;right:0;z-index:1}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;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 path{fill:#fff}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-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;-o-object-fit:cover;object-fit:cover;width:100%!important}.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)}.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}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);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{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;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)}.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;text-align:left;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{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;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{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;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{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;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{-webkit-animation:eye 1.8s ease-in-out infinite;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{-webkit-animation:eye-move 1.8s ease-in-out infinite;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}@-webkit-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 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)}}@-webkit-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 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)}}@-webkit-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 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)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-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{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)}}@-webkit-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%)}}@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;-ms-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{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}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;text-align:right;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;-webkit-animation:pollAnswerRotate .65s linear infinite;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;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{-webkit-animation:none;animation:none;display:flex!important;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)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;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{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;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{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;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{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;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{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-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)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@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}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row a{position:relative;z-index:1}.row-title-row{align-items:center;display:flex;justify-content:space-between;order:0}.row-title-row .row-title{flex:1 1 auto;white-space:nowrap}.row-title,.row-title-row .row-title{overflow:hidden;text-overflow:ellipsis}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word}.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;margin-top:-.125rem;pointer-events:none;position:absolute}.row-with-padding .row-subtitle:not(:empty):not(.hide)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .checkbox-field,.row .radio-field{margin-bottom:0;margin-top:0}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem 0 0;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:.875rem!important;line-height:18px;line-height:var(--line-height-14);margin-bottom:.0625rem;margin-top:.125rem;order:1}.row-subtitle:empty{display:none}.row-media{align-items:center;display:flex;height:3rem!important;justify-content:center;left:.5rem;margin:0!important;position:absolute!important;width:3rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.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:-webkit-grab;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{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;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);width:26.25rem!important;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}.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:#2a9ef1;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{-webkit-animation:waves-animation 3s infinite;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{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;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;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@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);position:relative}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit!important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.message: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;-ms-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{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) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.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;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}.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:scale3d(0,0,0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scaleX(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;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)}.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;position:fixed!important;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;-ms-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)}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0;padding:0 1rem 0 1.5rem}.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}.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}.popup-buttons .btn+.btn{margin-right:.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}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.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-weight:400;height:36px;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-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-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.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{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.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}.popup-peer .popup-container{max-width:min(400px,100%);min-width:17.5rem;padding:.75rem .5rem}.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:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width: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;-ms-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 .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set-stickers{display:grid;grid-template-columns:repeat(5,1fr);padding:0 5px}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4,1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{cursor:pointer;height:80px;height:var(--esg-sticker-size);justify-self:center;margin-bottom:2px;position:relative;width:80px;width:var(--esg-sticker-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker: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;-ms-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;-ms-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;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;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;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:3px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1;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:1.25rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .selector .chatlist-chat{height:3.875rem!important;padding-bottom:.5rem!important;padding-top:.5rem!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;-ms-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;-ms-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:1em -.5rem .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;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{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.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{align-items:center;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-muted-icon-container{flex:0 0 auto}.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;margin-left:.75rem}.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-participants .dialog-subtitle{margin-top:-.25rem}.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;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.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{--additional-height:.75rem;--reaction-size:1.5rem;--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{align-items:center;display:flex;font-size:1.25rem!important;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{height:1.5rem;margin:0;top:50%;transform:translateY(-50%);width:1.5rem}.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:1.25rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.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;display:inline;font-weight:inherit!important}.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-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}#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{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.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}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.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}.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 .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.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;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;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 .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100);overflow:hidden}}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{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@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)}.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)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@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;cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.user-last-message b{font-weight:400}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#72d5fd,#2a9ef1);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:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);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}.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;text-align:left}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}.phone-code{color:#9e9e9e;text-align:right}.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}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@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:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right: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;-ms-user-select:text;user-select:text;white-space:pre-wrap}[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,80px);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;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@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;-ms-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{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;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{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;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{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;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;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.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-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.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;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:.875rem;margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;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{grid-column-gap:2.44px;display:grid;font-size:2.125rem;grid-template-columns:repeat(auto-fill,2.625rem);justify-content:space-between;line-height:2.125rem}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:2.625rem;line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem}.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%}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)}.tgico-char:before{font-family:Roboto!important;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-icon{line-height:1!important;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)}.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;margin-left:.125rem;width:1.25rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.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);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.e68bddf9c70fe3a738bd.css b/public/main.e68bddf9c70fe3a738bd.css deleted file mode 100644 index d0ac36174..000000000 --- a/public/main.e68bddf9c70fe3a738bd.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;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}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;-ms-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{left:50%;position:absolute!important;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}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:.25s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--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:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s 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-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-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:1.3125;--line-height-20:23px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--esg-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;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--peer-avatar-red-top:#ff885e;--peer-avatar-red-bottom:#ff516a;--peer-avatar-orange-top:#ffcd6a;--peer-avatar-orange-bottom:#ffa85c;--peer-avatar-violet-top:#82b1ff;--peer-avatar-violet-bottom:#665fff;--peer-avatar-green-top:#a0de7e;--peer-avatar-green-bottom:#54cb68;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#72d5fd;--peer-avatar-blue-bottom:#2a9ef1;--peer-avatar-pink-top:#e0a2f3;--peer-avatar-pink-bottom:#d669ed}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-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-text-color:#000;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-blue-top);--avatar-color-bottom:var(--peer-avatar-blue-bottom);--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);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-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-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-audio-play-button-color:#fff;--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-text-color:#fff;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-violet-top);--avatar-color-bottom:var(--peer-avatar-violet-bottom);--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-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--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:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?js2svd) format("truetype"),url(assets/fonts/tgico.woff?js2svd) format("woff"),url(assets/fonts/tgico.svg?js2svd#tgico) format("svg")}.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-family:tgico!important;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-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-help: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-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-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-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-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools: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}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;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;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}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;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;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}:-ms-input-placeholder{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{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@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){.input-search{margin-left:1rem}}.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);max-height:var(--height)!important;min-height:var(--height)!important;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:-ms-input-placeholder~.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:24px;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}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{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{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;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,background-color .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.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;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.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{-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%,.75);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%;transform:scale(.8)!important;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:3}.btn-menu-old{-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{--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;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-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;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;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}.btn-menu-item{--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);cursor:pointer!important;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:0 .3125rem;padding:0 var(--padding-right) 0 var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}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{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@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{margin-top:1px;pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);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{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.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;margin:.5rem 0;padding:0}.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%,.75);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}.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-left:var(--other-side-offset);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}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);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:background-color .2s,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}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:20px;display:flex;height:40px;margin:15px auto 1rem;padding:0 24px 0 12px;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3.5rem;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)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right: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;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)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;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{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;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){-webkit-animation-name:fade-in-opacity;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;-ms-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{border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;line-height:1.25rem!important;min-width:1.25rem;padding:0 .375rem}.badge-24{height:1.5rem;line-height:1.5rem!important;min-width:1.5rem;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.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;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;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}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;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}}.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;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);left:var(--offset-left);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;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}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);padding-left:3.375rem;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}.checkbox-field.hover-effect .checkbox-box{left:auto}.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}.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;text-align:left}.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)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);left:var(--offset-left);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}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:calc(var(--offset-left) + .3125rem);transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[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;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.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;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}.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;-ms-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:4px 0 0}.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);flex-direction:column;margin:0;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist,.chatlist-chat{display:flex;position:relative}.chatlist-chat{--background:unset;-webkit-user-drag:none;align-items:flex-start;background:var(--background);border-radius:10px;cursor:pointer;flex-direction:row;height:72px;overflow:hidden;padding:.5625rem}@media only screen and (max-width:600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{align-items:flex-start;display:flex;flex-direction:row;height:27px;margin:0}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-caption,.chatlist-chat.active .user-title{color:#fff}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active b{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-background{fill:#fff!important}.chatlist-chat.active .verified-check{fill:#3390ec!important;fill:var(--primary-color)!important}.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;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist-chat span{line-height:27px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem;margin-right:-3px;margin-top:4px}.chatlist .dialog-subtitle-media{border-radius:.125rem;display:inline-block;flex:0 0 auto;height:1.25rem;margin-right:.375rem;margin-top:-.125rem;position:relative;vertical-align:middle;width:1.25rem}.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;height:inherit;-o-object-fit:cover;object-fit:cover;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 .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);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 .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s 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 .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);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 .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s 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 .user-caption{color:#707579;color:var(--secondary-text-color);flex:1 1 auto;overflow:hidden;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:4px;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}.chatlist .user-last-message i,.chatlist .user-title i{font-style:normal}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;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;padding:0}html.is-mac .chatlist .mention{line-height:22px!important}.chatlist .mention-badge{margin-right:-2px}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.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;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{align-items:center;height:4.5rem;padding:0 .75rem}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto!important}.chatlist-new span{line-height:1.3125!important;line-height:var(--line-height)!important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width:600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width:600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-last-message b,.contacts-container .user-title,.contacts-container b,.search-group-contacts .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b{font-weight:400}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width:600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.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;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;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;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 .input-message-input{background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}.chat-input .btn-record-cancel{background-color:#df3f40!important;background-color:var(--danger-color)!important;opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;right:5px;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{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:color .2s,background-color .2s,opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;z-index:3}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.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{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{color:#fff!important;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:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(0,0,0,.2);border-radius:50%;height:300px;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}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-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}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@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{bottom:0;left:0;position:fixed!important;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{align-items:center;display:flex!important;flex-direction:column;transition:transform .25s ease-in-out,filter .25s 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;-ms-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{bottom:0;left:0;position:absolute!important;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{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@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{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;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.is-right-column-shown .chat-background-item{transform:scale(.666666667);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}}.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:overlay}.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){body.is-right-column-shown .chat .drops-container{right: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.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:12px;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,.18);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}}.chat-input-control-button:before{margin-right: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;-ms-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}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;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}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);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}.rows-wrapper{border-bottom-right-radius:0;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}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;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:.75rem;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;-ms-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:0 .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 .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 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){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.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}.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;margin-left:var(--commands-margin-left);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}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;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}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right: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:50%;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{display:flex;flex-direction:column;justify-content:center;line-height:1!important;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))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));padding-right:var(--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 .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%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.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.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.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.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.is-chat .is-in .bubble-content-wrapper{margin-left: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:not(.is-channel) .message{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,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;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.is-visible{cursor:pointer;opacity:1;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;visibility:visible}.bubbles-corner-button{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:50%;bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;overflow:visible;position:absolute;right:var(--chat-input-padding);z-index:2}body.animation-level-0 .bubbles-corner-button{transition:none!important}.bubbles-corner-button .badge{position:absolute;right:-.25rem;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){.bubbles-corner-button .badge{right:.1875rem;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{--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;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;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}.chat:first-child .topbar .chat-info{padding-left:.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;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}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left: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}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.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}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;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){.topbar-call-container{left: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}.topbar-call-left .btn-icon{margin-right:.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}@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%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@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{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;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{display:flex;flex-wrap:wrap;margin:0 auto .25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-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:-.125rem;content:" ";left:-50%;position:absolute;top:-.125rem;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{-webkit-animation:bubbleSelected 2s linear;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(.125rem + 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{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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;-ms-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;-ms-user-select:text;user-select:text}.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:-.125rem;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{opacity:.99999;padding-bottom:.25rem;pointer-events:none;position:-webkit-sticky;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.type-chat .bubble.is-date .bubble-content,.chat.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{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.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);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}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}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:-webkit-min-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;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.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.5rem;padding-top:.5rem}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none!important;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{margin-left:auto;position:relative!important;right:0!important}.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;-ms-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{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;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:-webkit-max-content;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;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 .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;flex-direction:column;padding:.75rem 1rem .875rem!important}.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;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{cursor:pointer;height:200px;margin-top:.75rem!important;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;-ms-user-select:none;user-select:none;width:-webkit-max-content;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:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-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 .25rem .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}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 .name,.bubble.just-media .reply{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:10px;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .name,.bubble.just-media .reply{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .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{margin-top:0;max-width:none!important;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{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: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;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;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;-ms-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;-ms-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-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.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:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:rgba(0,0,0,.06);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.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,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;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,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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:-.125rem}.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:-.125rem}.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{background-color:#fff;background-color:var(--message-background-color);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 .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:18px;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}.bubble.is-message-empty.with-replies:not(.sticker) .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:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;height:12px;line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-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;display:flex;height:12px;line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:12px;color:#fff;display:flex;font-size:12px;height:1.125rem;left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:1.25rem;padding:0 1px 0 3px}.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;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:.875rem;font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:1.25rem;max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .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):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;-ms-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.1875rem;min-width:15rem;padding:0 .5rem;position:relative}.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;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.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:.9375rem;justify-content:center;line-height:1.25rem;padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-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:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{cursor:pointer;text-decoration:underline}.bubble.service .service-msg .peer-title{cursor:pointer}.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}.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 .name,.bubble.is-in.just-media .reply{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{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{color:#707579;color:var(--secondary-text-color);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(--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);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}.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 .name,.bubble.is-out.just-media .reply{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;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;line-height:16px;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 .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:#eeffde;color:var(--message-out-background-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.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{width:100%}.reply-markup-row{border-radius:.375rem;display:flex;margin-top:.3125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:inherit;color:#fff!important;cursor:pointer;font-size:.875rem;outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button.anchor-url{text-decoration:none!important}.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}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.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-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.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{align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;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:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{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:2rem;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;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;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;margin-top:-.125rem}.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.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;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:80px;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{height:50px;padding:.25rem 0!important}.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:.1875rem}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;-ms-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;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.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{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(80px,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{left:0;position:absolute!important;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{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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);-webkit-animation:drop-outline-move .5s linear infinite;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}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!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,.18);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{align-items:flex-start;border-radius:0!important;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%}.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:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .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);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;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;-ms-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}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{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}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.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:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;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}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;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:3.5rem;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,3.5rem);--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;-ms-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}.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;transition:none!important}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:calc(-.6875rem - 6px);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 .25s 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 .25s 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: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}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;right:-1px;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-size:3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size:var(--menu-size);background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;padding:0 0 5px;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left: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}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left: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{flex:0 0 auto;position:relative!important}#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{--offset-top:-3px;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;transition:opacity .2s,background-color .15s;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,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);width:300px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding-bottom:1px;padding-left:4px}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:98px;margin:0 5px 0 0;max-width:78px;padding:12px 0 0!important;width:78px}@media only screen and (max-width:600px){#column-left .search-group-people .chatlist-chat{max-width:77px;width:77px}}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .user-caption{font-size:12px;max-width:65px;padding:2px 0 9px}@media only screen and (max-width:600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center;overflow:visible}#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{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;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))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;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{padding:0 .25rem;width:100%}}#search-container{display:flex;top:-3px!important}#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}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.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;-ms-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;line-height:1.3125;line-height:var(--line-height);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}.chat-folders-container .row .btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);transition:width .2s;width:auto}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.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-list .chatlist-chat{height:50px;padding:9px 12px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:400}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.folder-category-button{height:50px}.included-chatlist-container .selector .chatlist-chat,.popup-forward .selector .chatlist-chat{height:3.75rem;padding:7px .75rem!important}.included-chatlist-container .selector .chatlist .user-caption,.popup-forward .selector .chatlist .user-caption{margin-top:-2px;padding:0 0 0 14px}.included-chatlist-container .selector .chatlist .user-last-message,.popup-forward .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.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}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left: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 .chatlist-chat{height:62px;padding-bottom:7px;padding-top:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.search-group-recent .dialog-avatar{--size:46px;--multiplier:1.173913}.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{box-shadow:none;padding-top:0!important}.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}.sidebar-left-section-content>.checkbox-field .checkbox-box{left: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-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{opacity:.25;pointer-events:none!important}.sidebar-left-section .media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.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;-ms-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}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.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{margin-top:0;padding-bottom:.9375rem;padding-top:1rem}.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)}.blocked-users-container .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}@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 .grid-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 .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.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;-ms-user-select:none;user-select:none;width:21rem!important}.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}.empty-placeholder .btn-control:before{margin-right:.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}#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{max-width:100%;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 .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{bottom:14px;height:54px;position:fixed!important;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{--padding-horizontal:.25rem;flex:1 1 auto;padding:.25rem 0;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;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;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{padding:0;position:absolute!important;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:1}.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{margin:0;position:absolute;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{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-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.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 li: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;-ms-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{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{color:#707579;color:var(--secondary-text-color);float:left;font-size:24px;padding-left:16.5px;padding-right:32px}#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{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:400}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width:601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.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;padding-bottom:1rem}.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}.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{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.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{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;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 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;-ms-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;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.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 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{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;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;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.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;-ms-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;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{--menu-height:3.0625rem;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;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{border-radius:10px;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;position:absolute!important;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);width:26.25rem!important;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-container .menu-horizontal-div{background-color:#fff;background-color:var(--surface-color);z-index:4}.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-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 1rem}.emoji-dropdown .category-title{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);line-height:18px;line-height:var(--line-height-14);padding:.8125rem .875rem .6875rem;position:relative;width:100%}.emoji-dropdown .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{background-color:#fff;background-color:var(--surface-color);flex:1;padding:0;position:relative}.emoji-dropdown .emoji-padding .super-emojis{padding:0 .5rem}@media only screen and (max-width:600px){.emoji-dropdown .emoji-padding .menu-horizontal-div-item{flex:initial;padding:0}}.emoji-dropdown .emoji-category{position:relative}.emoji-dropdown .menu-horizontal-div{align-items:center;height:var(--menu-height);min-height:var(--menu-height);width:100%}.emoji-dropdown .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:2.5rem;line-height:2.5rem;padding:0;width:2.5rem}.emoji-dropdown .stickers-padding .category-title{cursor:pointer}.emoji-dropdown .stickers-padding .category-items{padding:0 .3125rem}.emoji-dropdown .stickers-padding .menu-wrapper{background-color:#fff;background-color:var(--surface-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);height:var(--menu-height);max-width:100%;padding:0;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto;margin:0 .3125rem;padding:.25rem}.emoji-dropdown .stickers-padding .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}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%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@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;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:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.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;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-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{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;left:0;line-height:32px!important;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 .chatlist-chat{padding-bottom:.75rem;padding-top:.75rem}@media only screen and (max-width:600px){.selector .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px!important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;pointer-events:none;position:absolute;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{cursor:pointer;flex:1 0 auto;height:100px;margin:2.5px;max-width:100%;position:relative}.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{-webkit-animation:rotate 1s linear infinite;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{-webkit-animation:none;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{-webkit-animation:rotate 2s linear infinite;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{-webkit-animation:rotate 1s linear infinite!important;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}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-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 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}}@-webkit-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 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}}@-webkit-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%}}@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;-ms-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{-webkit-animation:ripple-effect .7s forwards;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}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}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(25px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;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 path{fill:#fff}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-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;-o-object-fit:cover;object-fit:cover;width:100%!important}.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}.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;height:var(--size);position:absolute;right:0;top:0;width:var(--size)}.document-download,.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.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,.15)}.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);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);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{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;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)}.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;text-align:left;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{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;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{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;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{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;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{-webkit-animation:eye 1.8s ease-in-out infinite;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{-webkit-animation:eye-move 1.8s ease-in-out infinite;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}@-webkit-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 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)}}@-webkit-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 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)}}@-webkit-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 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)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-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{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)}}@-webkit-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%)}}@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;-ms-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{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}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;text-align:right;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;-webkit-animation:pollAnswerRotate .65s linear infinite;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;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{-webkit-animation:none;animation:none;display:flex!important;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)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;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{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;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{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;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{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;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{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-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)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@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}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row a{position:relative;z-index:1}.row-title-row{align-items:center;display:flex;justify-content:space-between;order:0}.row-title-row .row-title{flex:1 1 auto;white-space:nowrap}.row-title,.row-title-row .row-title{overflow:hidden;text-overflow:ellipsis}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word}.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;margin-top:-.125rem;pointer-events:none;position:absolute}.row-with-padding .row-subtitle:not(:empty):not(.hide)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem 0 0;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:.875rem!important;line-height:18px;line-height:var(--line-height-14);margin-bottom:.0625rem;margin-top:.125rem;order:1}.row-subtitle:empty{display:none}.row-media{align-items:center;display:flex;height:3rem!important;justify-content:center;left:.5rem;margin:0!important;position:absolute!important;width:3rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.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:-webkit-grab;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{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;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);width:26.25rem!important;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}.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:#2a9ef1;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{-webkit-animation:waves-animation 3s infinite;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{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;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;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@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);position:relative}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit!important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation,.message:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation{position:absolute}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-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{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) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.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;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}.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:scale3d(0,0,0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scaleX(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;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)}.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;position:fixed!important;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;-ms-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)}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0;padding:0 1rem 0 1.5rem}.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}.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}.popup-buttons .btn+.btn{margin-right:.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}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.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-weight:400;height:36px;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-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-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.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{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.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}.popup-peer .popup-container{max-width:min(400px,100%);padding:.75rem .5rem}.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:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width: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;-ms-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 .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set-stickers{display:grid;grid-template-columns:repeat(5,1fr);padding:0 5px}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4,1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{cursor:pointer;height:80px;height:var(--esg-sticker-size);justify-self:center;margin-bottom:2px;position:relative;width:80px;width:var(--esg-sticker-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker: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;-ms-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;-ms-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;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;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;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:3px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1;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:1.25rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .selector .chatlist-chat{height:3.875rem!important;padding-bottom:.5rem!important;padding-top:.5rem!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;-ms-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;-ms-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:1em -.5rem .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;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{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.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{align-items:center;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-muted-icon-container{flex:0 0 auto}.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;margin-left:.75rem}.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-participants .dialog-subtitle{margin-top:-.25rem}.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;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.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{--additional-height:.75rem;--reaction-size:1.5rem;--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{align-items:center;display:flex;font-size:1.25rem!important;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{height:1.5rem;margin:0;top:50%;transform:translateY(-50%);width:1.5rem}.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}.popup-payment .input-field{--height:3rem;margin:1.25rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.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}.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;display:inline;font-weight:inherit!important}.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-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}#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{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.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}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.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}.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 .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.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;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;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 .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100);overflow:hidden}}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{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@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)}.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)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:22.5rem;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast b{color:inherit}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.user-last-message b{font-weight:400}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#72d5fd,#2a9ef1);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:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);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}.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;text-align:left}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}.phone-code{color:#9e9e9e;text-align:right}.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}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@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:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right: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;-ms-user-select:text;user-select:text;white-space:pre-wrap}[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,80px);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;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@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;-ms-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{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;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{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;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{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;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-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;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.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-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.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;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:.875rem;margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;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}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{grid-column-gap:2.44px;display:grid;font-size:2.125rem;grid-template-columns:repeat(auto-fill,2.625rem);justify-content:space-between;line-height:2.125rem}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:2.625rem;line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem}.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%}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)}.tgico-char:before{font-family:Roboto!important;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-icon{line-height:1!important;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{margin-left:.125rem}.premium-icon,.verified-icon{flex:0 0 auto;height:1.25rem;width:1.25rem}.premium-icon{line-height:1!important;margin-left:.25rem}.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);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.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} - -/*# sourceMappingURL=main.e68bddf9c70fe3a738bd.css.map*/ \ No newline at end of file diff --git a/public/main.e68bddf9c70fe3a738bd.css.map b/public/main.e68bddf9c70fe3a738bd.css.map deleted file mode 100644 index 821bfd85d..000000000 --- a/public/main.e68bddf9c70fe3a738bd.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.e68bddf9c70fe3a738bd.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;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}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;-ms-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{left:50%;position:absolute!important;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}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:.25s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--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:.2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out:.2s 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-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-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:1.3125;--line-height-20:23px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--esg-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;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--peer-avatar-red-top:#ff885e;--peer-avatar-red-bottom:#ff516a;--peer-avatar-orange-top:#ffcd6a;--peer-avatar-orange-bottom:#ffa85c;--peer-avatar-violet-top:#82b1ff;--peer-avatar-violet-bottom:#665fff;--peer-avatar-green-top:#a0de7e;--peer-avatar-green-bottom:#54cb68;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#72d5fd;--peer-avatar-blue-bottom:#2a9ef1;--peer-avatar-pink-top:#e0a2f3;--peer-avatar-pink-bottom:#d669ed}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-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-text-color:#000;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-blue-top);--avatar-color-bottom:var(--peer-avatar-blue-bottom);--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);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-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-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-audio-play-button-color:#fff;--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-text-color:#fff;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--avatar-online-color:#0ac630;--avatar-color-top:var(--peer-avatar-violet-top);--avatar-color-bottom:var(--peer-avatar-violet-bottom);--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-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--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:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?js2svd) format(\"truetype\"),url(assets/fonts/tgico.woff?js2svd) format(\"woff\"),url(assets/fonts/tgico.svg?js2svd#tgico) format(\"svg\")}.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-family:tgico!important;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-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-help: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-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-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-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-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools: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}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;left:1rem;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;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:2}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;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;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}:-ms-input-placeholder{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{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}@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){.input-search{margin-left:1rem}}.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);max-height:var(--height)!important;min-height:var(--height)!important;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:-ms-input-placeholder~.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:24px;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}.input-search>.tgico-search{height:24px;left:.8125rem;pointer-events:none;width:24px}.input-search>.tgico-close{height:42px;right:0;width:42px;z-index:1}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{max-height:var(--height);padding-right:2.5rem}.input-field-password .input-field-input[type=password]{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{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;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,background-color .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.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;padding:0!important;position:absolute!important;right:var(--offset);text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.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{-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%,.75);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%;transform:scale(.8)!important;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:3}.btn-menu-old{-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{--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;transform:none!important}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-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;transform:scaleX(1)!important;visibility:visible}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right{bottom:100%;left:0;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}.btn-menu-item{--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);cursor:pointer!important;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:0 .3125rem;padding:0 var(--padding-right) 0 var(--padding-left);pointer-events:all!important;position:relative;text-align:left;text-transform:none;transform:scale(1);white-space:nowrap}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{color:#000;color:var(--primary-text-color);font-size:var(--icon-size)}.btn-menu-item-icon,.btn-menu-item:before{margin-right:var(--icon-margin);position:relative}.btn-menu-item-icon{flex:0 0 auto}@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{margin-top:1px;pointer-events:none}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));margin-left:var(--margin-left);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{font-size:.875rem}.btn-menu-item-header,.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color)}.btn-menu-item-header{font-weight:500;font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute;right:.5rem}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.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;margin:.5rem 0;padding:0}.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%,.75);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}.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-left:var(--other-side-offset);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}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-left:var(--menu-offset);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:background-color .2s,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}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto;right:15px}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.btn-control{align-items:center;border-radius:20px;display:flex;height:40px;margin:15px auto 1rem;padding:0 24px 0 12px;width:auto}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3.5rem;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)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right: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;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)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);padding:0 2rem!important;right:auto;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{-webkit-animation:hide-icon .4s ease-in-out forwards;animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{-webkit-animation:none!important;animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;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){-webkit-animation-name:fade-in-opacity;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;-ms-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{border-radius:.75rem;color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;line-height:1.25rem!important;min-width:1.25rem;padding:0 .375rem}.badge-24{height:1.5rem;line-height:1.5rem!important;min-width:1.5rem;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.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;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;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}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;text-align:left;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}}.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;text-align:left}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);left:var(--offset-left);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;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}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);padding-left:3.375rem;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}.checkbox-field.hover-effect .checkbox-box{left:auto}.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}.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;text-align:left}.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)}.radio-field .radio-field-main{color:inherit;padding-left:3.5rem;position:relative}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);left:var(--offset-left);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}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;left:calc(var(--offset-left) + .3125rem);transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}.radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}.radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[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;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.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;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}.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;-ms-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:4px 0 0}.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);flex-direction:column;margin:0;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist,.chatlist-chat{display:flex;position:relative}.chatlist-chat{--background:unset;-webkit-user-drag:none;align-items:flex-start;background:var(--background);border-radius:10px;cursor:pointer;flex-direction:row;height:72px;overflow:hidden;padding:.5625rem}@media only screen and (max-width:600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{align-items:flex-start;display:flex;flex-direction:row;height:27px;margin:0}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background:var(--light-secondary-text-color)}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-caption,.chatlist-chat.active .user-title{color:#fff}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active b{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-background{fill:#fff!important}.chatlist-chat.active .verified-check{fill:#3390ec!important;fill:var(--primary-color)!important}.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;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist-chat span{line-height:27px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;margin-left:.5rem;padding:1px 0 0}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto;margin-left:.5rem;margin-right:-3px;margin-top:4px}.chatlist .dialog-subtitle-media{border-radius:.125rem;display:inline-block;flex:0 0 auto;height:1.25rem;margin-right:.375rem;margin-top:-.125rem;position:relative;vertical-align:middle;width:1.25rem}.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;height:inherit;-o-object-fit:cover;object-fit:cover;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 .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);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 .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s 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 .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);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 .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s 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 .user-caption{color:#707579;color:var(--secondary-text-color);flex:1 1 auto;overflow:hidden;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:4px;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}.chatlist .user-last-message i,.chatlist .user-title i{font-style:normal}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-right:.125rem;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;padding:0}html.is-mac .chatlist .mention{line-height:22px!important}.chatlist .mention-badge{margin-right:-2px}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.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;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{align-items:center;height:4.5rem;padding:0 .75rem}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto!important}.chatlist-new span{line-height:1.3125!important;line-height:var(--line-height)!important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width:600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width:600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-last-message b,.contacts-container .user-title,.contacts-container b,.search-group-contacts .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b{font-weight:400}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width:600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.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;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;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;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 .input-message-input{background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}.chat-input .btn-record-cancel{background-color:#df3f40!important;background-color:var(--danger-color)!important;opacity:0;padding:0;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal)*-1 - .5rem));visibility:hidden;z-index:3}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;right:5px;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{-webkit-animation:hide-icon .4s ease-in-out forwards!important;animation:hide-icon .4s ease-in-out forwards!important}.chat-input .float{align-self:center;display:none!important;margin:0 .75rem 0 0!important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){.chat-input .float{margin-right:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute;right:var(--padding-horizontal)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:color .2s,background-color .2s,opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;z-index:3}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.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{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{color:#fff!important;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:0 9px;width:10px}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(0,0,0,.2);border-radius:50%;height:300px;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}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper,.chat-input .new-message-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}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}@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{bottom:0;left:0;position:fixed!important;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{align-items:center;display:flex!important;flex-direction:column;transition:transform .25s ease-in-out,filter .25s 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;-ms-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{bottom:0;left:0;position:absolute!important;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{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@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{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;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.is-right-column-shown .chat-background-item{transform:scale(.666666667);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}}.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:overlay}.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){body.is-right-column-shown .chat .drops-container{right: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.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:12px;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,.18);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}}.chat-input-control-button:before{margin-right: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;-ms-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}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;margin:0 5px 0 6px;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}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}.fake-rows-wrapper{left:var(--padding-horizontal);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}.rows-wrapper{border-bottom-right-radius:0;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}}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;right:-8.4px;transform:scaleX(-1);width:11px}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important;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:.75rem;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;-ms-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:0 .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 .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);left:3.125rem;top:auto;transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0 var(--icon-margin) 0 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){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}}.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}.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;margin-left:var(--commands-margin-left);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}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);margin-left:var(--send-as-margin-left);width:var(--send-as-size)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;left:calc(var(--padding-horizontal)*-1 - .25rem)!important;max-height:20rem;max-width:20rem;right:auto;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}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right: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:50%;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{display:flex;flex-direction:column;justify-content:center;line-height:1!important;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))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));padding-right:var(--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 .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%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin:0 var(--button-horizontal-margin) 5px;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.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.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.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat.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.is-chat .is-in .bubble-content-wrapper{margin-left: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:not(.is-channel) .message{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,.bubbles-go-mention{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{--translateY:0;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.is-visible{cursor:pointer;opacity:1;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;visibility:visible}.bubbles-corner-button{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:50%;bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;overflow:visible;position:absolute;right:var(--chat-input-padding);z-index:2}body.animation-level-0 .bubbles-corner-button{transition:none!important}.bubbles-corner-button .badge{position:absolute;right:-.25rem;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){.bubbles-corner-button .badge{right:.1875rem;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{--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;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;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}.chat:first-child .topbar .chat-info{padding-left:.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;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}}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden;padding-left:49px}@media only screen and (max-width:600px){.topbar .chat-info{padding-left: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}}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;margin-right:.5rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden;padding-left:1.125rem}.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}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{color:#fff;cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;left:1px;min-height:auto!important;position:absolute;right:0;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){.topbar-call-container{left: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}.topbar-call-left .btn-icon{margin-right:.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}@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%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@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{bottom:.25rem;cursor:pointer;pointer-events:all;position:-webkit-sticky!important;position:sticky!important;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{display:flex;flex-wrap:wrap;margin:0 auto .25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-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:-.125rem;content:\" \";left:-50%;position:absolute;top:-.125rem;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{-webkit-animation:bubbleSelected 2s linear;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(.125rem + 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{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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;-ms-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;-ms-user-select:text;user-select:text}.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:-.125rem;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{opacity:.99999;padding-bottom:.25rem;pointer-events:none;position:-webkit-sticky;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.type-chat .bubble.is-date .bubble-content,.chat.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{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.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);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}.bubble-view-button{border:1px solid #3390ec;border:1px solid var(--primary-color);border-radius:6px;height:2rem;margin:0 .5625rem .5rem;width:auto}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:-webkit-min-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;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.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{max-height:-webkit-fit-content!important;max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.5rem;padding-top:.5rem}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker) .attachment{cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none!important;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{margin-left:auto;position:relative!important;right:0!important}.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;-ms-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{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;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:-webkit-max-content;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;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 .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;flex-direction:column;padding:.75rem 1rem .875rem!important}.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;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{cursor:pointer;height:200px;margin-top:.75rem!important;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;-ms-user-select:none;user-select:none;width:-webkit-max-content;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:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-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 .25rem .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}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 .name,.bubble.just-media .reply{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin-bottom:0;max-width:15rem;padding:10px;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .name,.bubble.just-media .reply{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:1.3125;line-height:var(--line-height);padding:.3125rem .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{margin-top:0;max-width:none!important;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{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: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;width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important;width:280px}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;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;-ms-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;-ms-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-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.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:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:rgba(0,0,0,.06);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.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,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;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,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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:-.125rem}.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:-.125rem}.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{background-color:#fff;background-color:var(--message-background-color);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 .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:18px;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}.bubble.is-message-empty.with-replies:not(.sticker) .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:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;height:12px;line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-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;display:flex;height:12px;line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:12px;color:#fff;display:flex;font-size:12px;height:1.125rem;left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:1.25rem;padding:0 1px 0 3px}.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;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:.875rem;font-weight:500!important;font-weight:var(--font-weight-bold)!important;line-height:1.25rem;max-width:100%;overflow:hidden;padding:.3125rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .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):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;-ms-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.1875rem;min-width:15rem;padding:0 .5rem;position:relative}.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;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.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:.9375rem;justify-content:center;line-height:1.25rem;padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-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:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{cursor:pointer;text-decoration:underline}.bubble.service .service-msg .peer-title{cursor:pointer}.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}.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 .name,.bubble.is-in.just-media .reply{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .name,.bubble.is-in.just-media .reply{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{color:#707579;color:var(--secondary-text-color);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(--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);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}.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 .name,.bubble.is-out.just-media .reply{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;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;line-height:16px;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 .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:#eeffde;color:var(--message-out-background-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.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{width:100%}.reply-markup-row{border-radius:.375rem;display:flex;margin-top:.3125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:inherit;color:#fff!important;cursor:pointer;font-size:.875rem;outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button.anchor-url{text-decoration:none!important}.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}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.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-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.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{align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;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:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{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:2rem;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;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;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;margin-top:-.125rem}.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.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;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:80px;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{height:50px;padding:.25rem 0!important}.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:.1875rem}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;-ms-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;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.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{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(80px,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{left:0;position:absolute!important;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{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;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);-webkit-animation:drop-outline-move .5s linear infinite;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}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}.bot-commands,body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;-webkit-animation:none!important;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!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,.18);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{align-items:flex-start;border-radius:0!important;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%}.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:0 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding:0 .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);padding-left:1.5rem}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{height:2.5rem;overflow:inherit!important;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;-ms-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}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;left:1.5rem;pointer-events:none;position:absolute}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{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}}.profile-change-avatar{--size:3.375rem;position:absolute!important;right:1.25rem;top:calc(var(--size)/-2);transform:none;transition:none!important}.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:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-webkit-min-content;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}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;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:3.5rem;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,3.5rem);--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;-ms-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}.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;transition:none!important}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:calc(-.6875rem - 6px);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 .25s 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 .25s 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: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}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;right:-1px;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-size:3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size:var(--menu-size);background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;padding:0 0 5px;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main .input-search .selector-user{height:30px;left:6px;line-height:1.875rem;margin-left:0;position:absolute!important;top:6px;z-index:1}#column-left .item-main .input-search.is-picked .input-search-input{padding-left: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}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width:600px){#column-left .item-main .search-helper{margin-left: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{flex:0 0 auto;position:relative!important}#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{--offset-top:-3px;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;transition:opacity .2s,background-color .15s;visibility:hidden;z-index:2}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,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);width:300px}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding-bottom:1px;padding-left:4px}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:98px;margin:0 5px 0 0;max-width:78px;padding:12px 0 0!important;width:78px}@media only screen and (max-width:600px){#column-left .search-group-people .chatlist-chat{max-width:77px;width:77px}}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .user-caption{font-size:12px;max-width:65px;padding:2px 0 9px}@media only screen and (max-width:600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center;overflow:visible}#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{-webkit-animation:grow-icon .4s ease-in-out forwards!important;animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;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))}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;padding-left:4.5rem;text-align:left;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}#column-left .connection-status-button .preloader-container{height:1.5rem;left:1rem;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{padding:0 .25rem;width:100%}}#search-container{display:flex;top:-3px!important}#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}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-left:23px;margin-top:14px;padding-right:24px}.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;-ms-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;line-height:1.3125;line-height:var(--line-height);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}.chat-folders-container .row .btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding:0 .75rem;position:absolute;right:1rem;top:50%;transform:translateY(-50%);transition:width .2s;width:auto}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.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-list .chatlist-chat{height:50px;padding:9px 12px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:400}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.folder-category-button{height:50px}.included-chatlist-container .selector .chatlist-chat,.popup-forward .selector .chatlist-chat{height:3.75rem;padding:7px .75rem!important}.included-chatlist-container .selector .chatlist .user-caption,.popup-forward .selector .chatlist .user-caption{margin-top:-2px;padding:0 0 0 14px}.included-chatlist-container .selector .chatlist .user-last-message,.popup-forward .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.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}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left: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 .chatlist-chat{height:62px;padding-bottom:7px;padding-top:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.search-group-recent .dialog-avatar{--size:46px;--multiplier:1.173913}.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{box-shadow:none;padding-top:0!important}.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}.sidebar-left-section-content>.checkbox-field .checkbox-box{left: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-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{opacity:.25;pointer-events:none!important}.sidebar-left-section .media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.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;-ms-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}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.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{margin-top:0;padding-bottom:.9375rem;padding-top:1rem}.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)}.blocked-users-container .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}@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 .grid-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 .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.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;-ms-user-select:none;user-select:none;width:21rem!important}.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}.empty-placeholder .btn-control:before{margin-right:.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}#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{max-width:100%;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 .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{bottom:14px;height:54px;position:fixed!important;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{--padding-horizontal:.25rem;flex:1 1 auto;padding:.25rem 0;width:auto}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);box-shadow:none!important;position:-webkit-sticky!important;position:sticky!important;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;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{padding:0;position:absolute!important;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:1}.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{margin:0;position:absolute;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{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-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-.375rem}.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 li: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;-ms-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{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{color:#707579;color:var(--secondary-text-color);float:left;font-size:24px;padding-left:16.5px;padding-right:32px}#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{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:400}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width:601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem;padding:0 .75rem}.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;padding-bottom:1rem}.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}.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{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.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{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;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 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;-ms-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;max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.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 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{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;position:fixed!important;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;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.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;-ms-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;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{--menu-height:3.0625rem;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;-ms-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{border-radius:10px;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;position:absolute!important;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);width:26.25rem!important;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-container .menu-horizontal-div{background-color:#fff;background-color:var(--surface-color);z-index:4}.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-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 1rem}.emoji-dropdown .category-title{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);line-height:18px;line-height:var(--line-height-14);padding:.8125rem .875rem .6875rem;position:relative;width:100%}.emoji-dropdown .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{height:1px;top:0}.emoji-dropdown .tabs-container .tabs-tab{flex-direction:column;height:100%;min-height:100%}.emoji-dropdown .tabs-container .emoticons-content{background-color:#fff;background-color:var(--surface-color);flex:1;padding:0;position:relative}.emoji-dropdown .emoji-padding .super-emojis{padding:0 .5rem}@media only screen and (max-width:600px){.emoji-dropdown .emoji-padding .menu-horizontal-div-item{flex:initial;padding:0}}.emoji-dropdown .emoji-category{position:relative}.emoji-dropdown .menu-horizontal-div{align-items:center;height:var(--menu-height);min-height:var(--menu-height);width:100%}.emoji-dropdown .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:2.5rem;line-height:2.5rem;padding:0;width:2.5rem}.emoji-dropdown .stickers-padding .category-title{cursor:pointer}.emoji-dropdown .stickers-padding .category-items{padding:0 .3125rem}.emoji-dropdown .stickers-padding .menu-wrapper{background-color:#fff;background-color:var(--surface-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);height:var(--menu-height);max-width:100%;padding:0;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto;margin:0 .3125rem;padding:.25rem}.emoji-dropdown .stickers-padding .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}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%}@-webkit-keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}@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;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:0 1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}.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;margin-left:-.25rem;margin-right:.75rem;max-width:11.25rem;overflow:hidden;padding:0 17px 0 0;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-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{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;left:0;line-height:32px!important;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 .chatlist-chat{padding-bottom:.75rem;padding-top:.75rem}@media only screen and (max-width:600px){.selector .chatlist-chat{height:66px;padding-bottom:9px;padding-top:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px!important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;top:50%;transform:translateY(-50%);z-index:1}.selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}.selector .checkbox-field-round{--size:1.25rem;pointer-events:none;position:absolute;right:1.125rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{cursor:pointer;flex:1 0 auto;height:100px;margin:2.5px;max-width:100%;position:relative}.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{-webkit-animation:rotate 1s linear infinite;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{-webkit-animation:none;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{-webkit-animation:rotate 2s linear infinite;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{-webkit-animation:rotate 1s linear infinite!important;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}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}@-webkit-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 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}}@-webkit-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 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}}@-webkit-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%}}@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;-ms-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{-webkit-animation:ripple-effect .7s forwards;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}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}avatar-element{--size:54px;--multiplier:1;--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:var(--size)}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(25px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;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 path{fill:#fff}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-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;-o-object-fit:cover;object-fit:cover;width:100%!important}.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}.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;height:var(--size);position:absolute;right:0;top:0;width:var(--size)}.document-download,.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.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,.15)}.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);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);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{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;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)}.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;text-align:left;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{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:dotMiddle;animation-name:dotMiddle;-webkit-animation-timing-function:linear;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{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;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{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{-webkit-animation:recordBlink 1.25s infinite;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{-webkit-animation:eye 1.8s ease-in-out infinite;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{-webkit-animation:eye-move 1.8s ease-in-out infinite;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}@-webkit-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 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)}}@-webkit-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 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)}}@-webkit-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 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)}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@-webkit-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{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)}}@-webkit-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%)}}@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;-ms-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{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}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;text-align:right;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;-webkit-animation:pollAnswerRotate .65s linear infinite;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;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{-webkit-animation:none;animation:none;display:flex!important;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)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{-webkit-animation-fill-mode:forwards!important;animation-fill-mode:forwards!important;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{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;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{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;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{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;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{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-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)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}@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}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none!important}.row a{position:relative;z-index:1}.row-title-row{align-items:center;display:flex;justify-content:space-between;order:0}.row-title-row .row-title{flex:1 1 auto;white-space:nowrap}.row-title,.row-title-row .row-title{overflow:hidden;text-overflow:ellipsis}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word}.row-title-right{flex:0 0 auto!important;margin-left:1rem}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;left:1rem;margin-top:-.125rem;pointer-events:none;position:absolute}.row-with-padding .row-subtitle:not(:empty):not(.hide)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}.row .checkbox-field,.row .radio-field-main{margin-left:-3.375rem;padding-left:3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}.row .checkbox-field{height:auto;margin-right:0}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0 .125rem 0 0;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:.875rem!important;line-height:18px;line-height:var(--line-height-14);margin-bottom:.0625rem;margin-top:.125rem;order:1}.row-subtitle:empty{display:none}.row-media{align-items:center;display:flex;height:3rem!important;justify-content:center;left:.5rem;margin:0!important;position:absolute!important;width:3rem!important}.row-media-small{height:2rem!important;left:.75rem!important;width:2rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:380px}.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:-webkit-grab;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{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:block!important;max-height:26.25rem;max-width:100%;opacity:0;padding:.625rem!important;position:absolute!important;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);width:26.25rem!important;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}.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:#2a9ef1;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{-webkit-animation:waves-animation 3s infinite;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{-webkit-animation:waves-animation 5s infinite;animation:waves-animation 5s infinite;-webkit-animation-delay:2s;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;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}@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);position:relative}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit!important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation,.message:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation{position:absolute}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-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{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) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.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;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}.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:scale3d(0,0,0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scaleX(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;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)}.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;position:fixed!important;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;-ms-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)}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0;padding:0 1rem 0 1.5rem}.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}.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}.popup-buttons .btn+.btn{margin-right:.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}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem;text-align:left}.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-weight:400;height:36px;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-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-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.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{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.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}.popup-peer .popup-container{max-width:min(400px,100%);padding:.75rem .5rem}.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:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width: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;-ms-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 .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set-stickers{display:grid;grid-template-columns:repeat(5,1fr);padding:0 5px}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4,1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{cursor:pointer;height:80px;height:var(--esg-sticker-size);justify-self:center;margin-bottom:2px;position:relative;width:80px;width:var(--esg-sticker-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker: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;-ms-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;-ms-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;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;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;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:3px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1;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:1.25rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .selector .chatlist-chat{height:3.875rem!important;padding-bottom:.5rem!important;padding-top:.5rem!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;-ms-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;-ms-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:1em -.5rem .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;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{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.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{align-items:center;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-muted-icon-container{flex:0 0 auto}.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;margin-left:.75rem}.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-participants .dialog-subtitle{margin-top:-.25rem}.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;-ms-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.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{--additional-height:.75rem;--reaction-size:1.5rem;--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{align-items:center;display:flex;font-size:1.25rem!important;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{height:1.5rem;margin:0;top:50%;transform:translateY(-50%);width:1.5rem}.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}.popup-payment .input-field{--height:3rem;margin:1.25rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.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}.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;display:inline;font-weight:inherit!important}.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-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}#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{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.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}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px;text-align:left}.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}.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 .subtitle{margin-top:0}.page-chats{display:flex;max-width:1682px!important}.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;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;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 .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100);overflow:hidden}}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{-webkit-animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}@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)}.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)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:22.5rem;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast b{color:inherit}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:500;font-weight:var(--font-weight-bold)}.user-last-message b{font-weight:400}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit-canvas{background:linear-gradient(#72d5fd,#2a9ef1);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:48px;left:50%;line-height:48px;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);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}.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;text-align:left}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}.phone-code{color:#9e9e9e;text-align:right}.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}}.phone-edit{cursor:pointer;display:inline-block;font-size:1.5rem;height:24px;margin-left:.4rem;opacity:.5;transition:opacity .2s;width:24px}@media only screen and (max-width:600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}@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:not(.is-safari) span.emoji{margin-right:5px!important}html:not(.is-safari) avatar-element span.emoji{margin-right: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;-ms-user-select:text;user-select:text;white-space:pre-wrap}[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,80px);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;-ms-user-select:none;user-select:none}@media only screen and (min-width:601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;font-size:24px;padding-left:16px;padding-right:32px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@-webkit-keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@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;-ms-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{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;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{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;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{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;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-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;padding:0 .375rem}.media-round .video-time:after,.media-round .video-time:before{margin-left:.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-header.with-border{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);min-height:3.5625rem}.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;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:.875rem;margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;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}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{grid-column-gap:2.44px;display:grid;font-size:2.125rem;grid-template-columns:repeat(auto-fill,2.625rem);justify-content:space-between;line-height:2.125rem}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:2.625rem;line-height:inherit;margin:0 .0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem}.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%}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)}.tgico-char:before{font-family:Roboto!important;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-icon{line-height:1!important;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{margin-left:.125rem}.premium-icon,.verified-icon{flex:0 0 auto;height:1.25rem;width:1.25rem}.premium-icon{line-height:1!important;margin-left:.25rem}.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);line-height:1!important;margin:0 .25rem;padding:.125rem .25rem}.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}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.8a161a7807437aff19b2.chunk.js b/public/mtproto.worker.8a161a7807437aff19b2.chunk.js new file mode 100644 index 000000000..8f733f586 --- /dev/null +++ b/public/mtproto.worker.8a161a7807437aff19b2.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,a,s,n,i,r={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;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))}},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(m?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),g=t(p.objectStore(s)),m=Array.isArray(g),h=m?g:[].concat(g);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},4898:(e,t,a)=>{a.d(t,{r:()=>Bs,H:()=>xs}),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",(e=>{this.premium=e})),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}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const g=new l;d.GO.rootScope=g;const m=g;var h=a(7922);const u=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(".");(function(e,t){const a=t.split(".");let s=e;return a.forEach((e=>{e&&(s=s[e])})),s}(e,s.slice(0,-1).join(".")))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&m.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 y=a(4159),_=a(3725),v=a(5418),b=a(1267),P=a(1655),M=a(5003);class S{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=M.v9.Error|M.v9.Log;this.debug&&(s|=M.v9.Debug),this.log=(0,M.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,N.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=M.v9.Error|M.v9.Log;return this.debug&&(s|=M.v9.Debug),this.log=(0,M.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 C(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var w=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 k{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 w(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(C(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;C(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)=>w(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 w(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 A=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 D=a(9174);function U(e){const t=e.length,a=new Array(t);for(let s=0;sT(this,void 0,void 0,(function*(){this.connected=!0,N.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(D.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>T(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:",U(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(D.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=M.v9.Error|M.v9.Log;this.debug&&(i|=M.v9.Debug),this.log=(0,M.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&N.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 T(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 R=b.Z.test?"_test":"";function x(e){return"client"===e?"":"-1"}function B(e,t,a){const s=x(t),n="client"!==t?"apiws"+R+(a?"_premium":""):"apiws"+R;return`wss://${y.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class V{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=B(e,t,a);let n;return n=I,new F(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=x(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,P.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 O 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 V,a=this.transports={https:t.chooseServer(y.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(y.Z.baseDcId,"client","websocket",!1)},s=(0,_.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,_.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,v.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 N=new O,Z=(0,_.Z)();var q=a(6654);class G{setManagers(e){Object.assign(this,e)}}var j=a(3127),H=a(3989),W=a(5466);let z;function K(e){return null!=z?z:z=function(e){return t=this,a=void 0,n=function*(){const t=(0,W.$)((0,M.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 $ 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 C(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 Q=a(6848),Y=a(5471);class X extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,M.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[U(e)]=e;for(const e of a)if((0,Q.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[U(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,Q.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[U(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.wrapSingleMessage(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;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=U(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=U(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,Y.Z)("NO_NEW_CONTEXT")}))}}var ee=a(7298),te=a(5082),ae=a(252),se=a(7625),ne=a(6519);function ie(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 re=a(2790),oe=a(3781),pe=a(3385),de=a(5880),fe=a(8050),ce=a(2946);function le(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,ce.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,ce.Z)(e)))),new Set(s.filter(Boolean))}function ge(e,t){const a={writable:!0,configurable:!0},s={};t.forEach((t=>{e.hasOwnProperty(t)||(s[t]=a)})),Object.defineProperties(e,s)}function me(e,t,a){return e[t]=a}const he=void 0;class ue extends G{constructor(){super(...arguments),this.folders={},this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.setDialogsLoaded(o.J$,!1),this.setDialogsLoaded(o.Zi,!1),this.setDialogsLoaded(he,!1);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new te.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(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);n&&(e.pFlags.pinned?n.pFlags.pinned=!0:this.handleDialogUnpinning(n,a),this.generateIndexForDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(s,n)},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=e=>{this.resetPinnedOrder(a),this.pinnedOrders[a].push(...e),this.savePinnedOrders(),e.reverse(),e.forEach((e=>{n[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))}));const t=this.getFolderDialogs(a,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;n[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},n={};e.order?s(e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),s(e.dialogs.map((e=>e.peerId)))}))}}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.processDialogForFilters(e),this.prepareDialogUnreadCountModifying(e)()})),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.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),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.pinnedOrders[t];s.splice(0,s.length,...a)}t.length&&H.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.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,P.Z)(this.pinnedOrders[t],e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.pinnedOrders[e].length=0}getPinnedOrders(e){return this.pinnedOrders[e]}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==he||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 ge(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}getFolderDialogs(e,t=!0){if(e===he)return this.getCachedDialogs(t);const a=this.getFolder(e);return 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(o.DZ.has(e))return(0,pe.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,pe.Z)(t.localId)}isPeerUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted(e,!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=o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=a.pinnedPeerIds.indexOf(e.peerId);i=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(a.pinnedPeerIds.length-1-t),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||r?this.generateIndexForDialog(e,!0,void 0,!r):null!==(n=(0,fe.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return me(e,t,i)}getDialog(e,t,a=!0){const s=[];void 0===t?s.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):s.push(this.getFolderDialogs(t,!1));for(const t of s){let s=0,n=0;for(let i=t.length;st.peerId===e.peerId)),i=s[n],r=this.getDialogIndex(i,a),o=this.setDialogIndexInFilter(e,a,t);return r!==o&&((!r&&o||n&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==n&&s.splice(n,1),o&&(0,ne.Z)(s,e,(e=>this.getDialogIndex(e,a)),-1),!0)}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],a=this.filtersStorage.getFilters();for(const s in a){const n=a[s];this.filtersStorage.testDialogForFilter(e,n)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(n.id,e))}return()=>t.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isPeerUnmuted(t.peerId);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isPeerUnmuted(t.peerId),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){const i=this.getFolder(e);t&&(i.unreadMessagesCount=Math.max(0,i.unreadMessagesCount+t));const{peerId:r}=n;a?i.unreadPeerIds.add(r):i.unreadPeerIds.delete(r),s?i.unreadUnmutedPeerIds.add(r):i.unreadUnmutedPeerIds.delete(r),void 0===i.dispatchUnreadTimeout&&(i.dispatchUnreadTimeout=E.Z.setTimeout((()=>{i.dispatchUnreadTimeout=void 0;const e=Object.assign({},i);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e)}),0))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;let i,r=0;if(e.pFlags.pinned&&!s)r=this.generateDialogPinnedDate(e),i=!0;else{a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),r=(null==a?void 0:a.date)||r;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!r||e.date&&e.date>r)&&(r=e.date)}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>r&&(r=e.draft.date)}r||(r=(0,ee.Z)(!0));const o=this.generateDialogIndex(r,i);if(t)return o;me(e,(0,pe.Z)(e.folder_id),o)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id];let a=t.indexOf(e.peerId);return-1===a&&(t.unshift(e.peerId),a=0,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(t.length-1-a)}setDialogToState(e){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)})),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t=new Map;e.dialogs.forEach((e=>{var a,s,n;const i=this.appPeersManager.getPeerId(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];o&&(!r||(null===(a=this.appMessagesManager.getMessageByPeer(i,o))||void 0===a?void 0:a.date)>(null===(s=this.appMessagesManager.getMessageByPeer(i,r))||void 0===s?void 0:s.date))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o),r||"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)?(this.saveDialog(e),t.set(i,e)):this.dropDialogWithEvent(i);const p=this.appMessagesManager.newUpdatesAfterReloadToHandle[i];if(void 0!==p){for(const e of p)p.delete(e),this.apiUpdatesManager.saveUpdate(e);p.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[i]}})),t.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}saveDialog(e,t,a,s){var n,i;void 0===t&&(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const p=this.appPeersManager.isChannel(r)?r.toChatId():o.NM;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left)return}const d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const f=this.getDialogOnly(r);let c,l;if(e.top_message){c=(0,oe.Z)(e.top_message);const t=(null==f?void 0:f.top_message)&&this.appMessagesManager.getMessageByPeer(r,f.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&f.top_message>=c&&(c=f.top_message),l=this.appMessagesManager.getMessageByPeer(r,c)}else c=this.appMessagesManager.generateTempMessageId(r),l={_:"message",id:c,mid:c,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([l],{isOutgoing:!0});if((null==l?void 0:l.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,l),!p&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=a,this.appMessagesManager.migratedToFrom[a]=r,e.migratedTo=a}}if(e.top_message=c,e.read_inbox_max_id=(0,oe.Z)(f&&!e.read_inbox_max_id?f.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,oe.Z)(f&&!e.read_outbox_max_id?f.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=f?f.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,l&&l.pFlags.is_outgoing){const t=l.pFlags.out;c>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(l.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete l.pFlags.unread}const g=this.appMessagesManager.getHistoryStorage(r),m=g.history.slice;if(m.length?m.isEnd(ae.D.Bottom)||(g.history.insertSlice([c]).setEnd(ae.D.Bottom),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,l)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r})):(g.history.unshift(c),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,l)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r})),g.maxId=c,g.readMaxId=e.read_inbox_max_id,g.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),p&&e.pts&&this.apiUpdatesManager.addChannelState(p,e.pts),this.generateIndexForDialog(e),f){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(f);ie(f,e),t()}this.pushDialog(e,null==l?void 0:l.date,a,s)}getDialogs(e="",t,a=20,s=0,n=!1){if(!o.DZ.has(s)){const i=[],r=this.appUsersManager.fillContacts();r.cached||i.push(r.promise);const o=this.filtersStorage.reloadMissingPeerIds(s);if(o&&i.push(o),i.length)return Promise.all(i).then((()=>this.getDialogs(e,t,a,s,n)))}const i=!o.DZ.has(s)||this.getOffsetDate(s)?he:s;let r=this.getFolderDialogs(s,n);const p=this.getDialogIndexKeyByFilterId(s);if(e){if(!a||this.cachedResults.query!==e||this.cachedResults.folderId!==s){this.cachedResults.query=e,this.cachedResults.folderId=s;const t=this.dialogsIndex.search(e),a=[];for(const e in this.dialogs){const n=this.dialogs[e];t.has(n.peerId)&&n.folder_id===s&&a.push(n)}a.sort(((e,t)=>this.getDialogIndex(t,p)-this.getDialogIndex(e,p))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}r=this.cachedResults.dialogs}else this.cachedResults.query="";let d=0;if(t>0)for(let e=r.length;dthis.getDialogIndex(r[d],p));++d);const f=this.isDialogsLoaded(i),c=r.length>=d+a;if(e||f||c){const s=r.slice(d,d+a);return{dialogs:s,count:f?r.length:null,isTopEnd:r.length&&(s[0]&&s[0]===r[0]||this.getDialogIndex(r[0],p)=r.length}}return this.appMessagesManager.getTopMessages(a,i).then((e=>{if(n&&(r=this.getFolderDialogs(s,n)),d=0,t>0)for(let e=r.length;dthis.getDialogIndex(r[d],p));++d);const i=r.slice(d,d+a);return{dialogs:i,count:void 0===e.count?r.length:e.count,isTopEnd:r.length&&(i[0]&&i[0]===r[0]||this.getDialogIndex(r[0],p){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,_e.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,ye.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,_e.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,ye.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(o.DZ.has(t.id))return e.folder_id===t.id;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(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,Y.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,ye.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(s&&(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})}return s}))}getOutputDialogFilter(e){const t=(0,ye.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,se.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=a&&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>Me&&!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,ve.Z)(e),o.DZ.has(e.id)||(Pe.forEach((([t,a])=>{(0,ve.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,_e.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=this.rootScope.premium;let a=t;if(!t){const t=(yield this.apiManager.getAppConfig()).dialog_filters_limit_default;a=this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}return a}))}}var Ce=a(6690),we=a(2821);function ke(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 Ae{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,M.kg)("UPDATES",M.v9.Error|M.v9.Warn|M.v9.Log),this.debug=d.ZP,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,ve.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(){const e=this.updatesState,t=e.seq+1,a=e.pendingSeqUpdates[t];if(!a)return!1;const s=a.updates;for(let e=0,t=s.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!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:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!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=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);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}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get channel diff result",a),t.pts="pts"in a?a.pts:void 0,"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return this.debug&&this.log.debug("channel diff too long",a),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.debug&&this.log.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),this.debug&&this.log.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})})),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",a)}));return a||this.justAName(t,s,e),s}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){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a;let s;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":s=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(s=e.channel_id,!(s in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(s=e.channel_id)}const{pts:n,pts_count:i}=e,r=s?this.getChannelState(s,n):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(s?this.getChannelDifference(s):this.getDifference())}),6)}),r.syncPending.ptsAwaiting=!0,!1;if(n>r.pts)r.pts=n,o=!0,r.lastPtsUpdateTime=Date.now();else if(i)return!1;s&&t.date&&this.updatesState.date0){const a=t.seq,s=t.seqStart||a;if(s!==r.seq+1&&s>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[s]&&(r.pendingSeqUpdates[s]={seq:a,date:t.date,updates:[]}),r.pendingSeqUpdates[s].updates.push(e),r.syncPending||(r.syncPending={timeout:E.Z.setTimeout((()=>{r.syncPending=null,r.syncLoading||this.getDifference()}),6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{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${y.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,we.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,Ce.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}))})))}}ke(Ae,[p.Z,G]);class De extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(e=>{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){let s=this.savedAvatarURLs[e];if(s&&s[a])return s[a];{s||(s=this.savedAvatarURLs[e]={});const n={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},i={dcId:t.dc_id,location:n};"photo_big"===a&&(n.pFlags.big=!0,i.limitPart=524288);const r=this.apiFileManager.download(i);return s[a]=r.then((e=>s[a]=URL.createObjectURL(e)))}}}var Ue=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 Te 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?(ie(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,Ue.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)}))}}const Fe=new Set(["all","web","webk"]),Re=new Set;function xe(e){return e.find((e=>Fe.has(e.platform)&&!Re.has(e.reason)))}function Be(e){return!!xe(e)}var Ve=a(7120),Le=a(2566);class Oe extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)e&&(this.peersStorage.isPeerNeeded(e.toPeerId(!0))||(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}])=>{if(this.storage=a,t.length)for(let e=0,a=t.length;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;if("chatEmpty"===e._)return;const n=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;"channel"===e._&&void 0===e.participants_count&&void 0!==n&&n.participants_count&&(e.participants_count=n.participants_count);const i=e.id.toPeerId(!0);if(void 0===n)this.chats[e.id]=e;else{const t=(null===(a=n.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id),r=n.title!==e.title,o=n.pFlags.verified!==e.pFlags.verified||n.pFlags.scam!==e.pFlags.scam||n.pFlags.fake!==e.pFlags.fake;ie(n,e),this.rootScope.dispatchEvent("chat_update",e.id),t&&this.rootScope.dispatchEvent("avatar_update",i),(r||o)&&this.rootScope.dispatchEvent("peer_title_edit",i)}this.peersStorage.isPeerNeeded(i)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}hasRights(e,t,a,s){return(0,Ve.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,Q.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)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return("channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==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,de.Z)(a)&&(t||!a.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}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){return this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then((a=>(a&&(this.getChat(e).username=t),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((e=>{this.apiUpdatesManager.processUpdateMessage(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((e=>{this.apiUpdatesManager.processUpdateMessage(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,Le.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((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}setChatAvailableReactions(e,t){return this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}isRestricted(e){const t=this.getChat(e),a=t.restriction_reason;return!!(t.pFlags.restricted&&a&&Be(a))}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=>{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();return e.messages.push(t),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)))}}a(4762);var Ne,Ze=a(5953),qe=a(9005),Ge=a(6637),je=a(3591);!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=b({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=y.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=m.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:s?"web":y.Z.langPack}),!s&&n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"android"}),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=y.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&&(m.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,Ge.Z)(i)){r=document.createElement("a");const e=(0,je.Z)(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 g(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.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 P&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return m.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:y.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e,t).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=g,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 _ 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,Ze.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...g(this.key,!1,this.args));else{const e=this.element[this.property],t=g(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,Q.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=_;const v=new Map;function b(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 P extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let a;if((0,Ze.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=b(this.options);a=(0,qe.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=P,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,a,s){return new _({element:e,key:t,args:a,property:s}).element}}(Ne||(Ne={}));const He=Ne;Ne.i18n,Ne.i18n_,Ne._i18n,d.GO.I18n=Ne;const We=["January","February","March","April","May","June","July","August","September","October","November","December"],ze=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Ke=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&&Ke(t)===Ke(e)?n.weekday="short":(n.month="short",n.day="numeric"),new He.IntlDateElement({date:e,options:n}).element});const Je=2013,$e=new RegExp("20[0-9]{1,2}"),Qe=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),Ye=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Xe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),et=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),tt=[31,29,31,30,31,30,31,31,30,31,30,31];function at(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=Je&&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:nt(i),minDate:i,maxDate:r})}}function st(e,t,a){if(pt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=Je;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:it(p),minDate:p,maxDate:d}):e.push({title:rt(p),minDate:p,maxDate:d})}}var s}function nt(e){const t=new Date(e);return We[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function it(e){const t=new Date(e);return We[t.getMonth()].slice(0,3)+" "+t.getDate()}function rt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function ot(e){const t=new Date(e);return ze[t.getDay()]}function pt(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===ot(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:ot(p),minDate:p,maxDate:d})}let n;if(null===(n=Xe.exec(a)))if(null===(n=et.exec(a)))if(null===(n=$e.exec(a))){if(null!==(n=Qe.exec(a))){const e=n[1],a=n[2],s=dt(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void st(t,e-1,s);if(e>=Je)return void at(t,s,e)}}if(null!==(n=Ye.exec(a))){const e=n[1],a=dt(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void st(t,s-1,a);s>=Je&&at(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(pt(i-1,r)&&o>=Je&&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:rt(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>=Je&&s<=12)return void at(t,s-1,i);i<=12&&st(t,s-1,i-1)}else s>=Je&&i<=12&&at(t,i-1,s)}};var ct=a(2491),lt=a(7072),gt=a(8801),mt=a(6658);const ht={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};let ut=0;class yt 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&&(ft("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):We[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 xs()&&("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,gt.q)(s,(0,mt.Z)(e,a))}(e),0)),e.file_name||(e.file_name=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),a?Object.assign(a,e):e}getDoc(e){return(0,de.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-"+ ++ut,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};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,ve.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,ve.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,lt.Z)(n),a,s):Promise.reject((0,Y.Z)("NO_DOC"))}}class _t extends G{constructor(){super(...arguments),this.drafts={},this.getAllDraftPromise=null}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft(t,e.threadId,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(){return this.getAllDraftPromise||(this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))})))}saveDraft(e,t,a,s={}){const n=this.processApiDraft(a),i=this.getKey(e,t);return n?this.drafts[i]=n:delete this.drafts[i],h.Z.set({drafts:this.drafts}),s.notify&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:n,force:s.force}),n}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!(0,de.Z)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!(0,Q.Z)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(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,oe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){return i=this,r=void 0,p=function*(){const i=this.getDraft(e,t);if(this.draftsAreEqual(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,ve.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,re.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}const p=o||a;return p.date=(0,ee.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft(e,t,p,{notify:!0,force:n}),!(s&&!t)||this.apiManager.invokeApi("messages.saveDraft",r)},new((o=void 0)||(o=Promise))((function(e,t){function a(e){try{n(p.next(e))}catch(e){t(e)}}function s(e){try{n(p.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(a,s)}n((p=p.apply(i,r||[])).next())}));var i,r,o,p}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(e,t,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(e,t,n,{notify:!0,force:!0})}}var vt=a(946),bt=a(7746);const Pt={keywords:{},version:0,langCode:y.Z.langPackCode};class Mt extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=y.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,de.Z)(t)||(t={}),(0,vt.Z)(Pt,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 He.lastRequestedLangCode!==y.Z.langPackCode&&e.push(this.getEmojiKeywords(He.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new te.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.concat(Mt.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=this.appStateManager.getState().then((e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[]))}pushRecentEmoji(e){e=(0,bt.Z)(e),this.getRecentEmojis().then((t=>{(0,P.Z)(t,e),t.unshift(e),t.length>36&&(t.length=36),this.appStateManager.pushToState("recentEmoji",t),this.rootScope.dispatchEvent("emoji_recent",e)}))}}Mt.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var St=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 It extends G{after(){this.log=(0,M.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,ce.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?(ie(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 St(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,ce.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 St(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&&ie(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return St(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Ue.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 St(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 St(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,ne.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.appUsersManager.getUser(a).username+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,re.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 Et{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,oe.Z)(e)+(t&Ut.o-1)}}var Tt=a(4421),Ft=a(5659),Rt=a(7487);const xt=new class{constructor(){this.disabled=b.Z.test||-1===y.Z.domains.indexOf(location.hostname)}setAuthorized(e){if(!this.disabled)return Rt.Z.get("tgme_sync").then((t=>{const a=(0,ee.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>a)return;Rt.Z.set({tgme_sync:{canRedirect:e,ts:a}});const s=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(y.Z.version+" "+y.Z.suffix)}`,n=["//telegram.me/"+s,"//t.me/"+s].map((e=>(0,Ft.Z)(e).then((e=>{e.remove()}))));return Promise.all(n)}))}};d.GO&&(d.GO.telegramMeWebManager=xt);const Bt=xt;var Vt=a(3624),Lt=a(7401);function Ot(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(Ot(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 Nt=a(5701),Zt=a(7667),qt=a(6241),Gt=a(6535),jt=a(6566),Ht=a(2202),Wt=a(319);const zt=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=zt);const Kt=zt;var Jt=a(2381),$t=a(13);function Qt(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var 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()};class ea extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Tt.Z(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,M.kg)("MESSAGES",M.v9.Error|M.v9.Debug|M.v9.Log|M.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Vt.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=this.newDialogsToHandle;for(const[a,s]of t)s?(this.dialogsStorage.pushDialog(s),this.appPeersManager.isChannel(a.toPeerId())||(e=Math.max(e,s.top_message||0))):(this.reloadConversation(a.toPeerId()),t.delete(a));0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{E.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId(),a=this.notificationsToHandle[t];this.getNotifyPeerSettings(t).then((({muted:e,peerTypeNotifySettings:t})=>{const s=a.topMessage;e&&!s.pFlags.mentioned||!s.pFlags.unread||s.pFlags.unread&&this.notifyAboutMessage(s,{fwdCount:a.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,a=this.pendingByRandomId[t];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a,o=(0,oe.Z)(e.id),p=this.getMessageFromStorage(r,o);p?([this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)})),this.finalizePendingMessageCallbacks(r,n,p)):this.pendingByMessageId[o]=t}},this.onUpdateNewMessage=e=>{var t;const a=e.message,s=this.getMessagePeer(a),n=this.getHistoryMessagesStorage(s),i=this.getDialogOnly(s),r="updateNewDiscussionMessage"===e._;this.saveMessages([a],{storage:this.createMessageStorage(s,"history")});const p=this.getThreadKey(a),d=p?+p.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[s]&&this.threadsStorage[s][d]){const e={_:"updateNewDiscussionMessage",message:a};this.onUpdateNewMessage(e)}if("messageService"===a._&&"messageActionPaymentSent"===a.action._&&a.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:a.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(a.reply_to.reply_to_peer_id):a.peerId,mid:a.reply_to_mid,receiptMessage:a}),!i&&!r){let a=!0;if(s.isAnyChat()&&(a=this.appChatsManager.isInChat(s.toChatId())),a){const a=null!==(t=this.newUpdatesAfterReloadToHandle[s])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[s]=new Set;if(a.has(e))return void this.log.error("here we go again",s);e.ignoreExisting=!0,a.add(e),this.scheduleHandleNewDialogs(s)}return}this.saveMessages([a],{storage:n}),this.checkPendingMessage(a);const f=this.getHistoryStorage(s,r?d:void 0);r||this.updateMessageRepliesIfNeeded(a);const c=e.ignoreExisting;if(f.history.findSlice(a.mid)){if(!c)return!1}else{const e=f.history.first;if(e.isEnd(ae.D.Bottom)){let t=0;for(const s=e.length;te[t]);++t);e.splice(t,0,a.mid)}else f.history.unshift(a.mid);null!==f.count&&f.count++}this.mergeReplyKeyboard(f,a)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:s});const l=a.fromId;if(l.isUser()&&!a.pFlags.out&&a.from_id){this.appUsersManager.forceUserOnline(l,a.date);const e={_:"sendMessageCancelAction"};let t;t=s.isUser()?{_:"updateUserTyping",action:e,user_id:l}:this.appPeersManager.isChannel(s)?{_:"updateChannelUserTyping",action:e,channel_id:s.toChatId(),from_id:this.appPeersManager.getOutputPeer(l),top_msg_id:d?(0,re.Z)(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:s.toChatId(),from_id:this.appPeersManager.getOutputPeer(l)},this.apiUpdatesManager.processLocalUpdate(t)}if(this.handleNewMessage(a),r)return;const g=!a.pFlags.out&&a.pFlags.unread;if(i){if(g&&a.mid>i.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(i);++i.unread_count,a.pFlags.mentioned&&(++i.unread_mentions_count,this.modifyCachedMentions(s,a.mid,!0)),e()}a.mid>=i.top_message&&this.setDialogTopMessage(a,i)}if(g){const e=s;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:o.NM}),t.fromId!==l&&(t.fromId=l,t.fwdCount=0),a.fwd_from&&++t.fwdCount,t.topMessage=a,this.notificationsHandlePromise||(this.notificationsHandlePromise=E.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,oe.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,Q.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,ye.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,a]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=(0,oe.Z)(t.id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s);this.saveMessages([t],{storage:n});const r=this.getMessageFromStorage(n,s);this.handleEditedMessage(i,r,n);const o=this.getDialogOnly(a),p=o&&o.top_message===s;if(t.clear_history)p&&this.rootScope.dispatchEvent("dialog_flush",{peerId:a,dialog:o});else{if("message"===(null==i?void 0:i._)&&!(0,Q.Z)(i.reactions,r.reactions)){const e=r.reactions;return r.reactions=i.reactions,void this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(a),msg_id:t.id,reactions:e})}this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:a,mid:s,message:t}),(p||t.grouped_id)&&(this.dialogsStorage.setDialogToState(o),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[a,o]])))}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,oe.Z)(e.max_id||e.read_max_id),s=(0,oe.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=this.getHistoryMessagesStorage(n),o=(0,Lt.Z)(r,"desc"),p=this.getDialogOnly(n),d=e.still_unread_count;let f=0,c=0,l=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const m=!s&&p&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);for(let e=0,t=o.length;ea)continue;const g=r.get(t);if(g.pFlags.out===i){if(!g.pFlags.unread)break;if(s){const e=g.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==s)continue}g.pFlags.unread&&(delete g.pFlags.unread,l||(l=!0),g.pFlags.out||s||!p||(void 0===d&&(f=--p.unread_count),g.pFlags.mentioned&&(c=--p.unread_mentions_count,this.modifyCachedMentions(n,g.mid,!1))),this.rootScope.dispatchEvent("notification_cancel","msg"+t))}}if(i?g.readOutboxMaxId=a:g.readMaxId=a,!s&&p){if(i?p.read_outbox_max_id=a:p.read_inbox_max_id=a,!i){let e;void 0!==d?e=d:f<0||!this.getReadMaxIdIfUnread(n)?e=0:f&&p.top_message>a&&(e=f),void 0!==e&&(p.unread_count=e),(c<0||!p.unread_count)&&(p.unread_mentions_count=0)}m&&m(),this.dialogsStorage.processDialogForFilters(p),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:p}),this.dialogsStorage.setDialogToState(p)}if(l&&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.messages.map((e=>(0,oe.Z)(e))),s=t?t.toPeerId(!0):this.findPeerIdByMids(a);for(let e=0,t=a.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,oe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,a=e.messages.map((e=>(0,oe.Z)(e))),s=t?t.toPeerId(!0):this.findPeerIdByMids(a);if(!s)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===s));const n=new Set;for(const e of a){const t=this.getMessageByPeer(s,e),a=this.getThreadKey(t);a&&this.threadsStorage[s]&&this.threadsStorage[s][+a.split("_")[1]]&&n.add(a)}const i=this.handleDeletedMessages(s,this.getHistoryMessagesStorage(s),a),r=Array.from(n).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)})),o=this.getHistoryStorage(s);[o].concat(r).forEach((e=>{for(const t of i.msgs)e.history.delete(t);i.count&&e.count&&(e.count=Math.max(0,e.count-i.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:s,msgs:i.msgs});const p=this.getDialogOnly(s);if(p){const e=i.unreadMentions||i.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);if(i.unread&&(p.unread_count=Math.max(0,p.unread_count-i.unread)),i.unreadMentions&&(p.unread_mentions_count=p.unread_count?Math.max(0,p.unread_mentions_count-i.unreadMentions):0),e&&(t(),this.rootScope.dispatchEvent("dialog_unread",{peerId:s,dialog:p})),i.msgs.has(p.top_message)){const e=o.history.first;if(e.isEnd(ae.D.Bottom)&&e.length){const t=e[0],a=this.getMessageByPeer(s,t);this.setDialogTopMessage(a,p)}else this.reloadConversation(s)}}},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!s.username||!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),this.reloadConversation(t).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{const t=e.views,a=e.channel_id.toPeerId(!0),s=(0,oe.Z)(e.id),n=this.getMessageByPeer(a,s);void 0!==(null==n?void 0:n.views)&&n.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,ee.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,oe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.wrapSingleMessage(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[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;if("notifyPeer"===t._){const e=this.appPeersManager.getPeerId(t.peer),s=this.getDialogOnly(e);s&&(s.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",s),this.dialogsStorage.setDialogToState(s))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,oe.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,oe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},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=>e.reaction===t.reaction));return e.pFlags.out&&(!a||t.count>a.count)||t.pFlags.chosen&&(!a||!a.pFlags.chosen)}));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}),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})=>{if(t)return;const s=this.getDialogOnly(e);if(s){if(!t){s.draft=a;let t=!1;a||(0,re.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog(s)):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}}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);this.setDialogToStateIfMessageIsTop(s)}})),this.batchUpdatesDebounced=(0,Nt.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,ye.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;const i=null!==(s=this.tempFinalizeCallbacks[e])&&void 0!==s?s:this.tempFinalizeCallbacks[e]={},r=null!==(n=i[t])&&void 0!==n?n:i[t]={deferred:(0,_.Z)()};return r.callback=a,r.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,we.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=Ot(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,we.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,re.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{e?d.error=!0:delete d.error,this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l(!1);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},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ye.Z)(d);ge(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=>{l(!0),d.promise.reject(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 g=[d.promise];for(let t=1;t=0){r="audio",o="audio."+("ogg"===p.split("/")[1]?"ogg":"mp3"),y="sendMessageUploadAudioAction",a.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:a.isVoiceMessage},waveform:a.waveform,duration:a.duration||0};g.push(e)}else if(a.isMedia)if(m){r="photo",o="photo."+p.split("/")[1],y="sendMessageUploadPhotoAction";const e={_:"photoSize",w:a.width,h:a.height,type:"full",location:null,size:t.size};h={_:"photo",id:""+s.id,sizes:[e],w:a.width,h:a.height};const n=this.thumbsStorage.getCacheContext(h,e.type);n.downloaded=t.size,n.url=a.objectURL||"",h=this.appPhotosManager.savePhoto(h)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(p)){r="video",o="video.mp4",y="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:a.isRoundMessage,supports_streaming:!0},duration:a.duration,w:a.width,h:a.height};g.push(e),a.noSound&&t.size>10240&&t.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",o="document."+p.split("/")[1],y="sendMessageUploadDocumentAction";else r="document",o="document."+p.split("/")[1],y="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:d||o}),-1!==["document","video","audio","voice"].indexOf(r)&&!f){const e=[];if(u={_:"document",id:""+s.id,duration:a.duration,attributes:g,w:a.width,h:a.height,thumbs:e,mime_type:p,size:t.size},a.objectURL){const e=this.thumbsStorage.getCacheContext(u);e.downloaded=t.size,e.url=a.objectURL}let n;if(m)g.push({_:"documentAttributeImageSize",w:a.width,h:a.height}),n={_:"photoSize",w:a.width,h:a.height,type:"full",size:t.size};else if("video"===r&&a.thumb){n={_:"photoSize",w:a.thumb.size.width,h:a.thumb.size.height,type:"local-thumb",size:a.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(u,n.type);e.downloaded=n.size,e.url=a.thumb.url}n&&e.push(n),u=this.appDocsManager.saveDoc(u)}this.log("sendFile",r,o,t.type,a);const v=(0,_.Z)(),b=f?void 0:{_:h?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:h,document:u};b&&(ge(b,["promise"]),b.promise=v),s.entities=l,s.message=c,s.media=f?{_:"messageMediaDocument",pFlags:{},document:t}:b;const P=f?void 0:(0,Ht.Z)(t);s.uploadingFileName=P,P&&(this.uploadFilePromises[P]=v);const M=e=>{e?s.error=!0:delete s.error,this.rootScope.dispatchEvent("messages_pending")};let S=!1,I=null;s.send=()=>{if(f){const e={_:"inputMediaDocument",id:Qt(t)};v.resolve(e)}else if(t instanceof File||t instanceof Blob){const n=()=>{var n;let i;return S&&!s.error||(S=!1,I=this.apiFileManager.upload({file:t,fileName:P}),I.catch((t=>{S||(this.log("cancelling upload",b),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),v.reject(t))})),I.addNotifyListener((t=>{const a=Math.max(1,Math.floor(100*t.done/t.total));y&&this.setTyping(e,{_:y,progress:0|a}),v.notifyAll(t)})),v.notifyAll({done:0,total:t.size})),"video"===r&&a.objectURL&&(null===(n=a.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:a.thumb.blob})),I&&I.then((e=>Yt(this,void 0,void 0,(function*(){let t;if(e.name=o,S=!0,t="photo"===r?{_:"inputMediaUploadedPhoto",file:e}:{_:"inputMediaUploadedDocument",file:e,mime_type:p,pFlags:{force_file:"sendMessageUploadDocumentAction"===y||void 0},attributes:g},i)try{const e=yield i;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}v.resolve(t)}))),(()=>{M(!0)})),v};a.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return v},this.beforeMessageSending(s,{isGroupedItem:a.isGroupedItem,isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,processAfter:a.processAfter}),a.isGroupedItem||(v.then((t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),this.apiManager.invokeApi("messages.sendMedia",{background:a.background,peer:this.appPeersManager.getInputPeerById(e),media:t,message:c,random_id:s.random_id,reply_to_msg_id:n,schedule_date:a.scheduleDate,silent:a.silent,entities:l,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.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 M(!0),e}))))),v.then(s.promise.resolve,s.promise.reject));const C={message:s};return ge(C,["promise"]),C.promise=v,C}sendAlbum(e,t,a={}){return Yt(this,void 0,void 0,(function*(){if(a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},a),a.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const s=a.replyToMsgId?(0,re.Z)(a.replyToMsgId):void 0;let n=a.caption||"",i=a.entities||[];n&&(n=(0,we.Z)(n,i)),this.log("sendAlbum",t,a);const r=""+ ++this.groupedTempId,o=[],p=e=>{o.push(e)},d=t.map(((t,o)=>{const d=a.sendFileDetails[o],f=Object.assign({isGroupedItem:!0,isMedia:a.isMedia,scheduleDate:a.scheduleDate,silent:a.silent,replyToMsgId:s,threadId:a.threadId,sendAsPeerId:a.sendAsPeerId,groupId:r,processAfter:p},d);return 0===o&&(f.caption=n,f.entities=i),this.sendFile(e,t,f).message}));a.clearDraft&&o.push((()=>{this.appDraftsManager.clearDraft(e,a.threadId)})),o.forEach((e=>{e()}));const f=(e,t)=>{t?e.error=!0:delete e.error,this.rootScope.dispatchEvent("messages_pending")},c=this.appPeersManager.getInputPeerById(e),l=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const n=(0,_.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:c,multi_media:t,reply_to_msg_id:s,schedule_date:a.scheduleDate,silent:a.silent,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{d.forEach((e=>f(e,!0))),n.reject(e)}))}),n},g=d.map((e=>e.send().then((e=>this.apiManager.invokeApi("messages.uploadMedia",{peer:c,media:e}))).then((t=>{let a;"messageMediaPhoto"===t._?a=wt(this.appPhotosManager.savePhoto(t.photo)):"messageMediaDocument"===t._&&(a=At(this.appDocsManager.saveDoc(t.document)));const s={_:"inputSingleMedia",media:a,random_id:e.random_id,message:n,entities:i};return n&&(n="",i=[]),s})).catch((t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),f(e,!0),t}))));return Promise.all(g).then((e=>l(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,re.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.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},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{o()})).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),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);this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),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!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,ee.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Ue.a)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return ge(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,_.Z)()),n}generateReplyHeader(e,t){const a={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&a.reply_to_msg_id!==t&&(a.reply_to_top_id=t),a}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).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(){return Yt(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(he);){const t=yield this.getTopMessages(100,he);if(!e()||t.isEnd)break}}))}getConversations(e="",t,a,s=0,n){return this.dialogsStorage.getDialogs(e,t,a,s,n)}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t){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.dialogs,Object.assign({},r.dialogs[0])),a||t===he||this.dialogsStorage.resetPinnedOrder(t),a||(Bt.setAuthorized(!0),this.appDraftsManager.addMissedDialogs()),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let p=!!a,f=!1;const c=new Map,l=t===he?o.J$:t,g=t===he;if((0,se.Z)(r.dialogs,(e=>{void 0===e.folder_id&&(e.folder_id=l),this.dialogsStorage.saveDialog(e,void 0,!0,g),p||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),p=!0),void 0!==e.peerId&&(s&&(0,fe.Z)(e)>s&&(this.scheduleHandleNewDialogs(e.peerId,e),f=!0),(0,re.Z)(e.read_inbox_max_id)||(0,re.Z)(e.read_outbox_max_id)||(c.set(e.peerId,e),this.log.error("noIdsDialogs",e,i)))})),c.size){const e=[...c.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",c);for(let t=0;t=m||!r.dialogs.length;y&&this.dialogsStorage.setDialogsLoaded(t,!0),f?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const _=r.dialogs,v=100===e?_:_.slice(0,e);return{isEnd:y&&v[v.length-1]===_[_.length-1],count:m,dialogs:v}}))}forwardMessages(e,t,a,s={}){return Yt(this,void 0,void 0,(function*(){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;const c=this.getMessageByPeer(t,n),l=this.generateOutgoingMessage(e,s);o.push(l.id);const g=["entities","media"];s.dropAuthor||(l.fwd_from=this.generateForwardHeader(e,c),g.push("views","forwards"),(null===(i=l.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete l.from_id),s.dropCaptions&&c.media||g.push("message");const m=null===(p=c.reply_to)||void 0===p?void 0:p.reply_to_msg_id,h=a.indexOf(m);if(m&&-1!==h){const e=o[h];l.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}g.forEach((e=>{l[e]=(0,ye.Z)(c[e])}));const u=null===(d=l.media)||void 0===d?void 0:d.document;return u&&(["round","voice"].includes(u.type)&&(l.pFlags.media_unread=!0),u.sticker&&!this.rootScope.premium&&(0,$t.Z)(u)&&(l.media.pFlags.nopremium=!0)),c.grouped_id&&(null!==(f=r[c.grouped_id])&&void 0!==f?f:r[c.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(l),l}));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,re.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)})).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(Wt.Z)}))}generateEmptyMessage(e){}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;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[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}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}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}}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,_.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,v.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;return this.reloadConversationsPeers.clear(),this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}).then((e=>{this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),(e=>{})).then((()=>{(()=>{for(const e in t)t[e].resolve(void 0)})(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a){return this.apiManager.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:a,peer:e,max_id:0}).then((s=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:s.pts,pts_count:s.pts_count}}),!s.offset||this.doFlushHistory(e,t,a))))}flushHistory(e,t,a){return Yt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)){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,re.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(this.appPeersManager.getInputPeerById(e),t,a).then((()=>{if(this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));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()}))}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})}))}getPinnedMessage(e){var t;const a=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return a.promise?a.promise:a.maxId?Promise.resolve(a):a.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then((e=>{var t;return a.count=e.count,a.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,a})).finally((()=>{delete a.promise}))}getPinnedMessagesCount(e){var t;return null===(t=this.pinnedMessages[e])||void 0===t?void 0:t.count}getPinnedMessagesMaxId(e){var t;return null===(t=this.pinnedMessages[e])||void 0===t?void 0:t.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,re.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[e],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Jt.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)}saveMessage(e,t={}){var a,s;if(!e||"messageEmpty"===e._)return;void 0===e.pFlags&&(e.pFlags={});const n=this.getMessagePeer(e),i=t.storage||this.getHistoryMessagesStorage(n),r="peerChannel"===e.peer_id._,p=r&&this.appChatsManager.isBroadcast(n.toChatId()),d="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const f=(0,oe.Z)(e.id);e.mid=f,d&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(a=this.groupedMessagesStorage[e.grouped_id])&&void 0!==a?a:this.groupedMessagesStorage[e.grouped_id]=this.createMessageStorage(n,"grouped")).set(f,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const c=this.getDialogOnly(n);c&&f&&f>c[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=(0,oe.Z)(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=(0,oe.Z)(e.reply_to.reply_to_top_id)));const l=d&&e.replies;l&&(l.max_id&&(l.max_id=(0,oe.Z)(l.max_id)),l.read_max_id&&(l.read_max_id=(0,oe.Z)(l.read_max_id)));const g=!!n;g||(e.date-=this.timeManager.getServerTimeOffset());const m=this.appPeersManager.peerId,h=d&&e.fwd_from;if(e.peerId=n,e.fromId=n===m?h?h.from_id?this.appPeersManager.getPeerId(h.from_id):o.NM:m:e.pFlags.post||!e.from_id?n:this.appPeersManager.getPeerId(e.from_id),h){h.saved_from_msg_id&&(h.saved_from_msg_id=(0,oe.Z)(h.saved_from_msg_id)),h.channel_post&&(h.channel_post=(0,oe.Z)(h.channel_post));const t=h.saved_from_peer||h.from_id,a=h.saved_from_msg_id||h.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,oe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(h.from_id),g||(h.date-=this.timeManager.getServerTimeOffset())}const u={type:"message",peerId:n,messageId:f};if(d&&e.media){let a=!1;switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?a=!0:e.media.photo=this.appPhotosManager.savePhoto(e.media.photo,u),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":if(e.media.ttl_seconds)a=!0;else{const t=e.media.document;e.media.document=this.appDocsManager.saveDoc(t,u),e.media.document||"documentEmpty"===t._||(a=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(n,f,t.isScheduled);e.media.webpage=this.appWebPagesManager.saveWebPage(e.media.webpage,a,u);break}case"messageMediaInvoice":e.media.photo=this.appWebDocsManager.saveWebDocument(e.media.photo);break;case"messageMediaUnsupported":a=!0}a&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities)}if(!d&&e.action){const t=e.action;let a,i;const o=e.fromId===this.appUsersManager.getSelf().id?"You":"";switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,u)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,u)),t._){case"messageActionChatEditPhoto":(null===(s=t.photo)||void 0===s?void 0:s.video_sizes)?t._=p?"messageActionChannelEditVideo":"messageActionChatEditVideo":p&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",p||(e+="_by"+o),t.type=e;break}case"messageActionChatEditTitle":p&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":p&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+o:"messageActionChatReturn"+o)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+o);break;case"messageActionChannelMigrateFrom":a=t.chat_id.toPeerId(!0),i=n;break;case"messageActionChatMigrateTo":a=n,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")}a&&i&&!this.migratedFromTo[a]&&!this.migratedToFrom[i]&&this.migrateChecks(a,i)}return d&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),i.set(f,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(ae.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,bt.Z)(e.message,t);const a=(0,Gt.Z)(e.message);e.totalEntities=(0,qt.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,re.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Ue.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(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0})).then((()=>{const t=this.appUsersManager.getUser(e);return this.sendText(s,n+"@"+t.username)}))}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,t){var a;return Yt(this,void 0,void 0,(function*(){if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!(null===(a=s.pFlags)||void 0===a?void 0:a.pinned)||void 0;if(n){const e=yield this.apiManager.getAppConfig(),a=1===t?this.rootScope.premium?e.dialogs_folder_pinned_limit_premium:e.dialogs_folder_pinned_limit_default:this.rootScope.premium?e.dialogs_pinned_limit_premium:e.dialogs_pinned_limit_default;if(this.dialogsStorage.getPinnedOrders(t).length>=a)return Promise.reject((0,Y.Z)("PINNED_DIALOGS_TOO_MUCH"))}return this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(e),pinned:n}).then((a=>{if(a){const a=n?{pinned:n}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(e),folder_id:t,pFlags:a})}}))}))}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&&(!e.pFlags.out||"peerChannel"!==e.peer_id._&&e.date<(0,ee.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}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,ve.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){return this.appPeersManager.isRestricted(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})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,jt.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.isRestricted(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 g;if(!e||r||s||t||1===n||o||(g=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,g.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,re.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.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,re.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);return a.max_id=r.maxId=(0,oe.Z)(a.max_id)||0,a.read_inbox_max_id=r.readMaxId=(0,oe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,oe.Z)(a.read_outbox_max_id)||0,this.threadsToReplies[i]=e+"_"+t,n}))}handleNewMessage(e){this.rootScope.dispatchEvent("history_multiappend",e)}scheduleHandleNewDialogs(e,t){return void 0!==e&&this.newDialogsToHandle.set(e,t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=(0,v.Z)(0).then((()=>{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,re.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(Wt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(!s&&!a){const t=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,re.Z)(a),read_max_id:(0,re.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,re.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,re.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)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,a){const s=this.unreadMentions[e];s&&(a?s.first.isEnd(ae.D.Top)&&s.insertSlice([t]):s.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const a=this.getDialogOnly(e);!t.length&&(null==a?void 0:a.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const a=this.goToNextMentionPromises[e];if(a)return a;const s=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new ae.Z,n=s.length,i=s.first.isEnd(ae.D.Top);if(!n&&i)return this.fixUnreadMentionsCountIfNeeded(e,s),Promise.resolve();let r=Promise.resolve();return!i&&n<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then((()=>{const t=s.last,a=t&&t[t.length-1];if(a)return s.delete(a),a;this.fixUnreadMentionsCountIfNeeded(e,s)})).finally((()=>{delete this.goToNextMentionPromises[e]}))}loadNextMentions(e){const t=this.unreadMentions[e],a=t.first[0]||1;return this.getUnreadMentions(e,a,-50,50).then((e=>{this.mergeHistoryResult(t,e,1===a?0:a,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0){return this.apiManager.invokeApiSingle("messages.getUnreadMentions",{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,re.Z)(t),add_offset:a,limit:s,max_id:(0,re.Z)(n),min_id:(0,re.Z)(i)}).then((e=>((0,ve.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,re.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;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(a=this.threadsStorage[e][t])&&void 0!==a?a:this.threadsStorage[e][t]={count:null,history:new ae.Z}):null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={count:null,history:new ae.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){return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(e,!0))]).then((([t,a])=>({muted:this.appNotificationsManager.isPeerLocalMuted(e,!0),peerTypeNotifySettings: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==e?void 0:e.reply_to)&&(null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;a=e.peerId+"_"+t}return a}updateMessage(e,t,a){return this.wrapSingleMessage(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,t){const a={_:"inputPeerNotifySettings"};return a.mute_until=t,this.appNotificationsManager.updateNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)},a)}togglePeerMute(e,t){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted(e,!1)),this.mutePeer(e,t?o.rU:0)}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"){if(this.appPeersManager.isRestricted(e))return!1;if(e.isAnyChat()){const s=this.appChatsManager.getChat(e.toChatId());return this.appChatsManager.hasRights(e.toChatId(),a,void 0,!!t)&&(!s.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(a){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,ve.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,"full");Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Zt.Z)(e,i);(0,gt.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,gt.P)((0,lt.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,re.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,se.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,re.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,ee.Z)(!0)-e.date(0,re.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length),n=e.toChatId();for(let e=0,i=t.length;e{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));n||(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),n.source)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[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,re.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,re.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())}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(ae.D.Bottom))return;delete s.maxId,n.unsetEnd(ae.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,re.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(ae.D.Top),f&&l.setEnd(ae.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),this.appPeersManager.isChannel(e)&&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());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,v.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,re.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,ve.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(Wt.Z,Wt.Z).then((()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}wrapSingleMessage(e,t,a=!1){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,_.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}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.wrapSingleMessage(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,this.getDialogOnly(t)]]))}return t}))}setTyping(e,t,a){var s;let n=this.typings[e];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(s=null==n?void 0:n.action)||void 0===s?void 0:s._)!==t._)?((null==n?void 0:n.timeout)&&clearTimeout(n.timeout),n=this.typings[e]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t}).finally((()=>{n===this.typings[e]&&(n.timeout=E.Z.setTimeout((()=>{delete this.typings[e]}),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){return e.unread_count||+!!e.pFlags.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 ta=a(6724);function aa(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class sa extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,ee.Z)(!0);let t=o.rU;for(const a in this.peerSettings.notifyPeer){const s=this.peerSettings.notifyPeer[a];if(s instanceof Promise)continue;const n=s.mute_until;n&&(n<=e?(s.mute_until=0,this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:{_:"notifyPeer",peer:this.appPeersManager.getOutputPeer(a.toPeerId())},notify_settings:s})):n{const t="notifyPeer"===e.peer._&&this.appPeersManager.getPeerId(e.peer.peer),a="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:a,peerId:t,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,ve.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=aa(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),{_:aa(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)}))}savePeerSettings({key:e,peerId:t,settings:a}){let s;t&&(e=t,s=this.peerSettings.notifyPeer),(s||this.peerSettings)[e]=a,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:a}),this.appStateManager.getState().then((t=>{const s=t.notifySettings;s[e]=a,this.appStateManager.pushToState("notifySettings",s)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,ee.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(e,t=!0){const a={_:"peerNotifySettings"},s=this.peerSettings.notifyPeer[e];if(!s||s instanceof Promise||Object.assign(a,s),t){const t=aa(this.appPeersManager.getInputNotifyPeerById(e,!0)._),s=this.peerSettings[t];if(s&&!(s instanceof Promise))for(const e in s)void 0===a[e]&&(a[e]=s[e])}return a}isPeerLocalMuted(e,t=!0){if(e===this.appPeersManager.peerId)return!1;const a=this.getPeerLocalSettings(e,t);return this.isMuted(a)}}var na=a(617),ia=a(7361);class ra extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){if(this.isRestricted(e))return;const t=e.isUser()?this.appUsersManager.getUserPhoto(e.toUserId()):this.appChatsManager.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:void 0}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&(0,ce.Z)(t.migrated_to)}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.getPeer(e).username||""}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,ce.Z)(e)||(0,de.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())}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,na.Z)(e)}isAnyChat(e){return(0,ia.Z)(e)}isRestricted(e){return e.isUser()?this.appUsersManager.isRestricted(e.toUserId()):this.appChatsManager.isRestricted(e.toChatId())}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?xe(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"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,de.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.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class oa 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&&(ft("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){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,de.Z)(e)?e:this.photos[e]}}class pa extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,M.kg)("POLLS",M.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,we.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,re.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,re.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,re.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,ye.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 da 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:{_:aa(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=aa(t._),t}))}),a.rules)))}getPrivacy(e){const t=aa(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 fa=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 ca extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const a=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===a||"speakingInGroupCallAction"===e.action._)return;const s=this.appPeersManager.getPeerId(e),n=null!==(t=this.typingsInPeer[s])&&void 0!==t?t:this.typingsInPeer[s]=[];let i=n.find((e=>e.userId===a));const r=()=>{delete i.timeout;const e=n.indexOf(i);-1!==e&&n.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n}),n.length||delete this.typingsInPeer[s]};if(i&&void 0!==i.timeout&&clearTimeout(i.timeout),"sendMessageCancelAction"===e.action._){if(!i)return;return void r()}i||(i={userId:a},n.push(i)),i.action=e.action;const o=this.appUsersManager.hasUser(a);o?this.appUsersManager.forceUserOnline(a):"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!==i.timeout&&this.appUsersManager.hasUser(a)&&this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n})})),i.timeout=E.Z.setTimeout(r,6e3),o&&this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n})},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?this.usersFull[e]:this.apiManager.invokeApiSingleProcess({method:"users.getFullUser",params:{id:this.appUsersManager.getUserInput(e)},processResult:t=>{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.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 fa(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=this.chatsFull[e];if(a&&!t){const t=this.appChatsManager.getChat(e);if(t.version===a.participants.version||t.pFlags.left)return a}return this.apiManager.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_chat,s=e.toPeerId(!0);return a&&a.chat_photo&&a.chat_photo.id&&(a.chat_photo=this.appPhotosManager.savePhoto(a.chat_photo,{type:"profilePhoto",peerId:s})),a.call&&this.appGroupCallsManager.saveGroupCall(a.call,e),this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.chatsFull[e]=a,this.rootScope.dispatchEvent("chat_full_update",e),a}})}getChatInviteLink(e,t){return fa(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(t&&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){return void 0===this.chatsFull[e]||t?this.apiManager.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:this.appChatsManager.getChannelInput(e)},processResult:t=>{const a=e.toPeerId(!0);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.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",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}}):this.chatsFull[e]}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new te.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,re.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,Le.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(this.appPeersManager.peerId,!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({_:"updateUserPhoto",user_id:s,date:(0,ee.Z)(!0),photo:this.appUsersManager.getUser(s).photo,previous:!0})}))}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 fa(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}))}getPeerTypings(e){return this.typingsInPeer[e]}}function la(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(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 ma=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],ha={type:"reactions"};class ua 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=>ga(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})])}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,ve.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of ma)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],ha));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):la([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=(null!==(s=t.available_reactions)&&void 0!==s?s:[]).map((t=>e.find((e=>e.reaction===t)))).filter(Boolean);return this.unshiftQuickReactionInner(n,a)}))}unshiftQuickReactionInner(e,t){const a=(0,_e.Z)(e,(e=>e.reaction===t.reaction));return a&&e.unshift(a),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return la([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 la([this.apiManager.getAppConfig(),this.getAvailableReactions()],(([e,t])=>t.find((t=>t.reaction===e.reactions_default))))}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,re.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,re.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=>ga(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getAppConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){const s=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(s))return;this.lastSendingTimes.set(s,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(s)}),333);const{peerId:n,mid:i}=e,r=this.appPeersManager.peerId;let o=a?e.reactions:(0,ye.Z)(e.reactions);const p=o?o.results.findIndex((e=>e.pFlags.chosen)):-1,d=-1!==p&&o.results[p];if(d&&(--d.count,delete d.pFlags.chosen,t===d.reaction&&(t=void 0),d.count||o.results.splice(p,1),o.recent_reactions&&(0,_e.Z)(o.recent_reactions,(e=>this.appPeersManager.getPeerId(e.peer_id)===r)),o.results.length||(o=void 0)),t){o||(o={_:"messageReactions",results:[],pFlags:{}},this.appPeersManager.isBroadcast(e.peerId)||(o.pFlags.can_see_list=!0));let a=o.results.findIndex((e=>e.reaction===t)),s=-1!==a&&o.results[a];if(s||(s={_:"reactionCount",count:0,reaction:t,pFlags:{}},a=o.results.push(s)-1),++s.count,s.pFlags.chosen=!0,!o.recent_reactions&&o.pFlags.can_see_list&&(o.recent_reactions=[]),o.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(r)};this.appPeersManager.isMegagroup(n)?(o.recent_reactions.unshift(e),o.recent_reactions=o.recent_reactions.slice(0,3)):(o.recent_reactions.push(e),o.recent_reactions=o.recent_reactions.slice(-3))}}const f=this.availableReactions;if(o&&(null==f?void 0:f.length)){const e=new Map;f.forEach(((t,a)=>{e.set(t.reaction,a)})),o.results.sort(((t,a)=>a.count-t.count||e.get(t.reaction)-e.get(a.reaction)))}if(a)return e.reactions=o,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:o,local:!0});const c=[n,i].join("-"),l=(0,re.Z)(i),g=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(n),msg_id:l,reaction:t}).then((e=>{(0,ve.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:l,peer:this.appPeersManager.getOutputPeer(n),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(c)===g&&this.sendReaction(e,null==d?void 0:d.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(c)===g&&this.sendReactionPromises.delete(c)}));return this.sendReactionPromises.set(c,g),g}}var ya=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 _a="emoji",va="emojiAnimations",ba=new Set([_a,va]);class Pa extends G{constructor(){super(...arguments),this.storage=new H.Z(j.Z,"stickerSets")}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet(),this.getFavedStickersStickers()}),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)})}onStickersUpdated(e,t){return ya(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,se.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}getStickerSet(e,t={}){return ya(this,void 0,void 0,(function*(){const a=e.id;return this.getStickerSetPromises[a]?this.getStickerSetPromises[a]:this.getStickerSetPromises[a]=new Promise((s=>ya(this,void 0,void 0,(function*(){var n;if(!t.overwrite){const e=yield this.storage.get(a);if(e&&(null===(n=e.documents)||void 0===n?void 0:n.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),s(e),void delete this.getStickerSetPromises[a]}try{const n=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:n.set.id;this.saveStickerSet(n,i),s(n)}catch(e){s(null)}delete this.getStickerSetPromises[a]}))))}))}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:_a},{saveById:!0}),this.getStickerSet({id:va},{saveById:!0}),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,ve.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e)})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers().then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,_e.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,bt.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,_e.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:Qt(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?va:_a,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};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),this.saveStickers(e.documents);const n=s.set.installed_date||ba.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 e.id===_a?{_:"inputStickerSetAnimatedEmoji"}:e.id===va?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return ya(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,ve.Z)(e),(0,se.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:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("⭐️⭐️",!1)}getPremiumStickers(){return this.getStickersByEmoticon("📂⭐️",!1)}getFavedStickers(){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,ve.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e)})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers().then((()=>this.favedStickers))}getFavedStickersLimit(){return ya(this,void 0,void 0,(function*(){const e=yield this.apiManager.getAppConfig();return this.rootScope.premium?e.stickers_faved_limit_premium:e.stickers_faved_limit_default}))}faveSticker(e,t){return ya(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,_e.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:Qt(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return ya(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}))}searchStickerSets(e,t=!0){return ya(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,ve.Z)(e),(0,se.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:[]},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:e=>((0,ve.Z)(e),(0,se.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,bt.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,bt.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,se.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,$t.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 Ma=a(467);function Sa(e){return e&&e.toLowerCase()||""}var Ia=a(8493);class Ca 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];t.username&&delete this.usernames[Sa(t.username)],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,ee.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))},updateUserPhoto:e=>{var t,a;const s=e.user_id,n=this.users[s];if(n){if((null===(t=n.photo)||void 0===t?void 0:t.photo_id)===(null===(a=e.photo)||void 0===a?void 0:a.photo_id))return;this.forceUserOnline(s,e.date),"userProfilePhotoEmpty"===e.photo._?delete n.photo:n.photo=ie(n.photo,e.photo),this.setUserToStateIfNeeded(n),this.rootScope.dispatchEvent("user_update",s),this.rootScope.dispatchEvent("avatar_update",s.toPeerId())}else console.warn("No user by id:",s)},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:e.username}),!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}])=>{if(this.storage=a,t.length)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,ee.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,P.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,_.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.users[t]:this.apiManager.invokeApi("contacts.resolveUsername",{username:e}).then((e=>this.processResolvedPeer(e)))}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,ce.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,t.username,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,P.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a){return this.getContacts(e,t,a).then((e=>e.map((e=>e.toPeerId(!1)))))}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 te.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=Sa(t.username);delete this.usernames[e]}if(e.username){const t=Sa(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var a,s;if("userEmpty"===e._)return;const n=e.id,i=this.users[n];if(void 0===e.pFlags&&(e.pFlags={}),!e.pFlags.min||void 0===i){if(this.setUserNameToCache(e,i),i&&void 0!==i.sortName&&i.first_name===e.first_name&&i.last_name===e.last_name)e.sortName=i.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,Ma.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())),void 0===i)this.users[n]=e;else{const t=e.first_name!==i.first_name||e.last_name!==i.last_name||e.username!==i.username,r=(null===(a=i.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id),o=i.pFlags.premium!==e.pFlags.premium||i.pFlags.verified!==e.pFlags.verified||i.pFlags.scam!==e.pFlags.scam||i.pFlags.fake!==e.pFlags.fake,p=!!i.pFlags.contact,d=!!e.pFlags.contact;ie(i,e),this.rootScope.dispatchEvent("user_update",n),p!==d&&this.onContactUpdated(n,d,p),r&&this.rootScope.dispatchEvent("avatar_update",e.id.toPeerId()),(t||o)&&this.rootScope.dispatchEvent("peer_title_edit",e.id.toPeerId())}this.checkPremium(e),this.setUserToStateIfNeeded(e)}}checkPremium(e){if(e.pFlags.self){const t=!!e.pFlags.premium;this.rootScope.premium!==t&&this.rootScope.dispatchEvent("premium_toggle",t)}}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&&(e=this.getUser(e).status),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,de.Z)(e)?e:this.users[e]||{_:"userEmpty",id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}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,de.Z)(a)&&(t||!a.pFlags.min)}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}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,ee.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,ce.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,Gt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL((0,je.Z)(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,Ce.Z)(e.my_results.map((e=>(0,ce.Z)(e)))),results:e.results.map((e=>(0,ce.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,ee.Z)(!0)}:{_:"userStatusOnline",expires:(0,ee.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)}))}))}isRestricted(e){const t=this.getUser(e),a=t.restriction_reason;return!!(t.pFlags.restricted&&a&&Be(a))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}canSendToUser(e){return(0,Ia.Z)(this.getUser(e))}}const wa=new Set(["photo","video","gif","document"]);class ka 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._)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,wa.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:ie(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 Aa=a(5936);function Da(e){return function(e,t){return new Promise((t=>{const a=new FileReader;a.addEventListener("loadend",(e=>{t(e.target.result)})),a.readAsArrayBuffer(e)}))}(e)}var Ua=a(1243),Ea=a(7086);function Ta(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Fa{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=Bs()}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 Ra{getFile(e){return Promise.reject((0,Y.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''"+Ta(e)},a?{"Content-Length":a}:{}),n=Bs(),i=n.invoke("download",{headers:s,id:t}),r=(0,_.Z)();return r.cancel=()=>{r.reject((0,Y.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{Bs().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Fa(n,t)}}}var xa=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 Ba=131072,Va=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class La extends G{constructor(){super(...arguments),this.cacheStorage=new Aa.Z("cachedFiles"),this.downloadStorage=new Ra,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,M.kg)("AFM",M.v9.Error|M.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,_e.Z)(t,(e=>0===e.queueId))||(0,_e.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)&&Va.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;exa(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,(()=>xa(this,void 0,void 0,(function*(){null==r||r();const n=()=>xa(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,ve.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=U(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Ba}getLimitPart(e,t){if(!e)return 524288;let a=Ba;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===U(t)&&e.reject((0,Y.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,_.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,b,P=g.getFile.bind(g);const M=[],S=s||_,I=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,Y.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)};g&&(!m||S<=o.Iw)&&(v=g.prepareWriting(l,S,e.mimeType),I(v,l)),m&&(b=m.prepareWriting({fileName:e.fileName,downloadId:r,size:S}),I(b,c),v&&b.deferred.catch((e=>v.deferred.reject(e)))),h=null!==(a=null==b?void 0:b.deferred)&&void 0!==a?a:v.deferred,m&&f&&(P=m.getFile.bind(m)),P(l).then((e=>xa(this,void 0,void 0,(function*(){if(C(),b){const t=b.writer=b.getWriter();C();const a=yield function(e){return Da(e).then((e=>new Uint8Array(e)))}(e);C(),yield t.write(a),C(),b.deferred.resolve(yield t.finalize())}v&&v.deferred.resolve(e)})))).catch((t=>xa(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},g=()=>{try{C(),d.done=h,this.rootScope.dispatchEvent("download_progress",d)}catch(e){}},m=(0,ta.Z)(g,50,!0);let h=0;const v=()=>xa(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),b=(performance.now(),u.bytes);p.length&&v();const P=b.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const S=t+_>=s||!P;if(P){h+=P,S?g():m();performance.now();yield a,C(),performance.now(),performance.now(),yield Promise.all(M.map((({writer:e})=>null==e?void 0:e.write(b,t)))),C()}if(S&&f){const e=M.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>xa(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(),S){const e=s||P;(!s||P{var a;return null===(a=null==t?void 0:t.trim)||void 0===a?void 0:a.call(t,e)}));const t=e<=o.Iw;M.forEach((e=>{const{deferred:a,writer:s}=e;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(t);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,Ua.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.catch(Wt.Z).finally((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})))),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,Ue.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,_.Z)();if(r>this.maxUploadParts)return d.reject((0,Y.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=Wt.Z};const g=s?"upload.saveBigFilePart":"upload.saveFilePart",m=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let _=0;_xa(this,void 0,void 0,(function*(){v();const i=e.slice(_,_+n),m=yield Da(i);return v(),h.debug&&h.log("Upload file part, isBig:",s,b,m.byteLength,new Uint8Array(m).length,new Uint8Array(m).slice().length),h.apiManager.invokeApi(g,{file_id:o,file_part:b,file_total_parts:r,bytes:m},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:_,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,Y.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,Y.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 Oa=a(6666),Na=a(3306);class Za 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}=e,r=JSON.stringify(s);let o;return this.hashes[i]&&(o=this.hashes[i][r],o&&(s.hash=o.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return o.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),this.hashes[i][r]={hash:e,result:t}}return e.processResult?e.processResult(t):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 g=()=>{const e=c.get(f);return e===h?void 0:e},m=this.invokeApi(n,o,p).then((e=>g()||i(e)),(e=>{const t=g();if(t)return t;if(!r)throw e;return r(e)})),h=m.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,a;return this.appConfig=e,a=null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[],Re.clear(),a.forEach((e=>{Re.add(e)})),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}}var qa=a(8453),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())}))};class ja extends Za{constructor(){super(),this.log=(0,M.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=b.Z.transport,N.addEventListener("transport",(e=>{this.changeTransportType(e)}))}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),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=B(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 Ga(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield Rt.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(y.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ga(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}Rt.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,Rt.Z.set({dc:this.baseDcId})}logOut(){return Ga(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=>Rt.Z.get(e)))),a=[];for(let e=0;eGa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,qa.Z)(!1,!0),Oa.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=>Rt.Z.get(e)))).then((([i,o])=>Ga(this,void 0,void 0,(function*(){let l,g;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Na.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Na.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);Rt.Z.set({[d]:U(a.authKey),[f]:U(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){g=e}const m=this.getTransportType(a);if(m!==n&&(p=this.generateNetworkerGetKey(e,m,a),c.destroy(),V.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,m)),this.log("transport has been changed during authorization from",n,"to",m)),delete this.gettingNetworkers[p],g)throw this.log("get networker error",g,g.stack),g;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(Wt.Z,Wt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&V.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),V.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,_.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(Wt.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=>{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&&(Rt.Z.delete("dc"),Rt.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,v.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,v.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)throw s;return(0,v.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=>Ga(this,void 0,void 0,(function*(){if(t?(0,de.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 Ha{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)}}ke(Ha,[p.Z,G]);const Wa=Ha;class za{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t="full"){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="full",a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t="full"){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const Ka={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:"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:"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:"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:-779165146,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?Vector"}],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:"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:-1460809483,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"}],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:-1938625919,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:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?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"}],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:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],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:856375399,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"}],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:"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:"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:"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:408623183,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"}],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:-673242758,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:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:1073147056,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:"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"}],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:"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:-2107528095,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:"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"}],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:-362240487,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:"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?Vector"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1682413576,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:"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:1135492588,predicate:"updateStickerSets",params:[],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:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{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:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{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:-646342540,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"}],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:-2074799289,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"}],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:-1340916937,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:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{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"}],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:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{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"}],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:"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:"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:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],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:"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:1705297877,predicate:"messages.sponsoredMessages",params:[{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:-2091463255,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:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{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:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],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:1370914559,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:"string"}],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:"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:-1974518743,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"currency",type:"string"},{name:"monthly_amount",type:"long"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"}],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:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],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:228423076,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:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?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:-497026848,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:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?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:-869258997,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:"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:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],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:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",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:"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:1029681423,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"}],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:2057376407,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:"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:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?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:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{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:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],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:-134016113,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:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?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:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{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:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{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:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],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:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],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:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],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:-396644838,method:"messages.getUnreadReactions",params:[{name:"peer",type:"InputPeer"},{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:-2099097129,method:"messages.readReactions",params:[{name:"peer",type:"InputPeer"}],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:451818415,method:"messages.toggleBotInAttachMenu",params:[{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:-1850648527,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:"reply_to_msg_id",type:"flags.0?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:-362824498,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:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:1790652275,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"}],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:224186320,method:"payments.assignAppStoreTransaction",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"},{name:"receipt",type:"bytes"}],type:"Updates"},{id:1336560365,method:"payments.assignPlayMarketTransaction",params:[{name:"purchase_token",type:"string"}],type:"Updates"},{id:-1435856696,method:"payments.canPurchasePremium",params:[],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:342791565,method:"payments.requestRecurringPayment",params:[{name:"user_id",type:"InputUser"},{name:"recurring_init_charge",type:"string"},{name:"invoice_media",type:"InputMedia"}],type:"Updates"}]},layer:143};var Ja=a(745),$a=a.n(Ja),Qa=a(4736),Ya=a.n(Qa);function Xa(e){return e>>>0}function es(e,t){return e=Xa(e),t=Xa(t),Ya()(e).shiftLeft(32).add(Ya()(t))}const ts=Ya()(Number.MAX_SAFE_INTEGER),as=Ya()(Ya()[2]).pow(64),ss=as.divide(Ya()[2]);function ns(e,t=256){return Ya().fromArray(e instanceof Uint8Array?[...e]:e,t)}const is=+Ka.API.constructors.find((e=>"boolFalse"===e.predicate)).id,rs=+Ka.API.constructors.find((e=>"boolTrue"===e.predicate)).id,os=+Ka.API.constructors.find((e=>"vector"===e.predicate)).id,ps=+Ka.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id;class ds{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(rs,(t||"")+":bool"):this.writeInt(is,(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=Ya()(e)).isNegative()?as.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>>",U(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(">>>",U(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(">>>",U(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?Ka.MTProto:Ka.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(os,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 fs{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),U(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=es(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ss)?s.minus(as):s),!this.mtproto&&ts.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===rs||t!==is&&(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.slice(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===ps){const a=(i=this.fetchBytes(t+"[packed_string]"),$a().inflate(i,void 0));return new fs(a).fetchObject(e,t)}if(r===os)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,_.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,Ue.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,v.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 ds({mtproto:!0}),a=(0,Ue.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(D.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,ms.Z)(this.authKey),this.serverSalt=(0,ms.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?us.file:us.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,M.kg)(this.name+(o?"":"-C")+"-"+vs++,M.v9.Log|M.v9.Error|M.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=C(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,se.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 ds({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 ds({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 ds(a);if(!this.connectionInited){const e=Ka.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(Ka.layer,"layer");const t=Ka.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(y.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(y.Z.version+(y.Z.isMainDomain?" "+y.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(y.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===_s){const e=Ka.API.methods.find((e=>"invokeAfterMsg"===e.method));_s=e?+e.id:0}_s?(s.storeInt(_s,"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(D.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(D.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(D.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?D.Q.Closed:D.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,_.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,de.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(D.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===D.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 hs(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,cs.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({},ys),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=>Ya()(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 ds({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 ds({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 hs(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 ds({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,Ue.d)(8)%5),n=C(new Uint8Array(s)),i=(0,cs.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new ds({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 hs(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 fs(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,gs.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+U(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,gs.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 fs(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,gs.Z)(n,this.sessionId)||this.prevSessionId&&(0,gs.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+U(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 fs(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,ls((s=Ya()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;Rt.Z.set({["dc"+this.dcId+"_server_salt"]:U(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=Ya()(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),Rt.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":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.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;this.lastPingDelayDisconnectId===t&&this.pingDelayDisconnectDeferred.resolve("pong");break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class Ps extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||y.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,P.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new bs(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 Ms=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 ds;t.storeBytes((0,Na.Z)(e.modulus),"n"),t.storeBytes((0,Na.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[U(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 fs(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 Is(this,void 0,void 0,(function*(){const t=new ds({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",U(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Ms.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,gs.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",U(e.serverNonce),U(e.pq),e.fingerprints);const i=yield Ms.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 Is(this,void 0,void 0,(function*(){e.newNonce=C(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 ds({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=ls(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Is(this,void 0,void 0,(function*(){for(;;){const t=C(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=Ss(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=ns(o),d=Ya()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=ls(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 ds({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let g;d.ZP&&this.log("Send req_DH_params",f);try{g=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const m=g.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",m),"server_DH_params_fail"!==m._&&"server_DH_params_ok"!==m._)throw new Error("[MT] Server_DH_Params response invalid: "+m._);if(!(0,gs.Z)(e.nonce,m.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,gs.Z)(e.serverNonce,m.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===m._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,gs.Z)(t,m.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,m.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Is(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 fs(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,gs.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,gs.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,gs.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=U(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=ns(a),i=Ya()(s,16);if(n.compare(Ya().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(Ya().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=Ya()(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 Is(this,void 0,void 0,(function*(){const t=(0,Na.Z)(e.g.toString(16));e.b=C(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new ds({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 ds({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,gs.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,gs.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),g=l.slice(0,8),m=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],g))).slice(-16);if(!(0,gs.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=Ss(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",m,c,a),e.authKeyId=m,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],g))).slice(-16);if(!(0,gs.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],g))).slice(-16);if(!(0,gs.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=N.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)=>Is(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:C(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class ws extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,Rt.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,Ue.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,es(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&&(Rt.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class ks{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 As extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,re.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,re.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})}}const Ds=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,_.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",(e=>{const t=this.cryptoWorkersURLs.length,a=y.Z.cryptoWorkers;if(t)return this.cryptoWorkersURLs;const s=new Array(a-t).fill(void 0).map((()=>URL.createObjectURL(e)));return this.cryptoWorkersURLs.push(...s),s}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new J;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new ra,appChatsManager:new Oe,appDocsManager:new yt,appPhotosManager:new oa,appPollsManager:new pa,appUsersManager:new Ca,appWebPagesManager:new ka,appDraftsManager:new _t,appProfileManager:new ca,appNotificationsManager:new sa,apiUpdatesManager:new Ae,appAvatarsManager:new De,appGroupCallsManager:new It,appCallsManager:new Te,appReactionsManager:new ua,appMessagesManager:new ea,appMessagesIdsManager:new Et,appPrivacyManager:new da,appInlineBotsManager:new Dt,appStickersManager:new Pa,referenceDatabase:new X,appEmojiManager:new Mt,filtersStorage:new Ie,dialogsStorage:new ue,apiManager:new ja,cryptoWorker:s.Z,passwordManager:new $,apiFileManager:new La,peersStorage:new Wa,thumbsStorage:new za,networkerFactory:new Ps,rootScope:new l,authorizer:new Cs,dcConfigurator:new V,timeManager:new ws,appStoragesManager:e,appStateManager:u,appWebDocsManager:new ks,appPaymentsManager:new As};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,Ce.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,u.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()}},Us=Ds;var Es=a(3655);let Ts,Fs,Rs=!0;function xs(){return Rs}function Bs(){return Rs?Ts:void 0}const Vs=(0,M.kg)("MTPROTO"),Ls=new f.Z;Ls.addMultipleEventsListeners({environment:e=>{r(e),N.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{Vs("got state",e,a),u.userId=i,u.newVersion=s,u.oldVersion=n,Object.keys(e).forEach((t=>{u.pushToState(t,e[t],!0,!a.includes(t))})),Z.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,qa.Z)(e,t),event:(e,t)=>{Vs("will redirect event",e,t),Ls.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{Rs=e},serviceWorkerPort:(e,t,a)=>{Ts?(Ts.detachPort(Fs),Fs=void 0):(Ts=new Es.Z,Ts.addMultipleEventsListeners({requestFilePart:e=>(0,q.Z)(Us.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(Fs=a.ports[0])&&Ts.attachPort(Fs)},createObjectURL:e=>URL.createObjectURL(e)}),Vs("MTProto start"),Us.start(),Us.getManagers(),Kt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Kt.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)}(Ls,(e=>{Kt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{DZ:()=>c,Gu:()=>l,IA:()=>i,Iw:()=>p,J$:()=>d,NM:()=>s,Zi:()=>f,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d=0,f=1,c=new Set([d,f]),l=Math.max(...Array.from(c))+1},6875:(e,t,a)=>{a.d(t,{Z:()=>n});const s=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function n(e){for(let t=0;ts.has(e._)&&n!==t&&e._===a._&&e.offset-a.length===a.offset)),-1!==n){const t=e[n];a.length+=t.length,e.splice(n,1)}}while(-1!==n)}}},8859:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(2423);const n=new Set(["messageEntityPre","messageEntityCode"]);function i(e,t){let a=-1;return e.find((e=>(n.has(e._)&&(a=e.offset+e.length),t.offset=e.offset&&t.length+t.offset<=e.length+e.offset))))}},2423:(e,t,a)=>{a.d(t,{$2:()=>d,E:()=>f,QB:()=>c,SC:()=>l,bu:()=>p,it:()=>o,kO:()=>m,tY:()=>g});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="["+n+"0-9]",r="((?:https?|ftp)://|mailto:)?",o=r+"(?:"+i+"{1,64}(?::"+i+"{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}|"+i+"["+n+"·0-9-]{0,64}(?:\\."+i+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",p=(new RegExp("^"+r.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+o+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_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]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),f=/^(([^<>()[\]\\.,;:\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,}))$/,c=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,l={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},g=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in l)g.add(l[e]);const m=/^\+\d+$/},6241:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(8859),n=a(1346);function i(e,t){const a=t.filter((t=>!(0,s.Z)(e,t)));e.push(...a),(0,n.Z)(e);for(let t=0;t{function s(e){e.sort(((e,t)=>e.offset-t.offset||t.length-e.length))}a.d(t,{Z:()=>s})},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}},o={};function p(e){var t=o[e];if(void 0!==t)return t.exports;var a=o[e]={id:e,loaded:!1,exports:{}};return r[e].call(a.exports,a,a.exports,p),a.loaded=!0,a.exports}p.m=r,p.x=()=>{var e=p.O(void 0,[699,211,725,437,21,292],(()=>p(4898)));return p.O(e)},e=[],p.O=(t,a,s,n)=>{if(!a){var i=1/0;for(f=0;f=n)&&Object.keys(p.O).every((e=>p.O[e](a[o])))?a.splice(o--,1):(r=!1,n0&&e[f-1][2]>n;f--)e[f]=e[f-1];e[f]=[a,s,n]},p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},p.d=(e,t)=>{for(var a in t)p.o(t,a)&&!p.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},p.f={},p.e=e=>Promise.all(Object.keys(p.f).reduce(((t,a)=>(p.f[a](e,t),t)),[])),p.u=e=>437===e?"437.8cd31f38250954e80fcd.bundle.js":21===e?"21.8a1e14284789fc762941.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"2f5d5f4973ca9d0d4616",104:"6cbeda302cb4e61b3268",211:"a7ea0f3283af2967a6ae",292:"fd1c65cea6105dcd77a3",301:"ffb4a949577b521c6089",642:"97f14a340993585fd1ff",699:"f16d6f756c34f3914132",725:"3353d4069deb997f1a89"}[e]+".chunk.js",p.miniCssF=e=>{},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},p.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;p.g.importScripts&&(e=p.g.location+"");var t=p.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(/\/[^\/]+$/,"/"),p.p=e})(),t=p.u,a=p.e,s=new Map,n=new Map,p.u=function(e){return t(e)+(s.has(e)?"?"+s.get(e):"")},p.e=function(e){return a(e).catch((function(a){var i=n.has(e)?n.get(e):999999;if(i<1){var r=t(e);throw a.message="Loading chunk "+e+" failed after 999999 retries.\n("+r+")",a.request=r,a}return new Promise((function(t){setTimeout((function(){var a=Date.now();s.set(e,a),n.set(e,i-1),t(p.e(e))}),3e3)}))}))},(()=>{var e={678:1};p.f.i=(t,a)=>{e[t]||importScripts(p.p+p.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,n,i]=t;for(var r in n)p.o(n,r)&&(p.m[r]=n[r]);for(i&&i(p);s.length;)e[s.pop()]=1;a(t)}})(),i=p.x,p.x=()=>Promise.all([699,211,725,437,21,292].map(p.e,p)).then(i),p.x()})(); +//# sourceMappingURL=mtproto.worker.8a161a7807437aff19b2.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.8a161a7807437aff19b2.chunk.js.map b/public/mtproto.worker.8a161a7807437aff19b2.chunk.js.map new file mode 100644 index 000000000..3a1983bd5 --- /dev/null +++ b/public/mtproto.worker.8a161a7807437aff19b2.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mtproto.worker.8a161a7807437aff19b2.chunk.js","mappings":"uBAAIA,ECEIC,EACAC,EACAC,EACAC,ECLJC,E,mCCQG,MAAMC,EAAyE,CAAC,GAAK,CAAC,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,IAAK,QAAQ,KAAM,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,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,GAAI,GAAG,CAAC,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,IAAK,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,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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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","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/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/helpers/object/getDeepProperty.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/helpers/object/defineNotNumerableProperties.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/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.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/lib/mtproto/telegramMeWebManager.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/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/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.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/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/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.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/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};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,725,437,21,292].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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\r\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string,\r\n downloadId: string\r\n}>) {\r\n const fileName = '';// (options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n\r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n // console.log('getFileURL', location);\r\n // const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return /* '/' + */type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport Modes from '../../config/modes';\r\nimport makeError from '../../helpers/makeError';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport {logger} from '../logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string,\r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n\r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n\r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n\r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n\r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n\r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n\r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n // return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n\r\n reader.onerror = reject;\r\n });\r\n\r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n\r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n // return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode,\r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\r\n log?: string,\r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n\r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n\r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","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} from '../layer';\nimport type {AppMessagesManager, Dialog, 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 {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';\nimport {MTAppConfig} from './mtproto/appConfig';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': 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 '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 '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,\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': string,\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': string,\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\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', (isPremium) => {\n this.premium = isPremium;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public 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","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach((key) => {\n if(!key) {\n return;\n }\n\n // @ts-ignore\n o = o[key];\n });\n\n return o;\n}\n","/*\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {logger, LogTypes} from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport {MTConnection} from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n\r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n\r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = (e?: CloseEvent) => {\r\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import aesjs from 'aes-js';\r\nimport randomize from '../../../helpers/array/randomize';\r\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\r\nimport {Codec} from './codec';\r\n\r\n/*\r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n private id: number;\r\n private idPromise: Promise;\r\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\r\n\r\n // private cryptoEncKey: CryptoKey;\r\n // private cryptoDecKey: CryptoKey;\r\n // private cryptoKey: CryptoKey;\r\n\r\n // private encIv: Uint8Array;\r\n // private decIv: Uint8Array;\r\n\r\n // private decIvCounter: Counter;\r\n\r\n public async init(codec: Codec) {\r\n if(this.idPromise !== undefined) {\r\n this.release();\r\n }\r\n\r\n const initPayload = new Uint8Array(64);\r\n randomize(initPayload);\r\n\r\n while(true) {\r\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\r\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n randomize(initPayload);\r\n }\r\n\r\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\r\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]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\r\n encKey,\r\n encIv,\r\n decKey,\r\n decIv\r\n });\r\n\r\n this.process = async(data, operation) => {\r\n await idPromise;\r\n return this._process(data, operation);\r\n };\r\n\r\n this.id = await idPromise;\r\n\r\n this.process = this._process;\r\n\r\n // this.decIvCounter = new Counter(this.decIv);\r\n /* const key = this.cryptoEncKey = await subtle.importKey(\r\n 'raw',\r\n encKey,\r\n {name: 'AES-CTR'},\r\n false,\r\n ['encrypt']\r\n ); */\r\n\r\n // this.cryptoDecKey = await subtle.importKey(\r\n // 'raw',\r\n // decKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt']\r\n // );\r\n\r\n // this.cryptoKey = await subtle.importKey(\r\n // 'raw',\r\n // encKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt', 'decrypt']\r\n // );\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = await this.encode(initPayload.slice());\r\n\r\n // console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\r\n return cryptoMessagePort.invokeCryptoNew({\r\n method: 'aes-ctr-process',\r\n args: [{id: this.id, data, operation}],\r\n transfer: [data.buffer]\r\n }) as Promise;\r\n };\r\n\r\n public encode(payload: Uint8Array) {\r\n /* return subtle.encrypt({\r\n name: 'AES-CTR',\r\n counter: this.encIv,\r\n length: 64\r\n },\r\n this.cryptoEncKey,\r\n payload\r\n ); */\r\n return this.process(payload, 'encrypt');\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.process(payload, 'decrypt');\r\n }\r\n\r\n public async release() {\r\n const idPromise = this.idPromise;\r\n if(idPromise === undefined) {\r\n return;\r\n }\r\n\r\n this.id = undefined;\r\n this.idPromise = undefined;\r\n\r\n const id = await idPromise;\r\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\r\n }\r\n\r\n public destroy() {\r\n this.release();\r\n }\r\n\r\n // public encode(payload: Uint8Array) {\r\n // let res = this.encNew.encrypt(payload);\r\n // let bytes = new Uint8Array(bytesFromWordss(res));\r\n\r\n // return bytes;\r\n // }\r\n\r\n // public async decode(payload: Uint8Array) {\r\n // const counter = this.decIvCounter.counter.slice();\r\n // this.decIvCounter.increment();\r\n\r\n // const n: ArrayBuffer = await subtle.encrypt({\r\n // name: 'AES-CTR',\r\n // counter: counter,\r\n // length: 64\r\n // },\r\n // this.cryptoDecKey,\r\n // payload\r\n // );\r\n\r\n // const decoded = this.decNew.update(payload);\r\n\r\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\r\n\r\n // return decoded;\r\n // }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { bytesFromHex, addPadding } from \"../../bin_utils\";\r\nimport {Codec} from './codec';\r\n\r\nclass AbridgedPacketCodec implements Codec {\r\n public tag = 0xef;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n public encodePacket(data: Uint8Array) {\r\n const len = data.byteLength >> 2;\r\n let header: Uint8Array;\r\n if(len < 127) {\r\n header = new Uint8Array([len]);\r\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\r\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\r\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\r\n // console.log('got nobody cause im braindead', header, len);\r\n }\r\n\r\n return header.concat(data);\r\n // return new Uint8Array([...header, ...data]);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n let length = data[0];\r\n if(length >= 127) { // 0x7f\r\n length = data[1] | (data[2] << 8) | (data[3] << 16);\r\n\r\n return data.slice(4, length << 2 + 1); // need +1\r\n }\r\n\r\n return data.slice(1, length << 2 + 1); // need +1\r\n }\r\n}\r\n\r\nexport default new AbridgedPacketCodec();\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, {CancellablePromise} from '../../../../helpers/cancellablePromise';\r\nimport type {StoragesResults} from './loadStorages';\r\n\r\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\r\nexport default RESET_STORAGES_PROMISE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {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 {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\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type{Chat} from '../../../../layer';\r\nimport type{Dialog} from '../../appMessagesManager';\r\nimport type{User} from '../../appUsersManager';\r\nimport type {StoragesStorages} from './createStorages';\r\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\r\nimport {Awaited} from '../../../../types';\r\nimport {logger} from '../../../logger';\r\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\r\n\r\nexport type StoragesResults = Awaited>;\r\n\r\nasync function loadStoragesInner(storages: StoragesStorages) {\r\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\r\n const storagesKeys = Object.keys(storages) as Array;\r\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\r\n const promise = storages[key].getAll();\r\n return recordPromise(promise, 'storage ' + (key as any as string));\r\n });\r\n\r\n const storagesResults: {\r\n users: User[],\r\n chats: Chat[],\r\n dialogs: Dialog[]\r\n } = {} as any;\r\n const arr = await Promise.all(storagesPromises);\r\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\r\n storagesResults[storagesKeys[i]] = arr[i] as any;\r\n }\r\n\r\n arr.splice(0, storagesKeys.length);\r\n\r\n const resetStorages = await RESET_STORAGES_PROMISE;\r\n if(resetStorages.size) {\r\n for(const key of resetStorages) {\r\n storagesResults[key].length = 0;\r\n }\r\n\r\n resetStorages.clear();\r\n }\r\n\r\n return storagesResults;\r\n}\r\n\r\nlet promise: ReturnType;\r\nexport default function loadStorages(storages: StoragesStorages) {\r\n return promise ??= loadStoragesInner(storages);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Chat} from '../../../../layer';\r\nimport type {Dialog} from '../../appMessagesManager';\r\nimport type {User} from '../../appUsersManager';\r\nimport DATABASE_STATE from '../../../../config/databases/state';\r\nimport AppStorage from '../../../storage';\r\n\r\nexport type StoragesStorages = {\r\n users: AppStorage, typeof DATABASE_STATE>,\r\n chats: AppStorage, typeof DATABASE_STATE>,\r\n dialogs: AppStorage, typeof DATABASE_STATE>\r\n};\r\n\r\nexport default function createStorages() {\r\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\r\n const storages: StoragesStorages = {} as any;\r\n for(const name of names) {\r\n // @ts-ignore\r\n storages[name] = new AppStorage(DATABASE_STATE, name);\r\n }\r\n\r\n return storages;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\r\nimport randomize from '../../helpers/array/randomize';\r\nimport {AppManager} from '../appManagers/manager';\r\n\r\nexport class PasswordManager extends AppManager {\r\n public getState(): Promise {\r\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n // state = Object.assign({}, state);\r\n // state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then((state) => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n\r\n if(settings.currentPassword) {\r\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n\r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n\r\n if(settings.newPassword) {\r\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n\r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n\r\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public getInputCheckPassword(password: string, state: AccountPassword) {\r\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\r\n // console.log('SRP', inputCheckPassword);\r\n return this.apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then((auth) => {\r\n if(auth._ === 'auth.authorization') {\r\n this.apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return this.apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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;\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\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.wrapSingleMessage(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 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","export default function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\n // const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach((name) => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n // console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog,\n indexKey: ReturnType,\n index: number\n) {\n return 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, DialogPeer, Message, MessageAction, MessageMedia, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, 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 {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';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\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 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.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs\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.pinnedOrders[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(dialog, undefined, true);\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 if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.setDialogsLoaded(FOLDER_ID_ALL, false);\n this.setDialogsLoaded(FOLDER_ID_ARCHIVE, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n\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.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, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], 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.pinnedOrders[folderId].length = 0;\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\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 getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\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 return skipMigrated ? folder.dialogs.filter((dialog) => 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: Dialog;\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(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 public isPeerUnmuted(peerId: PeerId) {\n return !this.appNotificationsManager.isPeerLocalMuted(peerId, true);\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 typeof arrays[0];\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n const isRealFolder = 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 pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinnedPeerIds.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, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs));\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\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(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && 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 getDialogIndex(peerId: PeerId | Dialog, indexKey: ReturnType) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOnly(peerId);\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 if(date === undefined) {\n date = tsNow(true) + this.timeManager.getServerTimeOffset();\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex((d) => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, 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) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\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));\n }\n }\n\n return () => callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isPeerUnmuted(dialog.peerId);\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.isPeerUnmuted(dialog.peerId);\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\n ) {\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const {peerId} = dialog;\n if(toggleDialog) {\n folder.unreadPeerIds.add(peerId);\n } else {\n folder.unreadPeerIds.delete(peerId);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(peerId);\n } else {\n folder.unreadUnmutedPeerIds.delete(peerId);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\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 }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn?: boolean, message?: MyMessage, noPinnedOrderUpdate?: boolean) {\n if(!justReturn) {\n return;\n }\n\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n topDate = (message as Message.message)?.date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey(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) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n let pinnedIndex = order.indexOf(dialog.peerId);\n if(pinnedIndex === -1) {\n order.unshift(dialog.peerId);\n pinnedIndex = 0;\n this.savePinnedOrders();\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) {\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: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n // const dialogs = this.getFolderDialogs(folder_id, false);\n // const pos = dialogs.findIndex((d) => d.peerId === peerId);\n // if(pos !== -1) {\n // dialogs.splice(pos, 1);\n // }\n\n // if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n\n this.setDialogToState(dialog);\n // }\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(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 savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n\n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\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 dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n\n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\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) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: Map = new Map();\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage ||\n (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage)?.date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage)?.date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\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(topMessage || dialog.draft?._ === 'draftMessage') {\n this.saveDialog(dialog);\n updatedDialogs.set(peerId, dialog);\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\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[peerId];\n }\n }\n });\n\n if(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? FOLDER_ID_ALL, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\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;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\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(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\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(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.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, 0, dialog.draft);\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // if(dialog.peerId === -) {\n // debugger;\n // }\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);\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 settings: dialog.notify_settings\n });\n\n if(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(dialog, message?.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId: number = 0, skipMigrated = false): {\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n } | Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n if(!REAL_FOLDERS.has(folderId)) {\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(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\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 = !REAL_FOLDERS.has(folderId) || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId as REAL_FOLDER_ID;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\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 === folderId) {\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, realFolderId).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, 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 // 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.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 if(dialog) {\n if(!update.pFlags.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(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n\n const handleOrder = (order: PeerId[]) => {\n this.resetPinnedOrder(folderId);\n this.pinnedOrders[folderId].push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n\n const dialog = this.getDialogOnly(peerId);\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 const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n // this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\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 handleOrder(dialogsResult.dialogs.map((d) => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n // this.log('before order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n handleOrder(update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * 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, 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, filter: MyDialogFilter) {\n if(REAL_FOLDERS.has(filter.id)) {\n return dialog.folder_id === filter.id;\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.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: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n // console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\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 return bool;\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(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const filter = this.getFilter(filterId);\n const peers = filter && 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 isPremium = this.rootScope.premium;\n let isFolderAvailable = isPremium;\n if(!isPremium) {\n const config = await this.apiManager.getAppConfig();\n const limit = config.dialog_filters_limit_default;\n isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n }\n\n return isFolderAvailable;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\r\n // const callbacks: Array<(...args: any[]) => any> = [];\r\n\r\n constructors.forEach((baseCtor) => {\r\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\r\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\r\n /* if(name === '_constructor') {\r\n callbacks.push(value.value);\r\n return;\r\n } else */if(name === 'constructor') {\r\n return;\r\n }\r\n\r\n Object.defineProperty(\r\n derivedCtor.prototype,\r\n name,\r\n value\r\n );\r\n });\r\n });\r\n\r\n // if(callbacks.length) {\r\n // function c(...args: any[]): any {\r\n // callbacks.forEach((cb, idx) => {\r\n // // @ts-ignore\r\n // cb.apply(this, args[idx] || []);\r\n // });\r\n // };\r\n\r\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\r\n // configurable: true,\r\n // enumerable: true,\r\n // value: c,\r\n // writable: true\r\n // });\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: 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 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 &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\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 clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\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 if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\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 getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\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: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.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 this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n this.debug && this.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 this.debug && this.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 this.debug && this.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 if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\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 && curState.syncPending.seqAwaiting);\n\n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\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 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/* || '0.8.6' */;\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) => {\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 let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\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","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 * 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, InputChannel, InputChatPhoto, InputFile, InputPeer, 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';\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]: Chat.channel | Chat.chat | any};\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: Chat.chat = this.chats[chatId];\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 if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\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 if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\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._ === '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: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\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.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 changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedTitle = oldChat.title !== chat.title;\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\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] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(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: Chat.chat = this.getChat(id);\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 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._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n chat._ === '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._ === 'chatEmpty' || !(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).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.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\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.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?: any) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if(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) {\n return this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\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((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\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((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\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 });\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\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((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\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((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: Array) {\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public isRestricted(chatId: ChatId) {\n const chat: Chat.channel = this.getChat(chatId);\n const restrictionReasons = chat.restriction_reason;\n\n return !!(chat.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\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 return this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300}).then((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 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","/*\n * 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';\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\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 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 }\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport I18n, {i18n} from '../lib/langPack';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true,\r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\r\n joiner + date.getFullYear() +\r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp('20[0-9]{1,2}');\r\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\r\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if('today'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if('yesterday'.indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if(k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if(k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n\r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n\r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n\r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/**\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","/*\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 {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 type {ThumbCache} from '../storages/thumbs';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf'\n};\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 case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\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 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 return;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\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 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 }\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()) {\n if((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 }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n if(!doc.file_name) {\n doc.file_name = '';\n }\n\n 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.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: '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,\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {FileURLType, getFileURL} from '../../../../helpers/fileName';\r\nimport {Document, PhotoSize} from '../../../../layer';\r\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\r\n\r\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\r\n let type: FileURLType;\r\n if(download) {\r\n type = 'download';\r\n } else if(thumb) {\r\n type = 'thumb';\r\n } else if(doc.supportsStreaming) {\r\n type = 'stream';\r\n } else {\r\n type = 'document';\r\n }\r\n\r\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport stateStorage from '../stateStorage';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport deepEqual from '../../helpers/object/deepEqual';\r\nimport {AppManager} from './manager';\r\nimport generateMessageId from './utils/messageId/generateMessageId';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager extends AppManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerId = this.appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerId, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n\r\n /* return */stateStorage.get('drafts').then((drafts) => {\r\n this.drafts = drafts || {};\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n this.appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = this.apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n private draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n\r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n\r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n\r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n\r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n\r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n\r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n const params: MessagesSaveDraft = {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n const message = localDraft.message;\r\n const entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = this.appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return this.apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true});\r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true});\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport I18n from '../langPack';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\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 = 36;\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: string[];\n private getRecentEmojisPromise: Promise;\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(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\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.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() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = this.appStateManager.getState().then((state) => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = fixEmoji(emoji);\n this.getRecentEmojis().then((recent) => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n this.appStateManager.pushToState('recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {Document, InputMedia} from '../../../../layer';\r\n\r\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\r\n return {\r\n _: 'inputMediaDocument',\r\n id: {\r\n _: 'inputDocument',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference\r\n },\r\n ttl_seconds: 0\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDocument} from './appDocsManager';\r\nimport type {MyPhoto} from './appPhotosManager';\r\nimport type {MyTopPeer} from './appUsersManager';\r\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\r\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\r\nimport {AppManager} from './manager';\r\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\nimport generateQId from './utils/inlineBots/generateQId';\r\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\r\nimport {AppMessagesManager} from './appMessagesManager';\r\n\r\nexport class AppInlineBotsManager extends AppManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId,\r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\r\n bot: this.appUsersManager.getUserInput(botId),\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n\r\n botResults.results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = this.appDocsManager.saveDoc(result.document);\r\n }\r\n\r\n if(result.photo) {\r\n result.photo = this.appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n\r\n this.inlineResults[generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n this.appStateManager.setKeyValueToStorage('topPeersCache');\r\n\r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n return this.appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n\r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n\r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n\r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n\r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n\r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = this.appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\r\n }\r\n\r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n\r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n\r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = getDocumentMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaInvoice': {\r\n // const photo = sendMessage.photo;\r\n // inputMedia = {\r\n // _: 'inputMediaInvoice',\r\n // description: sendMessage.description,\r\n // title: sendMessage.title,\r\n // photo: photo && {\r\n // _: 'inputWebDocument',\r\n // attributes: photo.attributes,\r\n // mime_type: photo.mime_type,\r\n // size: photo.size,\r\n // url: photo.url\r\n // },\r\n // invoice: undefined,\r\n // payload: undefined,\r\n // provider: undefined,\r\n // provider_data: undefined,\r\n // start_param: undefined\r\n // };\r\n\r\n messageMedia = {\r\n _: 'messageMediaInvoice',\r\n title: sendMessage.title,\r\n description: sendMessage.description,\r\n photo: sendMessage.photo,\r\n currency: sendMessage.currency,\r\n total_amount: sendMessage.total_amount,\r\n pFlags: {\r\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\r\n test: sendMessage.pFlags.test\r\n },\r\n start_param: undefined\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia && messageMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n messageMedia\r\n };\r\n }\r\n\r\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n\r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MESSAGE_ID_INCREMENT} from './utils/messageId';\r\nimport generateMessageId from './utils/messageId/generateMessageId';\r\n\r\nexport class AppMessagesIdsManager {\r\n private tempNum = 0;\r\n\r\n public generateTempMessageId(messageId: number) {\r\n const num = ++this.tempNum;\r\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../config/app';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport Modes from '../../config/modes';\r\nimport loadScript from '../../helpers/dom/loadScript';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(\r\n canRedirect &&\r\n curValue?.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts\r\n ) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect,\r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map((url) => {\r\n return loadScript(url).then((script) => {\r\n script.remove();\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","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","/*\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 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} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {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, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID} from '../mtproto/mtproto_config';\nimport 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 type {MediaSize} from '../../helpers/mediaSize';\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 type {Progress} from './appDownloadManager';\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';\n\n// console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\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;\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\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: {[peerId: PeerId]: 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 = null;\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: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\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: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: 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\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: Dialog) => 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 if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\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 }\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 this.setDialogToStateIfMessageIsTop(message);\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] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (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: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true,\n sendAsPeerId: PeerId,\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 = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\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 }, 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 // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(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, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: boolean,\n silent: boolean,\n clearDraft: boolean,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }> = {}) {\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 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\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: '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 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)) {\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,\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: '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(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\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 = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\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'});\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});\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 };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : 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 */) => {\n toggleError(true);\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'});\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) => {\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(true);\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, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...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', files, 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 = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\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, file, 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: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\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'});\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 }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach((message) => toggleError(message, true));\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 this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then((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 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: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\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(peerId: PeerId, inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia}, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint,\n sendAsPeerId: PeerId,\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 = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\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 }, 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) => {\n toggleError(true);\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: Partial<{\n isGroupedItem: boolean,\n isScheduled: boolean,\n threadId: number,\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 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 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 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: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\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(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(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId\n } as MessageReplyHeader;\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 return peerId.isAnyChat() && this.appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\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(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\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 getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\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 return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: REAL_FOLDER_ID, offsetDate?: number) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\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\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\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\n return this.apiManager.invokeApiSingle('messages.getDialogs', params, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: Map = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), (dialog) => {\n // const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\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(dialog.peerId === undefined) {\n return;\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(!getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, dialog);\n\n this.log.error('noIdsDialogs', dialog, params);\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 = (dialogsResult 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 if(getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !dialogsResult.dialogs.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 = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\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\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean,\n sendAsPeerId: PeerId,\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] ?? (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 }).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 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.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 getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\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 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 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 this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n return this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\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\n // fullfillLeft();\n // resolve();\n }, (err) => {\n // fullfillLeft();\n // resolve();\n // reject(err);\n }).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(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return this.apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\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 return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(this.appPeersManager.isChannel(peerId)) {\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(this.appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n this.flushStoragesByPeerId(peerId);\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\n [\n this.historiesStorage,\n this.threadsStorage,\n this.searchesStorage,\n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\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\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 getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\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 }).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) {\n return this.pinnedMessages[peerId]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId) {\n return this.pinnedMessages[peerId]?.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[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 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 if(message.pFlags === undefined) {\n message.pFlags = {};\n }\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.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 const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\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 if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = generateMessageId(message.reply_to.reply_to_msg_id);\n }\n\n if(message.reply_to.reply_to_top_id) {\n message.reply_to.reply_to_top_id = generateMessageId(message.reply_to.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 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 if(isMessage && message.media) {\n let unsupported = false;\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n message.media.photo = this.appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.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(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = message.media.document;\n message.media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!message.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 message.media.webpage = this.appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\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 message.media.photo = this.appWebDocsManager.saveWebDocument(message.media.photo);\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n\n if(unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\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) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = this.appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\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(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const appConfig = await this.apiManager.getAppConfig();\n const max = filterId === 1 ?\n (this.rootScope.premium ? appConfig.dialogs_folder_pinned_limit_premium : appConfig.dialogs_folder_pinned_limit_default) :\n (this.rootScope.premium ? appConfig.dialogs_pinned_limit_premium : appConfig.dialogs_pinned_limit_default);\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\n }\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n if(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\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: Chat.chat = this.appChatsManager.getChat(migrateFrom.toChatId());\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 if(!message.pFlags.out || (\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;\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(peerId: PeerId, filters: MessagesFilter[], canCache = true): Promise {\n if(this.appPeersManager.isRestricted(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 });\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.isRestricted(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: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\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.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 result.max_id = historyStorage.maxId = 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 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 map = this.newDialogsToHandle;\n for(const [peerId, dialog] of map) {\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n map.delete(peerId);\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!this.appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\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', map);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle.set(peerId, dialog);\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\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: Chat.channel = this.appChatsManager.getChat(channelId);\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 if(!this.getReadMaxIdIfUnread(peerId, threadId)) {\n if(!force && !threadId) {\n const dialog = 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 }\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 public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\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) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (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);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = 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);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\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).then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return this.apiManager.invokeApiSingle('messages.getUnreadMentions', {\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 }).then((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 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 if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (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) {\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted(peerId, true),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n this.getNotifyPeerSettings(peerId).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 private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(message) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\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 const dialog = this.getDialogOnly(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 const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(message._ === 'messageService' && message.action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = 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);\n }\n\n return;\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 const pendingMessage = 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(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 if(isLocalThreadUpdate) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\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);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\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 if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = ctx.setTimeout(this.handleNotifications, 0);\n }\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 && 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 // 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 return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, dialog]]));\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' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = 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);\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 = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\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 if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n\n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && 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\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && 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(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\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 if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\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 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);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\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();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n\n const historyUpdated = this.handleDeletedMessages(peerId, this.getHistoryMessagesStorage(peerId), messages);\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 historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).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 foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\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, foundDialog);\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: Chat.channel = this.appChatsManager.getChat(channelId);\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!channel.username || !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 this.flushStoragesByPeerId(peerId);\n this.reloadConversation(peerId).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.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.wrapSingleMessage(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[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 if(peer._ === 'notifyPeer') {\n const peerId = this.appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\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 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?.reply_to && threadMessage.peerId?.isAnyChat()) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(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', {storageKey: pendingData.storage.key, message, sequential: pendingData.sequential});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, muteUntil: number) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n return this.appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: this.appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public togglePeerMute(peerId: PeerId, mute?: boolean) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n\n return this.mutePeer(peerId, mute ? MUTE_UNTIL : 0);\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.isRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(peerId.toChatId(), 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 // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\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\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, '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?: string,\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?: string}[] = 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: Chat.chat | Chat.channel = this.appChatsManager.getChat(message.peerId.toChatId());\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 const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\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.isRestricted(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) {\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.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() && !this.appChatsManager.isInChat(peerId.toChatId());\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.isRestricted(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(slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number) {\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: any = {\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.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(this.appPeersManager.isChannel(peerId)) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).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 channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\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 = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false) {\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 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.wrapSingleMessage(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, this.getDialogOnly(peerId)]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\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[peerId] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[peerId];\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) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\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) => _reactionCount.reaction === reactionCount.reaction);\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.pFlags.chosen && (\n !previousReactionCount ||\n !previousReactionCount.pFlags.chosen\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\r\nimport {Document} from '../../../../layer';\r\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\r\n\r\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\r\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\r\n}\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport tsNow from '../../helpers/tsNow';\r\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\r\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\r\nimport throttle from '../../helpers/schedulers/throttle';\r\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\r\nimport {AppManager} from './manager';\r\nimport ctx from '../../environment/ctx';\r\nimport assumeType from '../../helpers/assumeType';\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager extends AppManager {\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n private checkMuteUntilTimeout: number;\r\n private checkMuteUntilThrottled: () => void;\r\n\r\n private notifyContactsSignUp: Promise;\r\n\r\n protected after() {\r\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && this.appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId,\r\n settings: update.notify_settings\r\n });\r\n this.rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n return this.appStateManager.getState().then((state) => {\r\n if(state.notifySettings) {\r\n for(const key in state.notifySettings) {\r\n assumeType>(key);\r\n this.savePeerSettings({\r\n key,\r\n settings: state.notifySettings[key]\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then((settings) => {\r\n this.savePeerSettings({\r\n key,\r\n peerId,\r\n settings\r\n });\r\n\r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n // this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return this.apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then((value) => {\r\n if(value) {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings',\r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n },\r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings'\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // public getNotifyExceptions() {\r\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n // .then((updates) => {\r\n // apiUpdatesManager.processUpdateMessage(updates);\r\n // });\r\n // }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then((value) => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private checkMuteUntil = () => {\r\n if(this.checkMuteUntilTimeout !== undefined) {\r\n clearTimeout(this.checkMuteUntilTimeout);\r\n this.checkMuteUntilTimeout = undefined;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n let closestMuteUntil = MUTE_UNTIL;\r\n for(const peerId in this.peerSettings.notifyPeer) {\r\n const peerNotifySettings = this.peerSettings.notifyPeer[peerId];\r\n if(peerNotifySettings instanceof Promise) {\r\n continue;\r\n }\r\n\r\n const muteUntil = peerNotifySettings.mute_until;\r\n if(!muteUntil) {\r\n continue;\r\n }\r\n\r\n if(muteUntil <= timestamp) {\r\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\r\n peerNotifySettings.mute_until = 0;\r\n\r\n this.apiUpdatesManager.saveUpdate({\r\n _: 'updateNotifySettings',\r\n peer: {\r\n _: 'notifyPeer',\r\n peer: this.appPeersManager.getOutputPeer(peerId.toPeerId())\r\n },\r\n notify_settings: peerNotifySettings\r\n });\r\n } else if(muteUntil < closestMuteUntil) {\r\n closestMuteUntil = muteUntil;\r\n }\r\n }\r\n\r\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\r\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\r\n };\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId,\r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n\r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n this.appStateManager.getState().then((state) => {\r\n const notifySettings = state.notifySettings;\r\n notifySettings[key] = settings;\r\n this.appStateManager.pushToState('notifySettings', notifySettings);\r\n });\r\n } else {\r\n this.checkMuteUntilThrottled();\r\n }\r\n\r\n // rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\r\n }\r\n\r\n private getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n private getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = this.appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(const i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === this.appPeersManager.peerId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\r\nimport type {LangPackKey} from '../langPack';\r\nimport {getRestrictionReason} from '../../helpers/restrictions';\r\nimport isObject from '../../helpers/object/isObject';\r\nimport {AppManager} from './manager';\r\nimport getPeerId from './utils/peers/getPeerId';\r\nimport isUser from './utils/peers/isUser';\r\nimport isAnyChat from './utils/peers/isAnyChat';\r\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager extends AppManager {\r\n public get peerId() {\r\n return this.appUsersManager.userId.toPeerId();\r\n }\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n if(this.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const photo = peerId.isUser() ?\r\n this.appUsersManager.getUserPhoto(peerId.toUserId()) :\r\n this.appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(this.appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return this.appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return this.appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser() ?\r\n this.appUsersManager.getUser(peerId.toUserId()) :\r\n this.appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: Parameters[0]) {\r\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return isUser(peerId);\r\n }\r\n\r\n public isAnyChat(peerId: PeerId) {\r\n return isAnyChat(peerId);\r\n }\r\n\r\n public isRestricted(peerId: PeerId) {\r\n return peerId.isUser() ? this.appUsersManager.isRestricted(peerId.toUserId()) : this.appChatsManager.isRestricted(peerId.toChatId());\r\n }\r\n\r\n public getRestrictionReasonText(peerId: PeerId) {\r\n const peer: Chat.channel | User.user = this.getPeer(peerId);\r\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\r\n if(reason) {\r\n return reason.text;\r\n } else {\r\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\r\n }\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer',\r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return this.appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return this.appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n /**\r\n * ! use it only in safe places like requests\r\n */\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = this.appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === this.peerId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): Extract {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n\r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = this.appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport copy from '../../helpers/object/copy';\r\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\r\nimport {logger, LogTypes} from '../logger';\r\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\r\nimport {AppManager} from './manager';\r\nimport getServerMessageId from './utils/messageId/getServerMessageId';\r\n\r\nexport class AppPollsManager extends AppManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n\r\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId],\r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n\r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map((index) => {\r\n return poll.answers[index].option;\r\n });\r\n\r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid),\r\n options\r\n }).then((updates) => {\r\n this.log('sendVote updates:', updates);\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return this.apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid)\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return this.apiManager.invokeApi('messages.getPollVotes', {\r\n peer: this.appPeersManager.getInputPeerById(message.peerId),\r\n id: getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n this.appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n\r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return this.appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n // console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\r\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\r\nimport {AppManager} from './manager';\r\n\r\nexport class AppPrivacyManager extends AppManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n this.rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return this.apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map((inputRule) => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n\r\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getGlobalPrivacySettings() {\r\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings')\r\n }\r\n\r\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\r\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\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 typingsInPeer: {[peerId: PeerId]: 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) {\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\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 fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = this.appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\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 const peerId = id.toPeerId(true);\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.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 &&\n chat.pFlags && (\n // chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.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 if(this.chatsFull[id] !== undefined && !override) {\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 const peerId = id.toPeerId(true);\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.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: Chat.channel | Chat.channelForbidden = this.appChatsManager.getChat(id);\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [{\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(this.appPeersManager.peerId, 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 });\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 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 peerId = this.appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\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, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && 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, 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, 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) {\n return this.typingsInPeer[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 {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T,\n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): PromiseLike | 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 assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\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 });\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 ?? [];\n\n const filteredChatAvailableReactions = chatAvailableReactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }).filter(Boolean);\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction.availableReaction[], quickReaction: AvailableReaction.availableReaction) {\n const availableReaction = findAndSplice(availableReactions, availableReaction => availableReaction.reaction === quickReaction.reaction);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction.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.getAppConfig(),\n this.getAvailableReactions()\n ], ([appConfig, availableReactions]) => {\n return availableReactions.find((reaction) => reaction.reaction === appConfig.reactions_default);\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?: string, 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: string) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getAppConfig();\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 sendReaction(message: Message.message, reaction?: string, onlyLocal?: boolean) {\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 let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactionIdx = reactions ? reactions.results.findIndex((reactionCount) => reactionCount.pFlags.chosen) : -1;\n const chosenReaction = chosenReactionIdx !== -1 && reactions.results[chosenReactionIdx];\n if(chosenReaction) { // clear current reaction\n --chosenReaction.count;\n delete chosenReaction.pFlags.chosen;\n\n if(reaction === chosenReaction.reaction) {\n reaction = undefined;\n }\n\n if(!chosenReaction.count) {\n reactions.results.splice(chosenReactionIdx, 1);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n }\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(!this.appPeersManager.isBroadcast(message.peerId)) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionCount.reaction === reaction);\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction,\n pFlags: {}\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.pFlags.chosen = true;\n\n if(!reactions.recent_reactions && reactions.pFlags.can_see_list) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const userReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId)) {\n reactions.recent_reactions.push(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(userReaction);\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 return (b.count - a.count) || (indexes.get(a.reaction) - indexes.get(b.reaction));\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\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, chosenReaction?.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 {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\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\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 protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\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 }\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 public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\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 delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\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(): 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 });\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().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 ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID;\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 };\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 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) {\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(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\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: []}, 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() {\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 });\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().then(() => this.favedStickers);\n }\n\n public async getFavedStickersLimit() {\n const appConfig = await this.apiManager.getAppConfig();\n return this.rootScope.premium ? appConfig.stickers_faved_limit_premium : appConfig.stickers_faved_limit_default;\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 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: []}, 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 public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: (allStickers) => {\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 }\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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';\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]: UserId};\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: update.username\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 if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n\n this.checkPremium(user);\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 }\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 if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\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 || (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 userId = this.usernames[username];\n if(userId) {\n return this.users[userId];\n }\n\n return this.apiManager.invokeApi('contacts.resolveUsername', {username}).then((resolvedPeer) => {\n return 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 user.username,\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 ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n return userIds.map((userId) => userId.toPeerId(false));\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 private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(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 if(user.pFlags === undefined) {\n user.pFlags = {};\n }\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 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 // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\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 user.username !== oldUser.username;\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', user.id.toPeerId());\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n }\n\n this.checkPremium(user);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle', 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 status = this.getUser(status).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] || {_: 'userEmpty', id, pFlags: {deleted: true}, access_hash: ''} as any as User;\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 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 getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\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, showPhone?: true) {\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: showPhone\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 isRestricted(userId: UserId) {\n const user: MTUser.user = this.getUser(userId);\n const restrictionReasons = user.restriction_reason;\n\n return !!(user.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\r\nimport {WebPage} from '../../layer';\r\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\r\nimport {AppManager} from './manager';\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager extends AppManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n\r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage &&\r\n oldWebPage._ === apiWebPage._ &&\r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n\r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n\r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n // delete apiWebPage.description\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n\r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n\r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n\r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(),\r\n mid: +mid,\r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n this.rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getCachedWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n\r\n public getWebPage(url: string) {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 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';\nimport StreamWriter from './streamWriter';\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {ReferenceBytes} from './referenceDatabase';\r\nimport Modes from '../../config/modes';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport {randomLong} from '../../helpers/random';\r\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\r\nimport {DcId} from '../../types';\r\nimport CacheStorageController from '../files/cacheStorage';\r\nimport {logger, LogTypes} from '../logger';\r\nimport assumeType from '../../helpers/assumeType';\r\nimport noop from '../../helpers/noop';\r\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport findAndSplice from '../../helpers/array/findAndSplice';\r\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\r\nimport {AppManager} from '../appManagers/manager';\r\nimport {getEnvironment} from '../../environment/utils';\r\nimport MTProtoMessagePort from './mtprotoMessagePort';\r\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\r\nimport type {Progress} from '../appManagers/appDownloadManager';\r\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\r\n// import networkStats from './networkStats';\r\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\r\nimport StreamWriter from '../files/streamWriter';\r\nimport FileStorage from '../files/fileStorage';\r\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\r\nimport throttle from '../../helpers/schedulers/throttle';\r\nimport makeError from '../../helpers/makeError';\r\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\r\nimport DownloadStorage from '../files/downloadStorage';\r\nimport copy from '../../helpers/object/copy';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\n\r\ntype Delayed = {\r\n offset: number,\r\n writePromise: CancellablePromise,\r\n writeDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId,\r\n location: InputFileLocation | InputWebFileLocation,\r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n downloadId?: string\r\n // getFileMethod: Parameters[1]\r\n};\r\n\r\nexport type DownloadMediaOptions = {\r\n media: Photo.photo | Document.document | WebDocument,\r\n thumb?: PhotoSize | VideoSize,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n downloadId?: string\r\n};\r\n\r\ntype DownloadPromise = CancellablePromise;\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// };\r\n\r\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// originalPayload: ReferenceBytes\r\n// };\r\n\r\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\r\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\r\nconst MIN_PART_SIZE = 128 * 1024;\r\nconst AVG_PART_SIZE = 512 * 1024;\r\n\r\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\r\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\r\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\r\n\r\nconst IGNORE_ERRORS: Set = new Set([\r\n 'DOWNLOAD_CANCELED',\r\n 'UPLOAD_CANCELED',\r\n 'UNKNOWN',\r\n 'NO_NEW_CONTEXT'\r\n]);\r\n\r\nexport class ApiFileManager extends AppManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloadStorage = new DownloadStorage();\r\n\r\n private downloadPromises: {\r\n [fileName: string]: DownloadPromise\r\n } = {};\r\n\r\n // private downloadToDiscPromises: {\r\n // [fileName: string]: DownloadPromise\r\n // } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: CancellablePromise\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout?: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n private maxUploadParts = 4000;\r\n private maxDownloadParts = 8000;\r\n private webFileDcId: DcId;\r\n\r\n protected after() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n\r\n this.rootScope.addEventListener('config', (config) => {\r\n this.webFileDcId = config.webfile_dc_id;\r\n });\r\n\r\n this.rootScope.addEventListener('app_config', (appConfig) => {\r\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\r\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\r\n });\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\r\n // const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\r\n return false;\r\n }\r\n\r\n // const data = downloadPull.shift();\r\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n\r\n const promise = data.cb();\r\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\r\n /* Promise.race([\r\n promise\r\n // networkPromise\r\n ]) */promise.then(() => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n // networkPromise.resolve();\r\n }, (error: ApiError) => {\r\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n // networkPromise.reject(error);\r\n }).finally(() => {\r\n promise.then(data.deferred.resolve, data.deferred.reject);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n // this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel?.();\r\n\r\n return this.apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(\r\n dcId: DcId,\r\n location: InputFileLocation,\r\n offset: number,\r\n limit: number,\r\n id = 0,\r\n queueId = 0,\r\n checkCancel?: () => void\r\n ) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel?.();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\r\n\r\n // * IMPORTANT: reference can be changed in previous request\r\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\r\n\r\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\r\n this.apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise/* ) */;\r\n\r\n return promise.catch((err: ApiError) => {\r\n checkCancel?.();\r\n\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location, reference).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / MIN_PART_SIZE;\r\n }\r\n\r\n private getLimitPart(size: number, isUpload: boolean): number {\r\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\r\n return AVG_PART_SIZE;\r\n }\r\n\r\n // return 1 * 1024 * 1024;\r\n\r\n let bytes = MIN_PART_SIZE;\r\n\r\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\r\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\r\n // usually it will stick to 512Kb size if the file is too big\r\n while((size / bytes) > maxParts && bytes < maxPartSize) {\r\n bytes *= 2;\r\n }\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\r\n };\r\n\r\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\r\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n const buffer = bytes.slice().buffer;\r\n if(getEnvironment().IS_FIREFOX) {\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\r\n return fixFirefoxSvg(text as string);\r\n }).then((text) => {\r\n const textEncoder = new TextEncoder();\r\n return textEncoder.encode(text);\r\n });\r\n }\r\n\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance();\r\n return instance.invoke('convertWebp', {fileName, bytes});\r\n };\r\n\r\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance();\r\n return instance.invoke('convertOpus', {fileName, bytes});\r\n };\r\n\r\n private refreshReference(\r\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\r\n reference: typeof inputFileLocation['file_reference'],\r\n hex = bytesToHex(reference)\r\n ) {\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred\r\n\r\n // ! I don't remember what it was for...\r\n // timeout: ctx.setTimeout(() => {\r\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\r\n // }, 60000)\r\n };\r\n\r\n // deferred.catch(noop).finally(() => {\r\n // clearTimeout(r.timeout);\r\n // });\r\n\r\n this.referenceDatabase.refreshReference(reference).then((reference) => {\r\n if(hex === bytesToHex(reference)) {\r\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\r\n }\r\n\r\n deferred.resolve(reference);\r\n }, deferred.reject);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then((reference) => {\r\n inputFileLocation.file_reference = reference;\r\n });\r\n }\r\n\r\n public isDownloading(fileName: string) {\r\n return !!this.downloadPromises[fileName];\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloadPromises[fileName];\r\n }\r\n\r\n public getUpload(fileName: string) {\r\n return this.uploadPromises[fileName];\r\n }\r\n\r\n private getConvertMethod(mimeType: string) {\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n if(mimeType === 'application/x-tgwallpattern') {\r\n process = this.uncompressTGV;\r\n mimeType = 'image/svg+xml';\r\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\r\n process = this.convertWebp;\r\n mimeType = 'image/png';\r\n } else if(mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n mimeType = 'application/json';\r\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\r\n process = this.convertOpus;\r\n mimeType = 'audio/wav';\r\n }\r\n\r\n return {mimeType, process};\r\n }\r\n\r\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\r\n const delayed: Delayed[] = [];\r\n let offset = startOffset;\r\n let writePromise: CancellablePromise = Promise.resolve(),\r\n writeDeferred: CancellablePromise;\r\n do {\r\n writeDeferred = deferredPromise();\r\n delayed.push({offset, writePromise, writeDeferred});\r\n writePromise = writeDeferred;\r\n offset += limitPart;\r\n } while(offset < size);\r\n\r\n return delayed;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadPromise {\r\n const size = options.size ?? 0;\r\n const {dcId, location, downloadId} = options;\r\n\r\n const originalMimeType = options.mimeType;\r\n const convertMethod = this.getConvertMethod(originalMimeType);\r\n const {process} = convertMethod;\r\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\r\n\r\n const fileName = getDownloadFileNameFromOptions(options);\r\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\r\n const cacheStorage: FileStorage = this.getFileStorage();\r\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\r\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\r\n\r\n this.debug && this.log('downloadFile', fileName, options);\r\n\r\n if(deferred) {\r\n return deferred;\r\n }\r\n\r\n // if(deferred) {\r\n // if(size) {\r\n // return deferred.then(async(blob) => {\r\n // if(blob instanceof Blob && blob.size < size) {\r\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n // try {\r\n // await this.delete(fileName);\r\n // } finally {\r\n // return this.download(options);\r\n // }\r\n // } else {\r\n // return blob;\r\n // }\r\n // });\r\n // } else {\r\n // return deferred;\r\n // }\r\n // }\r\n\r\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\r\n if(item?.error) {\r\n return;\r\n }\r\n\r\n for(const p of prepared) {\r\n if(item && item !== p) {\r\n continue;\r\n }\r\n\r\n p.error = error;\r\n p.deferred.reject(error);\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n const limitPart = options.limitPart || this.getLimitPart(size, false);\r\n\r\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\r\n\r\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\r\n downloadPrepared: typeof cachePrepared;\r\n const prepared: (typeof cachePrepared)[] = [];\r\n const possibleSize = size || limitPart;\r\n\r\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\r\n\r\n const attach = (item: typeof cachePrepared, fileName: string) => {\r\n const {deferred} = item;\r\n const _errorHandler = errorHandler.bind(null, item);\r\n\r\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\r\n deferred.catch((error) => {\r\n _errorHandler(error);\r\n item.writer?.truncate?.();\r\n }).finally(() => {\r\n if(this.downloadPromises[fileName] === deferred) {\r\n delete this.downloadPromises[fileName];\r\n }\r\n\r\n delete item.writer;\r\n // indexOfAndSplice(prepared, item);\r\n });\r\n\r\n this.downloadPromises[fileName] = deferred;\r\n\r\n prepared.push(item);\r\n };\r\n\r\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\r\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\r\n attach(cachePrepared, cacheFileName);\r\n }\r\n\r\n if(downloadStorage) {\r\n downloadPrepared = downloadStorage.prepareWriting({\r\n fileName: options.fileName, // it's doc file_name\r\n downloadId,\r\n size: possibleSize\r\n });\r\n attach(downloadPrepared, fileName);\r\n\r\n if(cachePrepared) { // cancel cache too\r\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\r\n }\r\n\r\n // this.downloadToDiscPromises[cacheFileName] = deferred;\r\n // deferred.catch(noop).finally(() => {\r\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\r\n // delete this.downloadToDiscPromises[cacheFileName];\r\n // }\r\n // });\r\n }\r\n\r\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\r\n\r\n if(downloadStorage && process) { // then have to load file again\r\n getFile = downloadStorage.getFile.bind(downloadStorage);\r\n }\r\n\r\n getFile(cacheFileName).then(async(blob: Blob) => {\r\n checkCancel();\r\n\r\n // if(blob.size < size) {\r\n // if(!options.onlyCache) {\r\n // await this.delete(cacheFileName);\r\n // checkCancel();\r\n // }\r\n\r\n // throw makeError('NO_ENTRY_FOUND');\r\n // }\r\n\r\n if(downloadPrepared) {\r\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\r\n checkCancel();\r\n\r\n const arr = await readBlobAsUint8Array(blob);\r\n checkCancel();\r\n await writer.write(arr);\r\n checkCancel();\r\n\r\n downloadPrepared.deferred.resolve(await writer.finalize());\r\n }\r\n\r\n if(cachePrepared) {\r\n cachePrepared.deferred.resolve(blob);\r\n }\r\n }).catch(async(err: ApiError) => {\r\n if(options.onlyCache) {\r\n errorHandler(null, err);\r\n return;\r\n }\r\n\r\n prepared.forEach((p) => {\r\n p.writer = p.getWriter();\r\n });\r\n\r\n const maxRequests = Infinity;\r\n\r\n const isWebFile = location._ === 'inputWebFileLocation';\r\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\r\n\r\n if(isWebFile && this.webFileDcId === undefined) {\r\n await this.apiManager.getConfig();\r\n checkCancel();\r\n }\r\n\r\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\r\n\r\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\r\n const dispatchProgress = () => {\r\n try {\r\n checkCancel();\r\n progress.done = done;\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n } catch(err) {}\r\n };\r\n\r\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n const {offset, writePromise, writeDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n const requestPerf = performance.now();\r\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\r\n const requestTime = performance.now() - requestPerf;\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n const byteLength = bytes.byteLength;\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = (offset + limitPart) >= size || !byteLength;\r\n if(byteLength) {\r\n done += byteLength;\r\n\r\n if(isFinal) {\r\n dispatchProgress();\r\n } else {\r\n throttledDispatchProgress();\r\n }\r\n\r\n const writeQueuePerf = performance.now();\r\n await writePromise;\r\n checkCancel();\r\n const writeQueueTime = performance.now() - writeQueuePerf;\r\n\r\n const perf = performance.now();\r\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\r\n checkCancel();\r\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\r\n }\r\n\r\n if(isFinal && process) {\r\n const promises = prepared\r\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\r\n .map(async({writer}) => {\r\n const bytes = writer.getParts();\r\n const processedResult = await process(bytes, cacheFileName);\r\n writer.replaceParts(processedResult);\r\n });\r\n\r\n await Promise.all(promises);\r\n checkCancel();\r\n }\r\n\r\n writeDeferred.resolve();\r\n\r\n if(isFinal) {\r\n const realSize = size || byteLength;\r\n if(!size || byteLength < size) {\r\n prepared.forEach(({writer}) => writer?.trim?.(realSize));\r\n }\r\n\r\n const saveToStorage = realSize <= MAX_FILE_SAVE_SIZE;\r\n prepared.forEach((item) => {\r\n const {deferred, writer} = item;\r\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\r\n return;\r\n }\r\n\r\n const result = writer.finalize(saveToStorage);\r\n deferred.resolve(result);\r\n });\r\n }\r\n } catch(err) {\r\n errorHandler(null, err as ApiError);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch(noop);\r\n\r\n const checkCancel = () => {\r\n if(getErrorsCount() === prepared.length) {\r\n throw prepared[0].error;\r\n }\r\n };\r\n\r\n return deferred;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\r\n let {media, thumb} = options;\r\n const isPhoto = media._ === 'photo';\r\n if(isPhoto && !thumb) {\r\n return Promise.reject('preloadPhoto photoEmpty!');\r\n }\r\n\r\n // get original instance with correct file_reference instead of using copies\r\n const isDocument = media._ === 'document';\r\n // const isWebDocument = media._ === 'webDocument';\r\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\r\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\r\n\r\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\r\n\r\n let promise = this.getDownload(fileName);\r\n if(!promise) {\r\n promise = this.download(downloadOptions);\r\n\r\n if(isDocument && !thumb) {\r\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\r\n promise.catch(noop).finally(() => {\r\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\r\n });\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\r\n const {media, thumb} = options;\r\n\r\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\r\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\r\n return Promise.resolve(cacheContext.url);\r\n }\r\n\r\n return this.downloadMedia(options).then((blob) => {\r\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\r\n const url = URL.createObjectURL(blob);\r\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\r\n }\r\n\r\n return cacheContext.url;\r\n });\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions) {\r\n return this.downloadMedia(options).then(noop);\r\n }\r\n\r\n private delete(fileName: string) {\r\n delete this.downloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\r\n fileName ||= getFileNameForUpload(file);\r\n\r\n const fileSize = file.size;\r\n const isBigFile = fileSize >= 10485760;\r\n const partSize = this.getLimitPart(fileSize, true);\r\n const activeDelta = this.getDelta(partSize);\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferred = deferredPromise();\r\n if(totalParts > this.maxUploadParts) {\r\n deferred.reject(makeError('FILE_TOO_BIG'));\r\n return deferred;\r\n }\r\n\r\n let canceled = false, resolved = false;\r\n let errorHandler = (error: ApiError) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = noop;\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n const id = this.tempId++;\r\n\r\n const self = this;\r\n function* generator() {\r\n let _part = 0, doneParts = 0;\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, async() => {\r\n checkCancel();\r\n\r\n const blob = file.slice(offset, offset + partSize);\r\n const buffer = await readBlobAsArrayBuffer(blob);\r\n checkCancel();\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n return self.apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer\r\n } as any, {\r\n fileUpload: true\r\n }).then(() => {\r\n if(canceled) {\r\n return;\r\n }\r\n\r\n ++doneParts;\r\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\r\n deferred.notify(progress);\r\n\r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n const checkCancel = () => {\r\n if(canceled) {\r\n throw makeError('UPLOAD_CANCELED');\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler(makeError('UPLOAD_CANCELED'));\r\n }\r\n };\r\n\r\n deferred.notify = (progress: Progress) => {\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n };\r\n\r\n deferred.finally(() => {\r\n if(this.uploadPromises[fileName] === deferred) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n return this.uploadPromises[fileName] = deferred;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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 {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 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 private config: Config;\n private 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 }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n // this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n\n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n\n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n\n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(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","/*\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 sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\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';\nimport type TcpObfuscated from './transports/tcpObfuscated';\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\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\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 !== undefined ? 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';\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 = '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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\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':'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':'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':'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':-779165146, '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?Vector'}], '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':'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':-1460809483, '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'}], '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':-1938625919, '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':'id', 'type':'long'}, {'name':'about', 'type':'flags.1?string'}, {'name':'settings', 'type':'PeerSettings'}, {'name':'profile_photo', 'type':'flags.2?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'}], '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':-1007549728, 'predicate':'updateUserName', 'params':[{'name':'user_id', 'type':'long'}, {'name':'first_name', 'type':'string'}, {'name':'last_name', 'type':'string'}, {'name':'username', 'type':'string'}], 'type':'Update'}, {'id':-232290676, 'predicate':'updateUserPhoto', 'params':[{'name':'user_id', 'type':'long'}, {'name':'date', 'type':'int'}, {'name':'photo', 'type':'UserProfilePhoto'}, {'name':'previous', 'type':'Bool'}], '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':856375399, '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'}], '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':'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':'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':'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':408623183, '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'}], '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':-673242758, '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':'count', 'type':'int'}, {'name':'hash', 'type':'int'}], 'type':'StickerSet'}, {'id':-1240849242, 'predicate':'messages.stickerSet', 'params':[{'name':'set', 'type':'StickerSet'}, {'name':'packs', 'type':'Vector'}, {'name':'documents', 'type':'Vector'}], 'type':'messages.StickerSet'}, {'id':1073147056, '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':'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'}], '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':'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':-2107528095, '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':'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'}], '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':-362240487, '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':'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?Vector'}], 'type':'ChatFull'}, {'id':182649427, 'predicate':'messageRange', 'params':[{'name':'min_id', 'type':'int'}, {'name':'max_id', 'type':'int'}], 'type':'MessageRange'}, {'id':1682413576, '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':'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':1135492588, 'predicate':'updateStickerSets', 'params':[], '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':-299124375, 'predicate':'updateDraftMessage', 'params':[{'name':'peer', 'type':'Peer'}, {'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':'url', 'type':'string'}, {'name':'ttl_seconds', 'type':'flags.0?int'}], 'type':'InputMedia'}, {'id':-78455655, 'predicate':'inputMediaDocumentExternal', 'params':[{'name':'flags', 'type':'#'}, {'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':-646342540, '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'}], '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':-2074799289, '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'}], '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':-1340916937, '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':'saved_info', 'type':'flags.0?PaymentRequestedInfo'}, {'name':'saved_credentials', 'type':'flags.1?PaymentSavedCredentials'}, {'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'}], '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':1153291573, 'predicate':'updateChannelReadMessagesContents', 'params':[{'name':'channel_id', 'type':'long'}, {'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'}], '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':'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':'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':-1441072131, 'predicate':'messageActionSetMessagesTTL', 'params':[{'name':'period', 'type':'int'}], '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':'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':1705297877, 'predicate':'messages.sponsoredMessages', 'params':[{'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':-2091463255, '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':357013699, 'predicate':'updateMessageReactions', 'params':[{'name':'peer', 'type':'Peer'}, {'name':'msg_id', 'type':'int'}, {'name':'reactions', 'type':'MessageReactions'}], 'type':'Update'}, {'id':1873957073, 'predicate':'reactionCount', 'params':[{'name':'flags', 'type':'#'}, {'name':'chosen', 'type':'flags.0?true'}, {'name':'reaction', 'type':'string'}, {'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':-1661470870, 'predicate':'channelAdminLogEventActionChangeAvailableReactions', 'params':[{'name':'prev_value', 'type':'Vector'}, {'name':'new_value', 'type':'Vector'}], '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':1370914559, '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':'string'}], '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':'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':-1974518743, 'predicate':'help.premiumPromo', 'params':[{'name':'status_text', 'type':'string'}, {'name':'status_entities', 'type':'Vector'}, {'name':'video_sections', 'type':'Vector'}, {'name':'videos', 'type':'Vector'}, {'name':'currency', 'type':'string'}, {'name':'monthly_amount', 'type':'long'}, {'name':'users', 'type':'Vector'}], 'type':'help.PremiumPromo'}], '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':-1126886015, 'method':'auth.signIn', 'params':[{'name':'phone_number', 'type':'string'}, {'name':'phone_code_hash', 'type':'string'}, {'name':'phone_code', 'type':'string'}], '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':228423076, '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':'peer', 'type':'InputPeer'}, {'name':'reply_to_msg_id', 'type':'flags.0?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':-497026848, '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':'peer', 'type':'InputPeer'}, {'name':'reply_to_msg_id', 'type':'flags.0?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':-869258997, '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':'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':164303470, 'method':'messages.createChat', 'params':[{'name':'users', 'type':'Vector'}, {'name':'title', 'type':'string'}], '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':1926525996, 'method':'photos.updateProfilePhoto', 'params':[{'name':'id', 'type':'InputPhoto'}], 'type':'photos.Photo'}, {'id':-1980559511, 'method':'photos.uploadProfilePhoto', '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':'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':1029681423, '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'}], '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':2057376407, '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':'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':-1137057461, 'method':'messages.saveDraft', 'params':[{'name':'flags', 'type':'#'}, {'name':'no_webpage', 'type':'flags.1?true'}, {'name':'reply_to_msg_id', 'type':'flags.0?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':1180140658, 'method':'messages.getUnreadMentions', 'params':[{'name':'peer', 'type':'InputPeer'}, {'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':251759059, 'method':'messages.readMentions', 'params':[{'name':'peer', 'type':'InputPeer'}], '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':-134016113, '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':'peer', 'type':'InputPeer'}, {'name':'reply_to_msg_id', 'type':'flags.0?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':1880182943, 'method':'account.sendVerifyEmailCode', 'params':[{'name':'email', 'type':'string'}], 'type':'account.SentEmailCode'}, {'id':-323339813, 'method':'account.verifyEmail', 'params':[{'name':'email', 'type':'string'}, {'name':'code', 'type':'string'}], 'type':'Bool'}, {'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':1932455680, 'method':'messages.getSearchCounters', 'params':[{'name':'peer', 'type':'InputPeer'}, {'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':-1919060949, 'method':'account.getTheme', 'params':[{'name':'format', 'type':'string'}, {'name':'theme', 'type':'InputTheme'}, {'name':'document_id', 'type':'long'}], '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':-265962357, 'method':'messages.unpinAllMessages', 'params':[{'name':'peer', 'type':'InputPeer'}], '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':627641572, 'method':'messages.sendReaction', 'params':[{'name':'flags', 'type':'#'}, {'name':'big', 'type':'flags.1?true'}, {'name':'peer', 'type':'InputPeer'}, {'name':'msg_id', 'type':'int'}, {'name':'reaction', 'type':'flags.0?string'}], 'type':'Updates'}, {'id':-1950707482, 'method':'messages.getMessagesReactions', 'params':[{'name':'peer', 'type':'InputPeer'}, {'name':'id', 'type':'Vector'}], 'type':'Updates'}, {'id':-521245833, 'method':'messages.getMessageReactionsList', 'params':[{'name':'flags', 'type':'#'}, {'name':'peer', 'type':'InputPeer'}, {'name':'id', 'type':'int'}, {'name':'reaction', 'type':'flags.0?string'}, {'name':'offset', 'type':'flags.1?string'}, {'name':'limit', 'type':'int'}], 'type':'messages.MessageReactionsList'}, {'id':335875750, 'method':'messages.setChatAvailableReactions', 'params':[{'name':'peer', 'type':'InputPeer'}, {'name':'available_reactions', 'type':'Vector'}], 'type':'Updates'}, {'id':417243308, 'method':'messages.getAvailableReactions', 'params':[{'name':'hash', 'type':'int'}], 'type':'messages.AvailableReactions'}, {'id':-647969580, 'method':'messages.setDefaultReaction', 'params':[{'name':'reaction', 'type':'string'}], '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':-396644838, 'method':'messages.getUnreadReactions', 'params':[{'name':'peer', 'type':'InputPeer'}, {'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':-2099097129, 'method':'messages.readReactions', 'params':[{'name':'peer', 'type':'InputPeer'}], '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':451818415, 'method':'messages.toggleBotInAttachMenu', 'params':[{'name':'bot', 'type':'InputUser'}, {'name':'enabled', 'type':'Bool'}], 'type':'Bool'}, {'id':-1850648527, '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':'reply_to_msg_id', 'type':'flags.0?int'}, {'name':'send_as', 'type':'flags.13?InputPeer'}], 'type':'WebViewResult'}, {'id':-362824498, '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':'send_as', 'type':'flags.13?InputPeer'}], 'type':'Bool'}, {'id':1790652275, 'method':'messages.requestSimpleWebView', 'params':[{'name':'flags', 'type':'#'}, {'name':'bot', 'type':'InputUser'}, {'name':'url', 'type':'string'}, {'name':'theme_params', 'type':'flags.0?DataJSON'}], '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':224186320, 'method':'payments.assignAppStoreTransaction', 'params':[{'name':'flags', 'type':'#'}, {'name':'restore', 'type':'flags.0?true'}, {'name':'receipt', 'type':'bytes'}], 'type':'Updates'}, {'id':1336560365, 'method':'payments.assignPlayMarketTransaction', 'params':[{'name':'purchase_token', 'type':'string'}], 'type':'Updates'}, {'id':-1435856696, 'method':'payments.canPurchasePremium', 'params':[], 'type':'Bool'}, {'id':-1206152236, 'method':'help.getPremiumPromo', 'params':[], 'type':'help.PremiumPromo'}, {'id':342791565, 'method':'payments.requestRecurringPayment', 'params':[{'name':'user_id', 'type':'InputUser'}, {'name':'recurring_init_charge', 'type':'string'}, {'name':'invoice_media', 'type':'InputMedia'}], 'type':'Updates'}]}, 'layer':143} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\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 // console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n // console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\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 /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n\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 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.debug('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 this.pingDelayDisconnectDeferred.resolve('pong');\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {ConnectionStatusChange} from './connectionStatus';\r\nimport MTPNetworker from './networker';\r\nimport {InvokeApiOptions} from '../../types';\r\nimport App from '../../config/app';\r\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\r\nimport {AppManager} from '../appManagers/manager';\r\n\r\nexport class NetworkerFactory extends AppManager {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n\r\n public onConnectionStatusChange(status: ConnectionStatusChange) {\r\n this.rootScope.dispatchEvent('connection_status_change', status);\r\n // ({type: 'connectionStatusChange', payload: status});\r\n }\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n\r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public unsetConnectionInited() {\r\n for(const networker of this.networkers) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {TLSerialization} from './tl_utils';\r\nimport cryptoWorker from '../crypto/cryptoMessagePort';\r\nimport Modes from '../../config/modes';\r\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\r\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\r\nimport bigInt from 'big-integer';\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n *\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via\r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n\r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n // console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n // console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../config/app';\r\nimport callbackify from '../../helpers/callbackify';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\r\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\r\nimport appStateManager from './appStateManager';\r\nimport {AppStoragesManager} from './appStoragesManager';\r\nimport createManagers from './createManagers';\r\n\r\ntype Managers = Awaited>;\r\n\r\nexport class AppManagersManager {\r\n private managers: Managers | Promise;\r\n private cryptoWorkersURLs: string[];\r\n private cryptoPortsAttached: number;\r\n private cryptoPortPromise: CancellablePromise;\r\n\r\n constructor() {\r\n this.cryptoWorkersURLs = [];\r\n this.cryptoPortsAttached = 0;\r\n this.cryptoPortPromise = deferredPromise();\r\n this.cryptoPortPromise.then(() => {\r\n this.cryptoPortPromise = undefined;\r\n });\r\n }\r\n\r\n public start() {\r\n const port = MTProtoMessagePort.getInstance();\r\n\r\n port.addEventListener('manager', ({name, method, args}) => {\r\n return callbackify(this.getManagers(), (managers) => {\r\n // @ts-ignore\r\n const manager = managers[name];\r\n return manager[method].apply(manager, args);\r\n });\r\n });\r\n\r\n port.addEventListener('cryptoPort', (payload, source, event) => {\r\n const port = event.ports[0];\r\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\r\n port.close();\r\n return;\r\n }\r\n\r\n ++this.cryptoPortsAttached;\r\n cryptoMessagePort.attachPort(port);\r\n this.cryptoPortPromise?.resolve();\r\n return;\r\n });\r\n\r\n port.addEventListener('createProxyWorkerURLs', (blob) => {\r\n const length = this.cryptoWorkersURLs.length;\r\n const maxLength = App.cryptoWorkers;\r\n if(length) {\r\n return this.cryptoWorkersURLs;\r\n }\r\n\r\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\r\n this.cryptoWorkersURLs.push(...newURLs);\r\n return newURLs;\r\n });\r\n }\r\n\r\n public async createManagers() {\r\n const appStoragesManager = new AppStoragesManager();\r\n\r\n await Promise.all([\r\n // new Promise(() => {}),\r\n appStoragesManager.loadStorages(),\r\n this.cryptoPortPromise\r\n ]);\r\n\r\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\r\n return this.managers = managers;\r\n }\r\n\r\n public getManagers() {\r\n return this.managers ??= this.createManagers();\r\n }\r\n}\r\n\r\nconst appManagersManager = new AppManagersManager();\r\nexport default appManagersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {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';\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 };\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\r\nimport ctx from '../environment/ctx';\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort,\r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (listenPort: any, sendPort: any) => {\r\n messagePort.attachListenPort(listenPort);\r\n sendPort && messagePort.attachSendPort(sendPort);\r\n onConnect?.(listenPort);\r\n };\r\n\r\n messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\r\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\r\n attachPort(ctx, null);\r\n } else {\r\n attachPort(ctx, ctx);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDialogFilter} from '../storages/filters';\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\nexport type REAL_FOLDER_ID = 0 | 1;\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\n\r\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\r\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\r\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\r\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n // entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n // return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PASS_CONFLICTING_ENTITIES} from '.';\nimport {MessageEntity} from '../../layer';\n\nconst SINGLE_ENTITIES: Set = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n\n const isConflictingTypes = newEntity._ === currentEntity._ ||\n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset &&\n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * 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 {MessageEntity} from '../../layer';\nimport findConflictingEntity from './findConflictingEntity';\nimport sortEntities from './sortEntities';\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","import {MessageEntity} from '../../layer';\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if(char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}\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,725,437,21,292], () => (__webpack_require__(4898)))\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 === 437) return \"437.8cd31f38250954e80fcd.bundle.js\";\n\tif (chunkId === 21) return \"21.8a1e14284789fc762941.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"2f5d5f4973ca9d0d4616\",\"104\":\"6cbeda302cb4e61b3268\",\"211\":\"a7ea0f3283af2967a6ae\",\"292\":\"fd1c65cea6105dcd77a3\",\"301\":\"ffb4a949577b521c6089\",\"642\":\"97f14a340993585fd1ff\",\"699\":\"f16d6f756c34f3914132\",\"725\":\"3353d4069deb997f1a89\"}[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;","// 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","oldGetScript","oldLoadScript","queryMap","countMap","next","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","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","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","forEach","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","clear","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","toPeerId","isPremium","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","dispatchEventSingle","state","stateStorage","getState","setByKey","key","object","splitted","split","o","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","undefined","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","Set","_context","deepEqual","add","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","wrapSingleMessage","peerId","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","userId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","user_id","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","getPeerId","peer_id","action","userIds","users","inviter_id","chatIds","channel_id","chat_id","chatId","recentRepliers","recent_repliers","reply","defineNotNumerableProperties","props","writable","configurable","out","defineProperties","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","folders","allDialogsLoaded","pinnedOrders","folderId","setDialogsLoaded","resetPinnedOrder","savePinnedOrders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","newPinned","getFolderDialogs","dialogsResult","applyDialogs","d","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","getDialogIndexKeyByFilterId","prepareDialogUnreadCountModifying","chat","appChatsManager","getChat","dropDialogOnDeletion","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","appStateManager","appStoragesManager","getCache","_order","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","isDialogsLoaded","loaded","every","getPinnedOrders","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","skipMigrated","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","filtersStorage","getFilter","localId","isPeerUnmuted","appNotificationsManager","isPeerLocalMuted","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIndex","pinnedPeerIds","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","skipped","isObject","date","isPinned","tsNow","timeManager","getServerTimeOffset","filters","getFilters","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","callbacks","toggle","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","ignoreOffsetDate","saveGlobalOffset","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","clearDialogFromState","foundDialog","wasPinned","keepLocal","releasePeer","dropDialogWithEvent","dropped","forEachReverse","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","updates","newUpdatesAfterReloadToHandle","saveUpdate","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","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","getDialogs","offsetIndex","limit","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","has","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","title","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","f","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","assumeType","to","oldFilter","_filter","isFilterIdAvailable","isFolderAvailable","getAppConfig","dialog_filters_limit_default","some","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","self","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","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","getChannelInput","lastPtsUpdateTime","fwdHeader","reason","hasUser","post","hasChat","isUser","popPts","popSeq","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","platforms","ignore","getRestrictionReason","reasons","isRestricted","AppChatsManager","isPeerNeeded","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","getChatTyped","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatPhoto","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","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","enabled","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","available_reactions","restrictionReasons","restriction_reason","restricted","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","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","v","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","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","window","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","mov","gif","pdf","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","docId","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","getAllDraftPromise","updateDraftMessage","threadId","notify","getKey","getDraft","getAllDrafts","apiDraft","processApiDraft","force","draftsAreEqual","draft1","draft2","reply_to_msg_id","no_webpage","isEmptyDraft","syncDraft","localDraft","saveOnServer","serverDraft","draftObj","getInputEntities","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","recent","getRecentEmojis","indexEmojis","searchEmojis","emojis","reduce","acc","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","pushRecentEmoji","emoji","fixEmoji","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","ids","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","botId","bot","geo_point","stopTime","botResults","queryId","query_id","appDocsManager","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","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","telegramMeWebManager","disabled","hostname","setAuthorized","canRedirect","sessionStorage","curValue","ts","tgme_sync","loadScript","script","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","processAfter","cb","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","fetchSingleMessagesPromise","maxSeenId","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","incrementMaxSeenId","handleNotifications","_peerId","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","pendingData","tempId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","reply_to_peer_id","reply_to_mid","receiptMessage","ignoreExisting","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","forceUserOnline","top_msg_id","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","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","replyTo","reply_to_top_id","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","chosen","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","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","send_as","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","files","sendFileDetails","groupId","invoke","multiMedia","multi_media","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","channelFull","getCachedFullChat","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","originalMessage","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","fillConversations","getConversations","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","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","getDialogByPeerId","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","verify","appMessagesIdsManager","saveMessage","isMessage","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","appConfig","dialogs_folder_pinned_limit_premium","dialogs_folder_pinned_limit_default","dialogs_pinned_limit_premium","dialogs_pinned_limit_default","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","getSearchStorage","getSearchCounters","canCache","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","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","unsetEnd","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","newMaxId","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","requestPromises","getMessagesResult","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","default_send_as","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","checkMuteUntilThrottled","throttle","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerMuted","getPeerLocalSettings","respectType","n","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserPhoto","getUserString","getPeerUsername","getRestrictionReasonText","ignorePeerId","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","closed","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","AppProfileManager","usersFull","chatsFull","onUpdateUserTyping","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","chatFull","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","getChannelFull","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","previous","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","callbackify","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","chosenReactionIdx","chosenReaction","can_see_list","reactionCountIdx","userReaction","promiseKey","editMessageUpdateIdx","editMessageUpdate","EMOJI_SET_LOCAL_ID","EMOJI_ANIMATIONS_SET_LOCAL_ID","LOCAL_IDS_SET","AppStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getFavedStickersStickers","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","stickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","stickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","getStickerSet","cachedSet","documents","refreshTime","useCache","getStickerSetInput","saveById","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","sets","covered","videos","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","stickers_faved_limit_premium","stickers_faved_limit_default","faveSticker","unfave","toggleStickerSet","archived","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","allStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","cleanUsername","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserPhoto","updateUserName","setUserNameToCache","checkPremium","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","oldUser","oldSearchUsername","searchUsername","fullName","wasContact","newContact","onContactUpdated","isUserOnlineVisible","isRegularUser","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","pathname","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","showPhone","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","reader","FileReader","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","readBlobAsUint8Array","isWebFile","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","realSize","Infinity","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","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","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","networkerFactory","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","interval","isStopped","clearInterval","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","ThumbsStorage","thumbsCache","thumbFullSize","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","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","substr","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","bindPrefix","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","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","appEmojiManager","passwordManager","appPaymentsManager","_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","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","CAN_COMBINE_ENTITIES","combineSameEntities","nextEntityIdx","_i","nextEntity","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","currentEntity","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","newEntities","filtered","sortEntities","encodeEmoji","emojiText","unicodeSurrogates","points","char","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","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.d4c394cfcd75943f854f.chunk.js b/public/mtproto.worker.d4c394cfcd75943f854f.chunk.js deleted file mode 100644 index 4932a4a0f..000000000 --- a/public/mtproto.worker.d4c394cfcd75943f854f.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,a,s,n,i,r={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;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+(a?"."+a:a)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},1962:(e,t,a)=>{a.d(t,{C:()=>r,Z:()=>o});var s=a(1267),n=a(5953),i=a(5003);class r{constructor(e){(0,n.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,i.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),r.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({type:"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 r(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}r.INSTANCES=[];class o{constructor(e,t){this.storeName=t,this.log=(0,i.kg)(["IDB",e.name,t].join("-")),this.idb=r.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(m?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),g=t(p.objectStore(s)),m=Array.isArray(g),h=m?g:[].concat(g);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},8344:(e,t,a)=>{a.d(t,{H:()=>bs}),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("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}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const g=new l;d.GO.rootScope=g;const m=g;var h=a(7922);const u=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(".");(function(e,t){const a=t.split(".");let s=e;return a.forEach((e=>{e&&(s=s[e])})),s}(e,s.slice(0,-1).join(".")))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&m.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 y=a(4159),_=a(3725),v=a(5418),b=a(1267),P=a(1655),M=a(5003),S=a(319);const I=new class{constructor(){this.sent=this.received=0,this.awaitingChunks=new Map}addSent(e,t){this.sent+=t}addReceived(e,t){this.received+=t;const a=this.awaitingChunks.get(e),s=null==a?void 0:a.length;if(s)for(let e=0;e=s.length){s.deferred.resolve();break}}}waitForChunk(e,t){const a=(0,_.Z)();let s=this.awaitingChunks.get(e);s||this.awaitingChunks.set(e,s=[]);const n={length:t,deferred:a};return a.catch(S.Z).finally((()=>{(0,P.Z)(s,n)})),s.push(n),a}};d.GO&&(d.GO.networkStats=I);const C=I;class w{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=M.v9.Error|M.v9.Log;this.debug&&(s|=M.v9.Debug),this.log=(0,M.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),C.addSent(this.dcId,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=>(C.addReceived(this.dcId,e.byteLength),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=()=>{this.log("closed"),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=M.v9.Error|M.v9.Log;return this.debug&&(s|=M.v9.Debug),this.log=(0,M.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 A(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var D=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 U{constructor(){this._process=(e,t)=>s.Z.invoke("invoke",{method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}]},void 0,void 0,[e.buffer])}init(e){return D(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(A(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;A(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)=>D(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 D(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 E=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 T=a(9174);function R(e){const t=e.length,a=new Array(t);for(let s=0;sx(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(T.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>x(this,void 0,void 0,(function*(){C.addReceived(this.dcId,e.byteLength);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:",R(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(T.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=M.v9.Error|M.v9.Log;this.debug&&(i|=M.v9.Debug),this.log=(0,M.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)}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 x(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;C.addSent(this.dcId,r.byteLength),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 V=b.Z.test?"_test":"";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,s)=>{const n="client"!==t?"apiws"+(s?"_premium":""):"apiws"+V,i=`wss://${y.Z.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`;let r;return r=k,new B(r,e,i,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a,s)=>{let n;if(b.Z.ssl||!b.Z.http)n="https://"+this.sslSubdomains[e-1]+("client"!==t?"-1":"")+".web.telegram.org/"+(b.Z.test?"apiw_test1":"apiw1");else for(let t of this.dcOptions)if(t.id===e){n="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new w(e,n,"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;const o="client"===t?"":"-1";return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,o,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,P.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(y.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(y.Z.baseDcId,"client","websocket",!1)},s=(0,_.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,_.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,v.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,q=(0,_.Z)();var G=a(6654);class H{setManagers(e){Object.assign(this,e)}}var j=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,M.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 $ extends H{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 A(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);class X extends H{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,M.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[R(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[R(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[R(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.wrapSingleMessage(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=R(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=R(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),"NO_NEW_CONTEXT"}))}}var ee=a(7298),te=a(5082),ae=a(252),se=a(7625),ne=a(6519);function ie(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 re=a(2790),oe=a(2946),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050);function le(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,oe.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,oe.Z)(e)))),new Set(s.filter(Boolean))}function ge(e,t){const a={writable:!0,configurable:!0},s={};t.forEach((t=>{e.hasOwnProperty(t)||(s[t]=a)})),Object.defineProperties(e,s)}function me(e,t,a){return e[t]=a}const he=void 0;class ue extends H{constructor(){super(...arguments),this.folders={},this.clear=(e=!1)=>{this.pinnedOrders={0:[],1:[]},e?this.allDialogsLoaded={}:(this.storage.clear(),this.setDialogsLoaded(0,!1),this.setDialogsLoaded(1,!1),this.setDialogsLoaded(he,!1),this.savePinnedOrders()),this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new te.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=(0,oe.Z)(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(i)),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:0,s=(0,oe.Z)(e.peer.peer),n=this.getDialogOnly(s);n&&(e.pFlags.pinned?n.pFlags.pinned=!0:this.handleDialogUnpinning(n,a),this.generateIndexForDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(s,n)},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:0,s=e=>{this.pinnedOrders[a].length=0,e.reverse(),e.forEach((e=>{n[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))}));const t=this.getFolderDialogs(a,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;n[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},n={};e.order?s(e.order.map((e=>(0,oe.Z)(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),s(e.dialogs.map((e=>e.peerId)))}))}}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.processDialogForFilters(e),this.prepareDialogUnreadCountModifying(e)()})),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.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache(),this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]),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;tvoid 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(e<=1)return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.orderIndex)}isPeerUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted(e,!0)}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,a){var s;let n;if(this.filtersStorage.testDialogForFilter(e,a)){const t=a.pinnedPeerIds.indexOf(e.peerId);n=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(a.pinned_peers.length-1-t),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)?this.generateIndexForDialog(e,!0):(0,ce.Z)(e)}return me(e,t,n)}getDialog(e,t,a=!0){const s=[];void 0===t?s.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):s.push(this.getFolderDialogs(t,!1));for(let t of s){let s=0,n=0;for(let i=t.length;st.peerId===e.peerId)),i=s[n],r=this.getDialogIndex(i,a),o=this.setDialogIndexInFilter(e,a,t);return r!==o&&((!r&&o||n&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==n&&s.splice(n,1),o&&(0,ne.Z)(s,e,(e=>this.getDialogIndex(e,a)),-1),!0)}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],a=this.filtersStorage.getFilters();for(const s in a){const n=a[s];this.filtersStorage.testDialogForFilter(e,n)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(n.id,e))}return()=>t.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isPeerUnmuted(t.peerId);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isPeerUnmuted(t.peerId),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){const i=this.getFolder(e);t&&(i.unreadMessagesCount=Math.max(0,i.unreadMessagesCount+t));const{peerId:r}=n;a?i.unreadPeerIds.add(r):i.unreadPeerIds.delete(r),s?i.unreadUnmutedPeerIds.add(r):i.unreadUnmutedPeerIds.delete(r),void 0===i.dispatchUnreadTimeout&&(i.dispatchUnreadTimeout=F.Z.setTimeout((()=>{i.dispatchUnreadTimeout=void 0;const e=Object.assign({},i);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e)}),0))}generateIndexForDialog(e,t=!1,a){var s;let n,i=0;if(e.pFlags.pinned&&!t)i=this.generateDialogPinnedDate(e),n=!0;else{a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),i=(null==a?void 0:a.date)||i;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!i||e.date&&e.date>i)&&(i=e.date)}"draftMessage"===(null===(s=e.draft)||void 0===s?void 0:s._)&&e.draft.date>i&&(i=e.draft.date)}i||(i=(0,ee.Z)(!0));const r=this.generateDialogIndex(i,n);if(t)return r;me(e,(0,de.Z)(e.folder_id),r)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],a=t.indexOf(e.peerId);let s=a;return-1===a&&(s=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(s)}setDialogToState(e){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;ee.peerId===i));if(-1!==o&&r.splice(o,1),this.dialogs[i]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(s){const e=this.dialogsOffsetDate[void 0];(!e||t(0,ce.Z)(e,p)),-1)}dropDialog(e){const t=this.getDialog(e,void 0,!1),[a,s]=t;if(a){delete this.dialogs[e],this.getFolder(a.folder_id).dialogs.splice(s,1);const t=void 0!==(0,P.Z)(this.pinnedOrders[a.folder_id],e);this.processDialogForFilters(a),this.dialogsIndex.indexObject(e,""),t&&this.savePinnedOrders(),this.clearDialogFromState(a,!1)}return t}clearDialogFromState(e,t){const a=e.peerId;this.peersStorage.requestPeersForKey([],`topMessage_${a}`),this.peersStorage.releasePeer(a,"dialog"),this.storage.delete(a,t)}dropDialogWithEvent(e){const t=this.dropDialog(e);return t.length&&this.rootScope.dispatchEvent("dialog_drop",{peerId:e,dialog:t[0]}),t}dropDialogOnDeletion(e){this.dropDialogWithEvent(e),this.rootScope.dispatchEvent("peer_deleted",e)}applyDialogs(e){(0,se.Z)(e.dialogs,((t,a)=>{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach((e=>{var a,s,n;const i=(0,oe.Z)(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];o&&(!r||(null===(a=this.appMessagesManager.getMessageByPeer(i,o))||void 0===a?void 0:a.date)>(null===(s=this.appMessagesManager.getMessageByPeer(i,r))||void 0===s?void 0:s.date))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o),r||"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)?(this.saveDialog(e),t[i]=e):this.dropDialogWithEvent(i);const p=this.appMessagesManager.newUpdatesAfterReloadToHandle[i];if(void 0!==p){for(const e of p)p.delete(e),this.apiUpdatesManager.saveUpdate(e);p.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[i]}})),Object.keys(t).length&&this.rootScope.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}saveDialog(e,t,a,s){var n,i;void 0===t&&(t=null!==(n=e.folder_id)&&void 0!==n?n:0);const r=(0,oe.Z)(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const p=this.appPeersManager.isChannel(r)?r.toChatId():o.NM;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left)return}const d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const f=this.getDialogOnly(r);let c,l;if(e.top_message){c=(0,pe.Z)(e.top_message);const t=(null==f?void 0:f.top_message)&&this.appMessagesManager.getMessageByPeer(r,f.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&f.top_message>=c&&(c=f.top_message),l=this.appMessagesManager.getMessageByPeer(r,c)}else c=this.appMessagesManager.generateTempMessageId(r),l={_:"message",id:c,mid:c,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([l],{isOutgoing:!0});if((null==l?void 0:l.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,l),!p&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=(0,oe.Z)(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=a,this.appMessagesManager.migratedToFrom[a]=r,e.migratedTo=a}}if(e.top_message=c,e.read_inbox_max_id=(0,pe.Z)(f&&!e.read_inbox_max_id?f.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(f&&!e.read_outbox_max_id?f.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=f?f.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,l&&l.pFlags.is_outgoing){const t=l.pFlags.out;c>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(l.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete l.pFlags.unread}const g=this.appMessagesManager.getHistoryStorage(r),m=g.history.slice;if(m.length?m.isEnd(ae.D.Bottom)||(g.history.insertSlice([c]).setEnd(ae.D.Bottom),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,l)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r})):(g.history.unshift(c),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,l)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r})),g.maxId=c,g.readMaxId=e.read_inbox_max_id,g.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),p&&e.pts&&this.apiUpdatesManager.addChannelState(p,e.pts),this.generateIndexForDialog(e),f){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(f);ie(f,e),t()}this.pushDialog(e,null==l?void 0:l.date,a,s)}getDialogs(e="",t,a=20,s=0,n=!1){if(s>1){const i=[],r=this.appUsersManager.fillContacts();r.cached||i.push(r.promise);const o=this.filtersStorage.reloadMissingPeerIds(s);if(o&&i.push(o),i.length)return Promise.all(i).then((()=>this.getDialogs(e,t,a,s,n)))}const i=s>1||this.getOffsetDate(s)?he:s;let r=this.getFolderDialogs(s,n);const o=this.getDialogIndexKeyByFilterId(s);if(e){if(!a||this.cachedResults.query!==e||this.cachedResults.folderId!==s){this.cachedResults.query=e,this.cachedResults.folderId=s;const t=this.dialogsIndex.search(e),a=[];for(const e in this.dialogs){const n=this.dialogs[e];t.has(n.peerId)&&n.folder_id===s&&a.push(n)}a.sort(((e,t)=>this.getDialogIndex(t,o)-this.getDialogIndex(e,o))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}r=this.cachedResults.dialogs}else this.cachedResults.query="";let p=0;if(t>0)for(let e=r.length;pthis.getDialogIndex(r[p],o));++p);const d=this.isDialogsLoaded(i),f=r.length>=p+a;if(e||d||f){const s=r.slice(p,p+a);return{dialogs:s,count:d?r.length:null,isTopEnd:r.length&&(s[0]&&s[0]===r[0]||this.getDialogIndex(r[0],o)=r.length}}return this.appMessagesManager.getTopMessages(a,i).then((e=>{if(n&&(r=this.getFolderDialogs(s,n)),p=0,t>0)for(let e=r.length;pthis.getDialogIndex(r[p],o));++p);const i=r.slice(p,p+a);return{dialogs:i,count:void 0===e.count?r.length:e.count,isTopEnd:r.length&&(i[0]&&i[0]===r[0]||this.getDialogIndex(r[0],o){e?(this.filters={},this.reloadedPeerIds=new Set):(this.reloadedPeerIds.clear(),this.clearFilters()),this.orderIndex=2},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]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=2,e.order.forEach(((e,t)=>{const a=this.filters[e];delete a.orderIndex,this.setOrderIndex(a)})),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)}}after(){return this.clear(!0),this.filters={},this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=(0,ye.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))})}))},updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.appStateManager.getState().then((e=>{ie(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}}))}testDialogForFilter(e,t){if(t.id<=1)return e.folder_id===t.id;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&&1===e.folder_id)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted(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)this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return ve(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({type:"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,ye.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(s&&(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.orderIndex,t.push(a)}e.orderIndex=2;const a=t.sort(((e,t)=>e.orderIndex-t.orderIndex)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}return s}))}getOutputDialogFilter(e){const t=(0,ye.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,se.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=a&&a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=(0,oe.Z)(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=(0,oe.Z)(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 ve(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);return t.length&&!e?t.map((e=>this.filters[e])).sort(((e,t)=>e.orderIndex-t.orderIndex)):(yield this.apiManager.invokeApiSingle("messages.getDialogFilters")).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0){(0,_e.Z)(e),be.forEach((([t,a])=>{(0,_e.Z)(e),e[a]=e[t].map((e=>(0,oe.Z)(e)))})),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const a=this.filters[e.id];return a?Object.assign(a,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):a||this.rootScope.dispatchEvent("filter_new",e),e}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var Me=a(6690),Se=a(2821);function Ie(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 Ce{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,M.kg)("UPDATES",M.v9.Error|M.v9.Warn|M.v9.Log),this.debug=d.ZP,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,_e.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(){const e=this.updatesState,t=e.seq+1,a=e.pendingSeqUpdates[t];if(!a)return!1;const s=a.updates;for(let e=0,t=s.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!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:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);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}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get channel diff result",a),t.pts="pts"in a?a.pts:void 0,"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return this.debug&&this.log.debug("channel diff too long",a),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.debug&&this.log.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),this.debug&&this.log.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})})),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",a)}));return a||this.justAName(t,s,e),s}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){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a;let s;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":s=(0,oe.Z)(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(s=e.channel_id,!(s in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(s=e.channel_id)}const{pts:n,pts_count:i}=e,r=s?this.getChannelState(s,n):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(s?this.getChannelDifference(s):this.getDifference())}),6)}),r.syncPending.ptsAwaiting=!0,!1;if(n>r.pts)r.pts=n,o=!0,r.lastPtsUpdateTime=Date.now();else if(i)return!1;s&&t.date&&this.updatesState.date0){const a=t.seq,s=t.seqStart||a;if(s!==r.seq+1&&s>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[s]&&(r.pendingSeqUpdates[s]={seq:a,date:t.date,updates:[]}),r.pendingSeqUpdates[s].updates.push(e),r.syncPending||(r.syncPending={timeout:F.Z.setTimeout((()=>{r.syncPending=null,r.syncLoading||this.getDifference()}),6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{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${y.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,Se.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,Me.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}))})))}}Ie(Ce,[p.Z,H]);class we extends H{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(e=>{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){let s=this.savedAvatarURLs[e];if(s&&s[a])return s[a];{s||(s=this.savedAvatarURLs[e]={});const n={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},i={dcId:t.dc_id,location:n};"photo_big"===a&&(n.pFlags.big=!0,i.limitPart=524288);const r=this.apiFileManager.download(i);return s[a]=r.then((e=>s[a]=URL.createObjectURL(e)))}}}var ke=a(144),Ae=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 De extends H{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?(ie(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 Ae(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,ke.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ae(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)}))}}const Ue=new Set(["all","web","webk"]),Ee=new Set;function Te(e){return e.find((e=>Ue.has(e.platform)&&!Ee.has(e.reason)))}function Re(e){return!!Te(e)}var Fe=a(7120),xe=a(2566);class Be extends H{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)e&&(this.peersStorage.isPeerNeeded(e.toPeerId(!0))||(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=(0,oe.Z)(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}])=>{if(this.storage=a,t.length)for(let e=0,a=t.length;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;if("chatEmpty"===e._)return;const n=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;"channel"===e._&&void 0===e.participants_count&&void 0!==n&&n.participants_count&&(e.participants_count=n.participants_count);let i=!1,r=!1;void 0===n?this.chats[e.id]=e:((null===(a=n.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id)&&(i=!0),n.title!==e.title&&(r=!0),ie(n,e),this.rootScope.dispatchEvent("chat_update",e.id));const o=e.id.toPeerId(!0);i&&this.rootScope.dispatchEvent("avatar_update",o),r&&this.rootScope.dispatchEvent("peer_title_edit",o),this.peersStorage.isPeerNeeded(o)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}hasRights(e,t,a,s){return(0,Fe.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)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return("channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==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)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}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){return this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then((a=>(a&&(this.getChat(e).username=t),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((e=>{this.apiUpdatesManager.processUpdateMessage(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((e=>{this.apiUpdatesManager.processUpdateMessage(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((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}setChatAvailableReactions(e,t){return this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}isRestricted(e){const t=this.getChat(e),a=t.restriction_reason;return!!(t.pFlags.restricted&&a&&Re(a))}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=>{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();return e.messages.push(t),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)))}}a(4762);var Ve,Oe=a(5953),Le=a(9005),Ne=a(6637),Ze=a(3591);!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=b({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=y.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=m.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:s?"web":y.Z.langPack}),!s&&n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"android"}),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=y.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])}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&&(m.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}){let s=[],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=(0,Ze.Z)(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],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 g(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.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 P&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return m.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:y.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e,t).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=g,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 _ 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(...g(this.key,!1,this.args));else{const e=this.element[this.property],t=g(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=_;const v=new Map;function b(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 P extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let a;if((0,Oe.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){let 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=b(this.options);a=(0,Le.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=P,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,a,s){return new _({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"],je=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&&je(t)===je(e)?n.weekday="short":(n.month="short",n.day="numeric"),new qe.IntlDateElement({date:e,options:n}).element});const We=2013,ze=new RegExp("20[0-9]{1,2}"),Ke=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),Je=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Qe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),$e=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Ye=[31,29,31,30,31,30,31,31,30,31,30,31];function Xe(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=We&&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:tt(i),minDate:i,maxDate:r})}}function et(e,t,a){if(it(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=We;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:at(p),minDate:p,maxDate:d}):e.push({title:st(p),minDate:p,maxDate:d})}}var s}function tt(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function at(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getDate()}function st(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function nt(e){const t=new Date(e);return He[t.getDay()]}function it(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===nt(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:nt(p),minDate:p,maxDate:d})}let n;if(null===(n=Qe.exec(a)))if(null===(n=$e.exec(a)))if(null===(n=ze.exec(a))){if(null!==(n=Ke.exec(a))){const e=n[1],a=n[2],s=rt(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void et(t,e-1,s);if(e>=We)return void Xe(t,s,e)}}if(null!==(n=Je.exec(a))){const e=n[1],a=rt(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void et(t,s-1,a);s>=We&&Xe(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(it(i-1,r)&&o>=We&&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:st(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>=We&&s<=12)return void Xe(t,s-1,i);i<=12&&et(t,s-1,i-1)}else s>=We&&i<=12&&Xe(t,i-1,s)}};var pt=a(2491),dt=a(7562),ft=a(8801),ct=a(6658);const lt={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};let gt=0;class mt extends H{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&&(ot("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{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(", ","_")),bs()&&("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,ft.q)(s,(0,ct.Z)(e,a))}(e),0)),e.file_name||(e.file_name=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),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-"+ ++gt,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};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,_e.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,_e.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return this.apiFileManager.requestFilePart(t,(0,dt.Z)(n),a,s)}}class ht extends H{constructor(){super(...arguments),this.drafts={},this.getAllDraftPromise=null}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=(0,oe.Z)(e.peer);this.saveDraft(t,e.threadId,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(){return this.getAllDraftPromise||(this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))})))}saveDraft(e,t,a,s={}){const n=this.processApiDraft(a),i=this.getKey(e,t);return n?this.drafts[i]=n:delete this.drafts[i],h.Z.set({drafts:this.drafts}),s.notify&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:n,force:s.force}),n}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!(0,fe.Z)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!(0,Y.Z)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(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){return i=this,r=void 0,p=function*(){const i=this.getDraft(e,t);if(this.draftsAreEqual(i,a))return!0;let r,o={peer:this.appPeersManager.getInputPeerById(e),message:""};if(this.isEmptyDraft(a))r={_:"draftMessageEmpty"};else{(0,_e.Z)(a);let e=a.message,t=a.entities;a.reply_to_msg_id&&(o.reply_to_msg_id=(0,re.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(o.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(o.no_webpage=a.pFlags.no_webpage),o.message=e}const p=r||a;return p.date=(0,ee.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft(e,t,p,{notify:!0,force:n}),!(s&&!t)||this.apiManager.invokeApi("messages.saveDraft",o)},new((o=void 0)||(o=Promise))((function(e,t){function a(e){try{n(p.next(e))}catch(e){t(e)}}function s(e){try{n(p.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(a,s)}n((p=p.apply(i,r||[])).next())}));var i,r,o,p}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(e,t,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(e,t,n,{notify:!0,force:!0})}}var ut=a(946),yt=a(7746);const _t={keywords:{},version:0,langCode:y.Z.langPackCode};class vt extends H{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=y.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,ut.Z)(_t,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 qe.lastRequestedLangCode!==y.Z.langPackCode&&e.push(this.getEmojiKeywords(qe.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new te.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.concat(vt.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=this.appStateManager.getState().then((e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[]))}pushRecentEmoji(e){e=(0,yt.Z)(e),this.getRecentEmojis().then((t=>{(0,P.Z)(t,e),t.unshift(e),t.length>36&&(t.length=36),this.appStateManager.pushToState("recentEmoji",t),this.rootScope.dispatchEvent("emoji_recent",e)}))}}vt.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var bt=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 Pt extends H{after(){this.log=(0,M.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,oe.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?(ie(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 bt(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,oe.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 bt(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&&ie(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return bt(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,ke.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 bt(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:{_:"inputPeerSelf"},muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return bt(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:{_:"inputPeerSelf"},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 Mt(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function St(e){return{_:"inputMediaPhoto",id:Mt(e),ttl_seconds:0}}var It=a(515);function Ct(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}class wt extends H{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,It.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,ne.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.appUsersManager.getUser(a).username+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,re.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?Ct(e):St(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 kt=a(7082);class At{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&kt.o-1)}}var Dt=a(4421),Ut=a(5659),Et=a(7487);const Tt=new class{constructor(){this.disabled=b.Z.test||-1===y.Z.domains.indexOf(location.hostname)}setAuthorized(e){if(!this.disabled)return Et.Z.get("tgme_sync").then((t=>{const a=(0,ee.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>a)return;Et.Z.set({tgme_sync:{canRedirect:e,ts:a}});const s=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(y.Z.version+" "+y.Z.suffix)}`,n=["//telegram.me/"+s,"//t.me/"+s].map((e=>(0,Ut.Z)(e).then((e=>{e.remove()}))));return Promise.all(n)}))}};d.GO&&(d.GO.telegramMeWebManager=Tt);const Rt=Tt;var Ft=a(3624),xt=a(7401);function Bt(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(Bt(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 Vt=a(5701),Ot=a(7667),Lt=a(6241),Nt=a(6535),Zt=a(6566),qt=a(2202);const Gt=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=Gt);const Ht=Gt;var jt=a(2381),Wt=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 zt=e=>{e()};class Kt extends H{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Dt.Z(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,M.kg)("MESSAGES",M.v9.Error|M.v9.Debug|M.v9.Log|M.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=this.newDialogsToHandle;for(const a in t){const s=t[a];s?(this.dialogsStorage.pushDialog(s),this.appPeersManager.isChannel(a.toPeerId())||(e=Math.max(e,s.top_message||0))):(this.reloadConversation(a.toPeerId()),delete t[a])}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{F.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId(),a=this.notificationsToHandle[t];this.getNotifyPeerSettings(t).then((({muted:e,peerTypeNotifySettings:t})=>{const s=a.topMessage;e&&!s.pFlags.mentioned||!s.pFlags.unread||s.pFlags.unread&&this.notifyAboutMessage(s,{fwdCount:a.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,a=this.pendingByRandomId[t];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a,o=(0,pe.Z)(e.id),p=this.getMessageFromStorage(r,o);p?([this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)})),this.finalizePendingMessageCallbacks(r,n,p)):this.pendingByMessageId[o]=t}},this.onUpdateNewMessage=e=>{var t;const a=e.message,s=this.getMessagePeer(a),n=this.getHistoryMessagesStorage(s),i=this.getDialogOnly(s),r="updateNewDiscussionMessage"===e._;this.saveMessages([a],{storage:this.createMessageStorage(s,"history")});const p=this.getThreadKey(a),d=p?+p.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[s]&&this.threadsStorage[s][d]){const e={_:"updateNewDiscussionMessage",message:a};this.onUpdateNewMessage(e)}if("messageService"===a._&&"messageActionPaymentSent"===a.action._&&this.rootScope.dispatchEvent("payment_sent",{peerId:a.reply_to.reply_to_peer_id?(0,oe.Z)(a.reply_to.reply_to_peer_id):a.peerId,mid:a.reply_to_mid,receiptMessage:a}),!i&&!r){let a=!0;if(s.isAnyChat()&&(a=this.appChatsManager.isInChat(s.toChatId())),a){const a=null!==(t=this.newUpdatesAfterReloadToHandle[s])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[s]=new Set;if(a.has(e))return void this.log.error("here we go again",s);e.ignoreExisting=!0,a.add(e),this.scheduleHandleNewDialogs(s)}return}this.saveMessages([a],{storage:n}),this.checkPendingMessage(a);const f=this.getHistoryStorage(s,r?d:void 0);r||this.updateMessageRepliesIfNeeded(a);const c=e.ignoreExisting;if(f.history.findSlice(a.mid)){if(!c)return!1}else{const e=f.history.first;if(e.isEnd(ae.D.Bottom)){let t=0;for(const s=e.length;te[t]);++t);e.splice(t,0,a.mid)}else f.history.unshift(a.mid);null!==f.count&&f.count++}this.mergeReplyKeyboard(f,a)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:s});const l=a.fromId;if(l.isUser()&&!a.pFlags.out&&a.from_id){this.appUsersManager.forceUserOnline(l,a.date);const e={_:"sendMessageCancelAction"};let t;t=s.isUser()?{_:"updateUserTyping",action:e,user_id:l}:this.appPeersManager.isChannel(s)?{_:"updateChannelUserTyping",action:e,channel_id:s.toChatId(),from_id:this.appPeersManager.getOutputPeer(l),top_msg_id:d?(0,re.Z)(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:s.toChatId(),from_id:this.appPeersManager.getOutputPeer(l)},this.apiUpdatesManager.processLocalUpdate(t)}if(this.handleNewMessage(a),r)return;const g=!a.pFlags.out&&a.pFlags.unread;if(i){if(g&&a.mid>i.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(i);++i.unread_count,a.pFlags.mentioned&&(++i.unread_mentions_count,this.modifyCachedMentions(s,a.mid,!0)),e()}a.mid>=i.top_message&&this.setDialogTopMessage(a,i)}if(g){const e=s;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:o.NM}),t.fromId!==l&&(t.fromId=l,t.fwdCount=0),a.fwd_from&&++t.fwdCount,t.topMessage=a,this.notificationsHandlePromise||(this.notificationsHandlePromise=F.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=(0,oe.Z)(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;(0,oe.Z)(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,ye.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=(0,oe.Z)(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",{[t]:a})}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=(0,pe.Z)(t.id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s);this.saveMessages([t],{storage:n});const r=this.getMessageFromStorage(n,s);this.handleEditedMessage(i,r,n);const o=this.getDialogOnly(a),p=o&&o.top_message===s;if(t.clear_history)p&&this.rootScope.dispatchEvent("dialog_flush",{peerId:a,dialog:o});else{if("message"===(null==i?void 0:i._)&&!(0,Y.Z)(i.reactions,r.reactions)){const e=r.reactions;return r.reactions=i.reactions,void this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(a),msg_id:t.id,reactions:e})}if(this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:a,mid:s,message:t}),p||t.grouped_id){const e={};e[a]=o,this.dialogsStorage.setDialogToState(o),this.rootScope.dispatchEvent("dialogs_multiupdate",e)}}},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):(0,oe.Z)(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getHistoryMessagesStorage(n),o=(0,xt.Z)(r,"desc"),p=this.getDialogOnly(n),d=e.still_unread_count;let f=0,c=0,l=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const m=!s&&p&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);for(let e=0,t=o.length;ea)continue;const g=r.get(t);if(g.pFlags.out===i){if(!g.pFlags.unread)break;if(s){const e=g.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==s)continue}g.pFlags.unread&&(delete g.pFlags.unread,l||(l=!0),g.pFlags.out||s||!p||(void 0===d&&(f=--p.unread_count),g.pFlags.mentioned&&(c=--p.unread_mentions_count,this.modifyCachedMentions(n,g.mid,!1))),this.rootScope.dispatchEvent("notification_cancel","msg"+t))}}if(i?g.readOutboxMaxId=a:g.readMaxId=a,!s&&p){if(i?p.read_outbox_max_id=a:p.read_inbox_max_id=a,!i){let e;void 0!==d?e=d:f<0||!this.getReadMaxIdIfUnread(n)?e=0:f&&p.top_message>a&&(e=f),void 0!==e&&(p.unread_count=e),(c<0||!p.unread_count)&&(p.unread_mentions_count=0)}m&&m(),this.dialogsStorage.processDialogForFilters(p),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:p}),this.dialogsStorage.setDialogToState(p)}if(l&&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.messages.map((e=>(0,pe.Z)(e))),s=t?t.toPeerId(!0):this.findPeerIdByMids(a);for(let e=0,t=a.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=>{const t=e.channel_id,a=e.messages.map((e=>(0,pe.Z)(e))),s=t?t.toPeerId(!0):this.findPeerIdByMids(a);if(!s)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>(0,oe.Z)(e.peer)===s));const n=new Set;for(const e of a){const t=this.getMessageByPeer(s,e),a=this.getThreadKey(t);a&&this.threadsStorage[s]&&this.threadsStorage[s][+a.split("_")[1]]&&n.add(a)}const i=this.handleDeletedMessages(s,this.getHistoryMessagesStorage(s),a),r=Array.from(n).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)})),o=this.getHistoryStorage(s);[o].concat(r).forEach((e=>{for(const t of i.msgs)e.history.delete(t);i.count&&e.count&&(e.count=Math.max(0,e.count-i.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:s,msgs:i.msgs});const p=this.getDialogOnly(s);if(p){const e=i.unreadMentions||i.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);if(i.unread&&(p.unread_count=Math.max(0,p.unread_count-i.unread)),i.unreadMentions&&(p.unread_mentions_count=p.unread_count?Math.max(0,p.unread_mentions_count-i.unreadMentions):0),e&&(t(),this.rootScope.dispatchEvent("dialog_unread",{peerId:s,dialog:p})),i.msgs.has(p.top_message)){const e=o.history.first;if(e.isEnd(ae.D.Bottom)&&e.length){const t=e[0],a=this.getMessageByPeer(s,t);this.setDialogTopMessage(a,p)}else this.reloadConversation(s)}}},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!s.username||!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.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{const t=e.views,a=e.channel_id.toPeerId(!0),s=(0,pe.Z)(e.id),n=this.getMessageByPeer(a,s);void 0!==(null==n?void 0:n.views)&&n.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,ee.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):(0,oe.Z)(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.wrapSingleMessage(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[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;if("notifyPeer"===t._){const e=(0,oe.Z)(t.peer),s=this.getDialogOnly(e);s&&(s.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",s),this.dialogsStorage.setDialogToState(s))}},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=(0,oe.Z)(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.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=>e.reaction===t.reaction));return e.pFlags.out&&(!a||t.count>a.count)||t.pFlags.chosen&&(!a||!a.pFlags.chosen)}));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}),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})=>{if(t)return;const s=this.getDialogOnly(e);if(s){if(!t){s.draft=a;let t=!1;a||(0,re.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog(s)):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}}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);this.setDialogToStateIfMessageIsTop(s)}})),this.batchUpdatesDebounced=(0,Vt.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,ye.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;const i=null!==(s=this.tempFinalizeCallbacks[e])&&void 0!==s?s:this.tempFinalizeCallbacks[e]={},r=null!==(n=i[t])&&void 0!==n?n:i[t]={deferred:(0,_.Z)()};return r.callback=a,r.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)));let i=a.entities||[];t&&(t=(0,Se.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 Wt(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=Bt(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;let o=a.entities;a.viaBotId||(t=(0,Se.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,re.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{e?d.error=!0:delete d.error,this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l(!1);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},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ye.Z)(d);ge(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=>{l(!0),d.promise.reject(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 g=[d.promise];for(let t=1;t=0){r="audio",o="audio."+("ogg"===p.split("/")[1]?"ogg":"mp3"),y="sendMessageUploadAudioAction",a.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:a.isVoiceMessage},waveform:a.waveform,duration:a.duration||0};g.push(e)}else if(a.isMedia)if(m){r="photo",o="photo."+p.split("/")[1],y="sendMessageUploadPhotoAction";const e={_:"photoSize",w:a.width,h:a.height,type:"full",location:null,size:t.size};h={_:"photo",id:""+s.id,sizes:[e],w:a.width,h:a.height};const n=this.thumbsStorage.getCacheContext(h,e.type);n.downloaded=t.size,n.url=a.objectURL||"",h=this.appPhotosManager.savePhoto(h)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(p)){r="video",o="video.mp4",y="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:a.isRoundMessage,supports_streaming:!0},duration:a.duration,w:a.width,h:a.height};g.push(e),a.noSound&&t.size>10240&&t.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",o="document."+p.split("/")[1],y="sendMessageUploadDocumentAction";else r="document",o="document."+p.split("/")[1],y="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:d||o}),-1!==["document","video","audio","voice"].indexOf(r)&&!f){const e=[];if(u={_:"document",id:""+s.id,duration:a.duration,attributes:g,w:a.width,h:a.height,thumbs:e,mime_type:p,size:t.size},a.objectURL){const e=this.thumbsStorage.getCacheContext(u);e.downloaded=t.size,e.url=a.objectURL}let n;if(m)g.push({_:"documentAttributeImageSize",w:a.width,h:a.height}),n={_:"photoSize",w:a.width,h:a.height,type:"full",size:t.size};else if("video"===r&&a.thumb){n={_:"photoSize",w:a.thumb.size.width,h:a.thumb.size.height,type:"local-thumb",size:a.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(u,n.type);e.downloaded=n.size,e.url=a.thumb.url}n&&e.push(n),u=this.appDocsManager.saveDoc(u)}this.log("sendFile",r,o,t.type,a);const v=(0,_.Z)(),b=f?void 0:{_:h?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:h,document:u};b&&(ge(b,["promise"]),b.promise=v),s.entities=l,s.message=c,s.media=f?{_:"messageMediaDocument",pFlags:{},document:t}:b;const P=f?void 0:(0,qt.Z)(t);s.uploadingFileName=P,P&&(this.uploadFilePromises[P]=v);const M=e=>{e?s.error=!0:delete s.error,this.rootScope.dispatchEvent("messages_pending")};let S=!1,I=null;s.send=()=>{if(f){const{id:e,access_hash:a,file_reference:s}=t,n={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:a,file_reference:s}};v.resolve(n)}else if(t instanceof File||t instanceof Blob){const n=()=>{var n;let i;return S&&!s.error||(S=!1,I=this.apiFileManager.upload({file:t,fileName:P}),I.catch((t=>{S||(this.log("cancelling upload",b),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),v.reject(t))})),I.addNotifyListener((t=>{const a=Math.max(1,Math.floor(100*t.done/t.total));y&&this.setTyping(e,{_:y,progress:0|a}),v.notifyAll(t)})),v.notifyAll({done:0,total:t.size})),"video"===r&&a.objectURL&&(null===(n=a.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:a.thumb.blob})),I&&I.then((e=>Wt(this,void 0,void 0,(function*(){let t;if(e.name=o,S=!0,t="photo"===r?{_:"inputMediaUploadedPhoto",file:e}:{_:"inputMediaUploadedDocument",file:e,mime_type:p,pFlags:{force_file:"sendMessageUploadDocumentAction"===y||void 0},attributes:g},i)try{const e=yield i;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}v.resolve(t)}))),(()=>{M(!0)})),v};a.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return v},this.beforeMessageSending(s,{isGroupedItem:a.isGroupedItem,isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,processAfter:a.processAfter}),a.isGroupedItem||(v.then((t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),this.apiManager.invokeApi("messages.sendMedia",{background:a.background,peer:this.appPeersManager.getInputPeerById(e),media:t,message:c,random_id:s.random_id,reply_to_msg_id:n,schedule_date:a.scheduleDate,silent:a.silent,entities:l,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.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 M(!0),e}))))),v.then(s.promise.resolve,s.promise.reject));const C={message:s};return ge(C,["promise"]),C.promise=v,C}sendAlbum(e,t,a={}){return Wt(this,void 0,void 0,(function*(){if(a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},a),a.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const s=a.replyToMsgId?(0,re.Z)(a.replyToMsgId):void 0;let n=a.caption||"",i=a.entities||[];n&&(n=(0,Se.Z)(n,i)),this.log("sendAlbum",t,a);const r=""+ ++this.groupedTempId,o=[],p=e=>{o.push(e)},d=t.map(((t,o)=>{const d=a.sendFileDetails[o],f=Object.assign({isGroupedItem:!0,isMedia:a.isMedia,scheduleDate:a.scheduleDate,silent:a.silent,replyToMsgId:s,threadId:a.threadId,sendAsPeerId:a.sendAsPeerId,groupId:r,processAfter:p},d);return 0===o&&(f.caption=n,f.entities=i),this.sendFile(e,t,f).message}));a.clearDraft&&o.push((()=>{this.appDraftsManager.clearDraft(e,a.threadId)})),o.forEach((e=>{e()}));const f=(e,t)=>{t?e.error=!0:delete e.error,this.rootScope.dispatchEvent("messages_pending")},c=this.appPeersManager.getInputPeerById(e),l=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const n=(0,_.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:c,multi_media:t,reply_to_msg_id:s,schedule_date:a.scheduleDate,silent:a.silent,clear_draft:a.clearDraft,send_as:a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{d.forEach((e=>f(e,!0))),n.reject(e)}))}),n},g=d.map((e=>e.send().then((e=>this.apiManager.invokeApi("messages.uploadMedia",{peer:c,media:e}))).then((t=>{let a;"messageMediaPhoto"===t._?a=St(this.appPhotosManager.savePhoto(t.photo)):"messageMediaDocument"===t._&&(a=Ct(this.appDocsManager.saveDoc(t.document)));const s={_:"inputSingleMedia",media:a,random_id:e.random_id,message:n,entities:i};return n&&(n="",i=[]),s})).catch((t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),f(e,!0),t}))));return Promise.all(g).then((e=>l(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,re.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;let o=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},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{o()})).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);let 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);this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),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!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||zt)((()=>{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,ee.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,ke.a)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return ge(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,_.Z)()),n}generateReplyHeader(e,t){const a={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&a.reply_to_msg_id!==t&&(a.reply_to_top_id=t),a}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).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(){return Wt(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(he);){const t=yield this.getTopMessages(100,he);if(!e()||t.isEnd)break}}))}getConversations(e="",t,a,s=0,n){return this.dialogsStorage.getDialogs(e,t,a,s,n)}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t){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.dialogs,Object.assign({},r.dialogs[0])),a||t===he||this.dialogsStorage.resetPinnedOrder(t),a||(Rt.setAuthorized(!0),this.appDraftsManager.addMissedDialogs()),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!a,p=!1;const f={},c=t===he?0:t,l=t===he;(0,se.Z)(r.dialogs,(e=>{void 0===e.folder_id&&(e.folder_id=c),this.dialogsStorage.saveDialog(e,void 0,!0,l),o||this.appPeersManager.isChannel(e.peerId||(0,oe.Z)(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(s&&(0,ce.Z)(e)>s&&(this.scheduleHandleNewDialogs(e.peerId,e),p=!0),(0,re.Z)(e.read_inbox_max_id)||(0,re.Z)(e.read_outbox_max_id)||(f[e.peerId]=e,this.log.error("noIdsDialogs",e,i)))}));const g=Object.keys(f);if(g.length){const e=g.map((e=>e.toPeerId())),t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",f);for(let t=0;t=m||!r.dialogs.length;y&&this.dialogsStorage.setDialogsLoaded(t,!0),p?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",{});const _=r.dialogs,v=100===e?_:_.slice(0,e);return{isEnd:y&&v[v.length-1]===_[_.length-1],count:m,dialogs:v}}))}forwardMessages(e,t,a,s={}){return Wt(this,void 0,void 0,(function*(){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;const c=this.getMessageByPeer(t,n),l=this.generateOutgoingMessage(e,s);o.push(l.id);const g=["entities","media"];s.dropAuthor||(l.fwd_from=this.generateForwardHeader(e,c),g.push("views","forwards"),(null===(i=l.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete l.from_id),s.dropCaptions&&c.media||g.push("message");const m=null===(p=c.reply_to)||void 0===p?void 0:p.reply_to_msg_id,h=a.indexOf(m);if(m&&-1!==h){const e=o[h];l.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}g.forEach((e=>{l[e]=c[e]}));const u=null===(d=l.media)||void 0===d?void 0:d.document;return u&&["round","voice"].includes(u.type)&&(l.pFlags.media_unread=!0),c.grouped_id&&(null!==(f=r[c.grouped_id])&&void 0!==f?f:r[c.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(l),l}));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,re.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)})).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(S.Z)}))}generateEmptyMessage(e){}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;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[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&&(0,oe.Z)(e.peer_id)||o.NM}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}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}}reloadConversation(e){let t;if(void 0!==e){const a=(0,oe.Z)(e);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,_.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,v.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;return this.reloadConversationsPeers.clear(),this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}).then((e=>{this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),(e=>{})).then((()=>{(()=>{for(const e in t)t[e].resolve(void 0)})(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a){return this.apiManager.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:a,peer:e,max_id:0}).then((s=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:s.pts,pts_count:s.pts_count}}),!s.offset||this.doFlushHistory(e,t,a))))}flushHistory(e,t,a){return Wt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)){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,re.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(this.appPeersManager.getInputPeerById(e),t,a).then((()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));const a=this.needSingleMessages.get(e);if(a&&a.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(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})}))}getPinnedMessage(e){var t;const a=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return a.promise?a.promise:a.maxId?Promise.resolve(a):a.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then((e=>{var t;return a.count=e.count,a.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,a})).finally((()=>{delete a.promise}))}getPinnedMessagesCount(e){var t;return null===(t=this.pinnedMessages[e])||void 0===t?void 0:t.count}getPinnedMessagesMaxId(e){var t;return null===(t=this.pinnedMessages[e])||void 0===t?void 0:t.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,re.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[e],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,jt.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)}saveMessage(e,t={}){var a,s;if(!e||"messageEmpty"===e._)return;void 0===e.pFlags&&(e.pFlags={});const n=this.getMessagePeer(e),i=t.storage||this.getHistoryMessagesStorage(n),r="peerChannel"===e.peer_id._,p=r&&this.appChatsManager.isBroadcast(n.toChatId()),d="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const f=(0,pe.Z)(e.id);e.mid=f,d&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(a=this.groupedMessagesStorage[e.grouped_id])&&void 0!==a?a:this.groupedMessagesStorage[e.grouped_id]=this.createMessageStorage(n,"grouped")).set(f,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const c=this.getDialogOnly(n);c&&f&&f>c[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=(0,pe.Z)(e.reply_to.reply_to_top_id)));const l=d&&e.replies;l&&(l.max_id&&(l.max_id=(0,pe.Z)(l.max_id)),l.read_max_id&&(l.read_max_id=(0,pe.Z)(l.read_max_id)));const g=!!n;g||(e.date-=this.timeManager.getServerTimeOffset());const m=this.appPeersManager.peerId,h=d&&e.fwd_from;if(e.peerId=n,e.fromId=n===m?h?h.from_id?(0,oe.Z)(h.from_id):o.NM:m:e.pFlags.post||!e.from_id?n:(0,oe.Z)(e.from_id),h){h.saved_from_msg_id&&(h.saved_from_msg_id=(0,pe.Z)(h.saved_from_msg_id)),h.channel_post&&(h.channel_post=(0,pe.Z)(h.channel_post));const t=h.saved_from_peer||h.from_id,a=h.saved_from_msg_id||h.channel_post;if(t&&a){const s=(0,oe.Z)(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=(0,oe.Z)(h.from_id),g||(h.date-=this.timeManager.getServerTimeOffset())}const u={type:"message",peerId:n,messageId:f};if(d&&e.media){let a=!1;switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?a=!0:e.media.photo=this.appPhotosManager.savePhoto(e.media.photo,u),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":if(e.media.ttl_seconds)a=!0;else{const t=e.media.document;e.media.document=this.appDocsManager.saveDoc(t,u),e.media.document||"documentEmpty"===t._||(a=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(n,f,t.isScheduled);e.media.webpage=this.appWebPagesManager.saveWebPage(e.media.webpage,a,u);break}case"messageMediaInvoice":e.media.photo=this.appWebDocsManager.saveWebDocument(e.media.photo);break;case"messageMediaUnsupported":a=!0}a&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities)}if(!d&&e.action){const t=e.action;let a,i;const o=e.fromId===this.appUsersManager.getSelf().id?"You":"";switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,u)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,u)),t._){case"messageActionChatEditPhoto":(null===(s=t.photo)||void 0===s?void 0:s.video_sizes)?t._=p?"messageActionChannelEditVideo":"messageActionChatEditVideo":p&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",p||(e+="_by"+o),t.type=e;break}case"messageActionChatEditTitle":p&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":p&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+o:"messageActionChatReturn"+o)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+o);break;case"messageActionChannelMigrateFrom":a=t.chat_id.toPeerId(!0),i=n;break;case"messageActionChatMigrateTo":a=n,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")}a&&i&&!this.migratedFromTo[a]&&!this.migratedToFrom[i]&&this.migrateChecks(a,i)}return d&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),i.set(f,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 Wt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(ae.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,yt.Z)(e.message,t);const a=(0,Nt.Z)(e.message);e.totalEntities=(0,Lt.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,re.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,ke.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(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0})).then((()=>{const t=this.appUsersManager.getUser(e);return this.sendText(s,n+"@"+t.username)}))}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,t){var a;return Wt(this,void 0,void 0,(function*(){if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!(null===(a=s.pFlags)||void 0===a?void 0:a.pinned)||void 0;if(n){const e=yield this.apiManager.getAppConfig(),a=1===t?this.rootScope.premium?e.dialogs_folder_pinned_limit_premium:e.dialogs_folder_pinned_limit_default:this.rootScope.premium?e.dialogs_pinned_limit_premium:e.dialogs_pinned_limit_default;if(this.dialogsStorage.getPinnedOrders(t).length>=a)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(e),pinned:n}).then((a=>{if(a){const a=n?{pinned:n}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(e),folder_id:t,pFlags:a})}}))}))}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 Wt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t)||this.getMessagePeer(e)!==this.appUsersManager.getSelf().id&&(!e.pFlags.out||"peerChannel"!==e.peer_id._&&e.date<(0,ee.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}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;let 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,_e.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){return this.appPeersManager.isRestricted(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})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Zt.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.isRestricted(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 g;if(!e||r||s||t||1===n||o||(g=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,g.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,re.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.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,re.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);return a.max_id=r.maxId=(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,this.threadsToReplies[i]=e+"_"+t,n}))}handleNewMessage(e){this.rootScope.dispatchEvent("history_multiappend",e)}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=(0,v.Z)(0).then((()=>{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Wt(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,re.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(S.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(!s&&!a){const t=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,re.Z)(a),read_max_id:(0,re.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,re.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,re.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)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,a){const s=this.unreadMentions[e];s&&(a?s.first.isEnd(ae.D.Top)&&s.insertSlice([t]):s.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const a=this.getDialogOnly(e);!t.length&&(null==a?void 0:a.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const a=this.goToNextMentionPromises[e];if(a)return a;const s=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new ae.Z,n=s.length,i=s.first.isEnd(ae.D.Top);if(!n&&i)return this.fixUnreadMentionsCountIfNeeded(e,s),Promise.resolve();let r=Promise.resolve();return!i&&n<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then((()=>{const t=s.last,a=t&&t[t.length-1];if(a)return s.delete(a),a;this.fixUnreadMentionsCountIfNeeded(e,s)})).finally((()=>{delete this.goToNextMentionPromises[e]}))}loadNextMentions(e){const t=this.unreadMentions[e],a=t.first[0]||1;return this.getUnreadMentions(e,a,-50,50).then((e=>{this.mergeHistoryResult(t,e,1===a?0:a,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0){return this.apiManager.invokeApiSingle("messages.getUnreadMentions",{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,re.Z)(t),add_offset:a,limit:s,max_id:(0,re.Z)(n),min_id:(0,re.Z)(i)}).then((e=>((0,_e.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,re.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;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(a=this.threadsStorage[e][t])&&void 0!==a?a:this.threadsStorage[e][t]={count:null,history:new ae.Z}):null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={count:null,history:new ae.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){return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(e,!0))]).then((([t,a])=>({muted:this.appNotificationsManager.isPeerLocalMuted(e,!0),peerTypeNotifySettings: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==e?void 0:e.reply_to)&&(null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;a=e.peerId+"_"+t}return a}updateMessage(e,t,a){return this.wrapSingleMessage(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,t){const a={_:"inputPeerNotifySettings"};return a.mute_until=t,this.appNotificationsManager.updateNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)},a)}togglePeerMute(e,t){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted(e,!1)),this.mutePeer(e,t?o.rU:0)}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"){if(this.appPeersManager.isRestricted(e))return!1;if(e.isAnyChat()){const s=this.appChatsManager.getChat(e.toChatId());return this.appChatsManager.hasRights(e.toChatId(),a,void 0,!!t)&&(!s.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(a){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,_e.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,"full");Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Ot.Z)(e,i);(0,ft.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,ft.P)((0,dt.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,re.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Wt(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,se.Z)(s,((e,a,s)=>{t.reactions.some((t=>(0,oe.Z)(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:(0,oe.Z)(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,re.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Wt(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,ee.Z)(!0)-e.date(0,re.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length),n=e.toChatId();for(let e=0,i=t.length;e{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));n||(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),n.source)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[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,re.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,re.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())}getNewHistory(e,t){var a;return Wt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(ae.D.Bottom))return;delete s.maxId,n.unsetEnd(ae.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,re.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(ae.D.Top),f&&l.setEnd(ae.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),this.appPeersManager.isChannel(e)&&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());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,v.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,re.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,_e.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(S.Z,S.Z).then((()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}wrapSingleMessage(e,t,a=!1){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,_.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?(0,oe.Z)(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(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",{[t]:this.getDialogOnly(t)})}return t}))}setTyping(e,t,a){var s;let n=this.typings[e];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(s=null==n?void 0:n.action)||void 0===s?void 0:s._)!==t._)?((null==n?void 0:n.timeout)&&clearTimeout(n.timeout),n=this.typings[e]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t}).finally((()=>{n===this.typings[e]&&(n.timeout=F.Z.setTimeout((()=>{delete this.typings[e]}),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){return e.unread_count||+!!e.pFlags.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 Jt=a(6724);function Qt(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class $t extends H{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,ee.Z)(!0);let t=o.rU;for(const a in this.peerSettings.notifyPeer){const s=this.peerSettings.notifyPeer[a];if(s instanceof Promise)continue;const n=s.mute_until;n&&(n<=e?(s.mute_until=0,this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:{_:"notifyPeer",peer:this.appPeersManager.getOutputPeer(a.toPeerId())},notify_settings:s})):n{const t="notifyPeer"===e.peer._&&(0,oe.Z)(e.peer.peer),a="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:a,peerId:t,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,_e.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=Qt(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=(0,oe.Z)(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),{_:Qt(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)}))}savePeerSettings({key:e,peerId:t,settings:a}){let s;t&&(e=t,s=this.peerSettings.notifyPeer),(s||this.peerSettings)[e]=a,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:a}),this.appStateManager.getState().then((t=>{const s=t.notifySettings;s[e]=a,this.appStateManager.pushToState("notifySettings",s)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,ee.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(e,t=!0){const a={_:"peerNotifySettings"},s=this.peerSettings.notifyPeer[e];if(!s||s instanceof Promise||Object.assign(a,s),t){const t=Qt(this.appPeersManager.getInputNotifyPeerById(e,!0)._),s=this.peerSettings[t];if(s&&!(s instanceof Promise))for(let e in s)void 0===a[e]&&(a[e]=s[e])}return a}isPeerLocalMuted(e,t=!0){if(e===this.appPeersManager.peerId)return!1;const a=this.getPeerLocalSettings(e,t);return this.isMuted(a)}}var Yt=a(617),Xt=a(7361);class ea extends H{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){if(this.isRestricted(e))return;const t=e.isUser()?this.appUsersManager.getUserPhoto(e.toUserId()):this.appChatsManager.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:void 0}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&(0,oe.Z)(t.migrated_to)}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.getPeer(e).username||""}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}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())}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,Yt.Z)(e)}isAnyChat(e){return(0,Xt.Z)(e)}isRestricted(e){return e.isUser()?this.appUsersManager.isRestricted(e.toUserId()):this.appChatsManager.isRestricted(e.toChatId())}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?Te(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"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.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ta extends H{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if("photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(ot("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){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 aa extends H{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,M.kg)("POLLS",M.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,Se.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,re.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,re.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,re.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,ye.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 sa extends H{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:{_:Qt(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=Qt(t._),t}))}),a.rules)))}getPrivacy(e){const t=Qt(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)))}}var na=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 ia extends H{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const a=e.user_id?e.user_id.toPeerId():(0,oe.Z)(e.from_id);if(this.appPeersManager.peerId===a||"speakingInGroupCallAction"===e.action._)return;const s=(0,oe.Z)(e),n=null!==(t=this.typingsInPeer[s])&&void 0!==t?t:this.typingsInPeer[s]=[];let i=n.find((e=>e.userId===a));const r=()=>{delete i.timeout;const e=n.indexOf(i);-1!==e&&n.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n}),n.length||delete this.typingsInPeer[s]};if(i&&void 0!==i.timeout&&clearTimeout(i.timeout),"sendMessageCancelAction"===e.action._){if(!i)return;return void r()}i||(i={userId:a},n.push(i)),i.action=e.action;const o=this.appUsersManager.hasUser(a);o?this.appUsersManager.forceUserOnline(a):"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!==i.timeout&&this.appUsersManager.hasUser(a)&&this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n})})),i.timeout=F.Z.setTimeout(r,6e3),o&&this.rootScope.dispatchEvent("peer_typings",{peerId:s,typings:n})},this.onUpdatePeerBlocked=e=>{const t=(0,oe.Z)(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?this.usersFull[e]:this.apiManager.invokeApiSingleProcess({method:"users.getFullUser",params:{id:this.appUsersManager.getUserInput(e)},processResult:t=>{this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);return a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s})),this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,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 na(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=this.chatsFull[e];if(a&&!t){const t=this.appChatsManager.getChat(e);if(t.version===a.participants.version||t.pFlags.left)return a}return this.apiManager.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_chat,s=e.toPeerId(!0);return a&&a.chat_photo&&a.chat_photo.id&&(a.chat_photo=this.appPhotosManager.savePhoto(a.chat_photo,{type:"profilePhoto",peerId:s})),a.call&&this.appGroupCallsManager.saveGroupCall(a.call,e),this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.chatsFull[e]=a,this.rootScope.dispatchEvent("chat_full_update",e),a}})}getChatInviteLink(e,t){return na(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(t&&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){return void 0===this.chatsFull[e]||t?this.apiManager.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:this.appChatsManager.getChannelInput(e)},processResult:t=>{const a=e.toPeerId(!0);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.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",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}}):this.chatsFull[e]}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new te.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,re.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(this.appPeersManager.peerId,!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({_:"updateUserPhoto",user_id:s,date:(0,ee.Z)(!0),photo:this.appUsersManager.getUser(s).photo,previous:!0})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Mt(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 na(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}))}getPeerTypings(e){return this.typingsInPeer[e]}}var ra=a(4064);function oa(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var pa=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 da=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],fa={type:"reactions"};class ca extends H{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=>pa(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})])}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,_e.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of da)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],fa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,G.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):oa([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=(null!==(s=t.available_reactions)&&void 0!==s?s:[]).map((t=>e.find((e=>e.reaction===t)))).filter(Boolean);return this.unshiftQuickReactionInner(n,a)}))}unshiftQuickReactionInner(e,t){const a=(0,ra.Z)(e,(e=>e.reaction===t.reaction));return a&&e.unshift(a),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return oa([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 oa([this.apiManager.getAppConfig(),this.getAvailableReactions()],(([e,t])=>t.find((t=>t.reaction===e.reactions_default))))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,G.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,re.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,re.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=>pa(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getAppConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){const s=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(s))return;this.lastSendingTimes.set(s,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(s)}),333);const{peerId:n,mid:i}=e,r=this.appPeersManager.peerId;let o=a?e.reactions:(0,ye.Z)(e.reactions),p=o?o.results.findIndex((e=>e.pFlags.chosen)):-1,d=-1!==p&&o.results[p];if(d&&(--d.count,delete d.pFlags.chosen,t===d.reaction&&(t=void 0),d.count||o.results.splice(p,1),o.recent_reactions&&(0,ra.Z)(o.recent_reactions,(e=>(0,oe.Z)(e.peer_id)===r)),o.results.length||(o=void 0)),t){o||(o={_:"messageReactions",results:[],pFlags:{}},this.appPeersManager.isBroadcast(e.peerId)||(o.pFlags.can_see_list=!0));let a=o.results.findIndex((e=>e.reaction===t)),s=-1!==a&&o.results[a];if(s||(s={_:"reactionCount",count:0,reaction:t,pFlags:{}},a=o.results.push(s)-1),++s.count,s.pFlags.chosen=!0,!o.recent_reactions&&o.pFlags.can_see_list&&(o.recent_reactions=[]),o.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(r)};this.appPeersManager.isMegagroup(n)?(o.recent_reactions.unshift(e),o.recent_reactions=o.recent_reactions.slice(0,3)):(o.recent_reactions.push(e),o.recent_reactions=o.recent_reactions.slice(-3))}}const f=this.availableReactions;if(o&&(null==f?void 0:f.length)){const e=new Map;f.forEach(((t,a)=>{e.set(t.reaction,a)})),o.results.sort(((t,a)=>a.count-t.count||e.get(t.reaction)-e.get(a.reaction)))}if(a)return e.reactions=o,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:o,local:!0});const c=[n,i].join("-"),l=(0,re.Z)(i),g=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(n),msg_id:l,reaction:t}).then((e=>{(0,_e.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:l,peer:this.appPeersManager.getOutputPeer(n),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(c)===g&&this.sendReaction(e,null==d?void 0:d.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(c)===g&&this.sendReactionPromises.delete(c)}));return this.sendReactionPromises.set(c,g),g}}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 ga="emoji",ma="emojiAnimations",ha=new Set([ga,ma]);class ua extends H{constructor(){super(...arguments),this.storage=new W.Z(j.Z,"stickerSets")}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=F.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>{this.getRecentStickers().then((({stickers:e})=>{this.rootScope.dispatchEvent("stickers_recent",e)}))}})}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,se.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}getStickerSet(e,t={}){return la(this,void 0,void 0,(function*(){const a=e.id;return this.getStickerSetPromises[a]?this.getStickerSetPromises[a]:this.getStickerSetPromises[a]=new Promise((s=>la(this,void 0,void 0,(function*(){var n;if(!t.overwrite){const e=yield this.storage.get(a);if(e&&(null===(n=e.documents)||void 0===n?void 0:n.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),s(e),void delete this.getStickerSetPromises[a]}try{const n=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:n.set.id;this.saveStickerSet(n,i),s(n)}catch(e){s(null)}delete this.getStickerSetPromises[a]}))))}))}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:ga},{saveById:!0}),this.getStickerSet({id:ma},{saveById:!0}),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,_e.Z)(e),this.saveStickers(e.stickers),e)})}))}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?ma:ga,s=this.storage.getFromCache(a);if(!s||!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.apiFileManager.downloadMedia({media:t}),a?this.apiFileManager.downloadMedia({media:a}):void 0]).then((()=>({doc:t,sound:a})))}))}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),this.saveStickers(e.documents);const n=s.set.installed_date||ha.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 e.id===ga?{_:"inputStickerSetAnimatedEmoji"}:e.id===ma?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return la(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,_e.Z)(e),(0,se.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:[]},e.set.id)})),e)})).sets}))}toggleStickerSet(e){return la(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}))}searchStickerSets(e,t=!0){return la(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,_e.Z)(e),(0,se.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:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(let 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:e=>((0,_e.Z)(e),(0,se.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,yt.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,yt.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,se.Z)(d,((e,t,a)=>{3!==e.sticker||i().IS_WEBM_SUPPORTED||a.splice(t,1)})),d}))}pushRecentSticker(e){const t=this.appDocsManager.getDoc(e),a=(0,yt.Z)(t.stickerEmojiRaw);for(const e in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[e].then((s=>{const n=(0,ra.Z)(s,(e=>e.id===t.id));n?s.unshift(n):e.includes(a)&&s.unshift(t)}))}clearRecentStickers(){return this.rootScope.dispatchEvent("stickers_recent",[]),this.apiManager.invokeApi("messages.clearRecentStickers")}}var ya=a(467);function _a(e){return e&&e.toLowerCase()||""}var va=a(8493);class ba extends H{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];t.username&&delete this.usernames[_a(t.username)],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,ee.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))},updateUserPhoto:e=>{var t,a;const s=e.user_id,n=this.users[s];if(n){if((null===(t=n.photo)||void 0===t?void 0:t.photo_id)===(null===(a=e.photo)||void 0===a?void 0:a.photo_id))return;this.forceUserOnline(s,e.date),"userProfilePhotoEmpty"===e.photo._?delete n.photo:n.photo=ie(n.photo,e.photo),this.setUserToStateIfNeeded(n),this.rootScope.dispatchEvent("user_update",s),this.rootScope.dispatchEvent("avatar_update",s.toPeerId())}else console.warn("No user by id:",s)},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:e.username}),!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}])=>{if(this.storage=a,t.length)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,ee.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,P.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,_.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.users[t]:this.apiManager.invokeApi("contacts.resolveUsername",{username:e}).then((e=>this.processResolvedPeer(e)))}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,oe.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,t.username,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,P.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a){return this.getContacts(e,t,a).then((e=>e.map((e=>e.toPeerId(!1)))))}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 te.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=_a(t.username);delete this.usernames[e]}if(e.username){const t=_a(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var a,s;if("userEmpty"===e._)return;const n=e.id,i=this.users[n];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==i)return;if(this.setUserNameToCache(e,i),i&&void 0!==i.sortName&&i.first_name===e.first_name&&i.last_name===e.last_name)e.sortName=i.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,ya.ZP)(t,!1)}e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset()));let r=!1,o=!1;if(void 0===i)this.users[n]=e;else{e.first_name===i.first_name&&e.last_name===i.last_name&&e.username===i.username||(o=!0),(null===(a=i.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id)&&(r=!0);const t=!!i.pFlags.contact,p=!!e.pFlags.contact;ie(i,e),this.rootScope.dispatchEvent("user_update",n),t!==p&&this.onContactUpdated(n,p,t)}r&&this.rootScope.dispatchEvent("avatar_update",e.id.toPeerId()),o&&this.rootScope.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}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&&(e=this.getUser(e).status),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]||{_:"userEmpty",id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}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)}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}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){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputPeerSelf"}:{_:"inputPeerUser",user_id:e,access_hash:t.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,ee.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,oe.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,Nt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL((0,Ze.Z)(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,Me.Z)(e.my_results.map((e=>(0,oe.Z)(e)))),results:e.results.map((e=>(0,oe.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,ee.Z)(!0)}:{_:"userStatusOnline",expires:(0,ee.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)}))}))}isRestricted(e){const t=this.getUser(e),a=t.restriction_reason;return!!(t.pFlags.restricted&&a&&Re(a))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}canSendToUser(e){return(0,va.Z)(this.getUser(e))}}const Pa=new Set(["photo","video","gif","document"]);class Ma extends H{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._)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;let i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Pa.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:ie(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 Sa=a(8576),Ia=a(2328);var Ca=a(1243),wa=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 ka extends H{constructor(){super(...arguments),this.cacheStorage=new Sa.Z("cachedFiles"),this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,M.kg)("AFM",M.v9.Error|M.v9.Log),this.tempId=0,this.queueId=0,this.debug=b.Z.debug,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)}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="upload"===e?24:this.rootScope.premium?72:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const s=(0,ra.Z)(t,(e=>0===e.queueId))||(0,ra.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb(),r=C.waitForChunk(e,1024*n*128);Promise.race([i,r]).then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e),r.resolve()}),(t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e),r.reject(t)})).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;ewa(this,void 0,void 0,(function*(){return 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,(()=>wa(this,void 0,void 0,(function*(){r&&r();const n=()=>wa(this,void 0,void 0,(function*(){return r&&r(),this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(n);throw e}))}));(0,_e.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=R(i);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/1024/128}getLimitPart(e){if(!e)return 524288;let t=131072;for(;e/t>2e3;)t*=2;return t}refreshReference(e){const t=e.file_reference,a=R(t);let s=this.refreshReferencePromises[a];if(!s){const n=(0,_.Z)();s=this.refreshReferencePromises[a]={deferred:n,timeout:F.Z.setTimeout((()=>{this.log.error("Didn't refresh the reference:",e),n.reject("REFERENCE_IS_NOT_REFRESHED")}),6e4)},n.catch(S.Z).finally((()=>{clearTimeout(s.timeout)})),this.referenceDatabase.refreshReference(t).then(n.resolve,n.reject)}return s.deferred.then((t=>{if(a===R(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}download(e){var t;if(!Ia.Z.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:s,location:n}=e;let r;"application/x-tgwallpattern"===e.mimeType?(r=this.uncompressTGV,e.mimeType="image/svg+xml"):"image/webp"!==e.mimeType||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e.mimeType?(r=this.uncompressTGS,e.mimeType="application/json"):"audio/ogg"!==e.mimeType||i().IS_OPUS_SUPPORTED||(r=this.convertOpus,e.mimeType="audio/wav"):(r=this.convertWebp,e.mimeType="image/png");const o=(0,ft.P)(n,{fileName:e.fileName}),p=this.downloadPromises[o],d=this.getFileStorage();if(this.debug&&this.log("downloadFile",o,a,n,e.mimeType),p)return a?p.then((t=>t instanceof Blob&&t.sizethis.download(e))).catch((()=>this.download(e)))):t)):p;const f=(0,_.Z)(),c=e.mimeType||"image/jpeg";let l,g,m=!1,h=e=>{l=e,delete this.downloadPromises[o],f.reject(l),h=()=>{},!g||l&&"DOWNLOAD_CANCELED"===l.type||g.truncate()};const u=this.tempId++;d.getFile(o).then((t=>wa(this,void 0,void 0,(function*(){if(t.size{if(e.onlyCache)return void h(t);const i=e.limitPart||this.getLimitPart(a);d.getFileWriter(o,a||i,c).then((t=>{let p;g=t;let d,c=Promise.resolve();const l=e=>wa(this,void 0,void 0,(function*(){return r?yield r(e,o):e})),v="inputWebFileLocation"===n._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),b=[];p=0;do{d=(0,_.Z)(),b.push({offset:p,writeFilePromise:c,writeFileDeferred:d}),c=d,p+=i}while(pwa(this,void 0,void 0,(function*(){const{offset:p,writeFilePromise:d,writeFileDeferred:c}=b.shift();try{y();const g=yield v(s,n,p,i,u,e.queueId,y),h=g.bytes;b.length&&M(),this.debug&&this.log("downloadFile requestFilePart result:",o,g);const _=p+i>=a||!h.byteLength;if(h.byteLength){P+=h.byteLength;const e={done:P,offset:p,total:a,fileName:o};f.notify(e),yield d,y(),yield t.write(h,p)}if(_&&r){const e=t.getParts(),a=yield l(e);y(),t.replaceParts(a)}if(c.resolve(),_){m=!0;const e=a||h.byteLength;a||t.trim(e),f.resolve(t.finalize(e<20971520))}}catch(e){h(e)}}));for(let e=0,t=Math.min(1/0,b.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)}))}));const y=()=>{if(l)throw l};return f.cancel=()=>{if(!l&&!m){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",h(e)}},f.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},this.downloadPromises[o]=f,f.catch(S.Z).finally((()=>{delete this.downloadPromises[o]})),f}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,Ca.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.catch(S.Z).finally((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})))),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;let n=!1,i=!1,r=0,o=262144;a>67108864?o=524288:a<102400&&(o=32768),t||(t=(0,qt.Z)(e));const p=this.getDelta(o),d=Math.ceil(a/o),f=(0,ke.a)();let c=0;const l={_:s?"inputFileBig":"inputFile",id:f,parts:d,name:t,md5_checksum:""},g=(0,_.Z)();if(d>4e3)return g.reject({type:"FILE_TOO_BIG"}),g;let m=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),g.reject(e),n=!0,m=()=>{}};const h=s?"upload.saveBigFilePart":"upload.saveFilePart",u=this.tempId++,y=this,v=function*(){for(let _=0;_{return(p=e.slice(_,_+o),function(e,t){return new Promise((t=>{const a=new FileReader;a.addEventListener("loadend",(e=>{t(e.target.result)})),a.readAsArrayBuffer(e)}))}(p)).then((e=>{if(n)throw{type:"UPLOAD_CANCELED"};return y.debug&&y.log("Upload file part, isBig:",s,v,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),y.apiManager.invokeApi(h,{file_id:f,file_part:v,file_total_parts:d,bytes:e},{fileUpload:!0}).then((()=>{if(n)return;++r;const e={done:r*o,offset:_,total:a,fileName:t};g.notify(e),r>=d&&(g.resolve(l),i=!0)}),m)}));var p}),p).catch(m)}}(),b=()=>{if(n)return;const e=v.next();e.done||n||e.value.then(b)};for(let e=0,t=Math.min(1/0,d);e{n||i||(n=!0,m({type:"UPLOAD_CANCELED"}))},g.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},g.finally((()=>{delete this.uploadPromises[t]})),this.uploadPromises[t]=g}}var Aa=a(1962),Da=a(3306);class Ua extends H{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}=e,r=JSON.stringify(s);let o;return this.hashes[i]&&(o=this.hashes[i][r],o&&(s.hash=o.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return o.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),this.hashes[i][r]={hash:e,result:t}}return e.processResult?e.processResult(t):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 g=this.invokeApi(n,o,p).then(i,r).finally((()=>{c.delete(f),c.size||delete d[n]}));return c.set(f,g),g}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=F.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(){return this.invokeApiCacheable("help.getConfig")}getAppConfig(e){if(this.appConfig&&!e)return this.appConfig;if(this.getAppConfigPromise&&!e)return this.getAppConfigPromise;const t=this.getAppConfigPromise=this.invokeApi("help.getAppConfig").then((e=>{var a,s;return this.getAppConfigPromise!==t?this.getAppConfigPromise:(this.appConfig=e,s=null!==(a=e.ignore_restriction_reasons)&&void 0!==a?a:[],Ee.clear(),s.forEach((e=>{Ee.add(e)})),e)}));return t}}var Ea=a(8453),Ta=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 Ra extends Ua{constructor(){super(),this.log=(0,M.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)}))}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 Ta(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield Et.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(y.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ta(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}Et.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,Et.Z.set({dc:this.baseDcId})}logOut(){return Ta(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=>Et.Z.get(e)))),a=[];for(let e=0;eTa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,Ea.Z)(!1,!0),Aa.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=r.length-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=t?r.splice(e,1)[0]:r.pop();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=>Et.Z.get(e)))).then((([i,o])=>Ta(this,void 0,void 0,(function*(){let l,g;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Da.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Da.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);Et.Z.set({[d]:R(a.authKey),[f]:R(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){g=e}const m=this.getTransportType(a);if(m!==n&&(p=this.generateNetworkerGetKey(e,m,a),c.destroy(),O.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,m)),this.log("transport has been changed during authorization from",n,"to",m)),delete this.gettingNetworkers[p],g)throw this.log("get networker error",g,g.stack),g;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(S.Z,S.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&O.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),O.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,_.Z)();let{afterMessageId:n,prepareTempMessageId:i}=a;if(i&&s.then((()=>{delete this.afterMessageTempIds[i]})),d.GO){const n=Date.now(),i=F.Z.setInterval((()=>{o&&o.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(S.Z).finally((()=>{clearInterval(i)}))}let r,o,p=(new Error).stack||"empty stack";const f=()=>{if(n){const e=this.afterMessageTempIds[n];e&&(a.afterMessageId=e.messageId)}const p=o.wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:s}),p.catch((s=>{if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,r,e,t),401===s.code&&this.baseDcId===r)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(Et.Z.delete("dc"),Et.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&r!==this.baseDcId){if(void 0===this.cachedExportPromise[r]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:r},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:r,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[r]=e}return this.cachedExportPromise[r].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const n=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(n!==r)return a.dcId=n,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[n];return n=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type)return(0,v.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,v.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)throw s;return(0,v.Z)(1e3*e).then((()=>f()))}}{const n=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(n!==r)return a.dcId?a.dcId=n:this.setBaseDcId(n),this.invokeApi(e,t,a)}}))};let c;return c=(r=a.dcId||this.baseDcId)?this.getNetworker(r,a):this.getBaseDcId().then((e=>this.getNetworker(r=e,a))),c.then((e=>{o=e;const t=f();return o.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ta(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 Fa{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)}}Ie(Fa,[p.Z,H]);const xa=Fa;class Ba{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t="full"){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="full",a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t="full"){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const Va={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:"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:"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:"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:-779165146,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?Vector"}],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:"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:-1460809483,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"}],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:-1938625919,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:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?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"}],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:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],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:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,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:"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"}],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:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{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:"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:"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:"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:512177195,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:"int"},{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:408623183,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"}],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:-673242758,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:"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:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:1073147056,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:"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"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-468280483,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"},{name:"menu_button",type:"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:"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:-2107528095,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:"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"}],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:-362240487,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:"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?Vector"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1682413576,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:"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:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],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:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{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:-2067782896,predicate:"messages.featuredStickers",params:[{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:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{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:215516896,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:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-646342540,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"}],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:"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:-2074799289,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"}],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:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],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:378828315,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:"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:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{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:-1655957568,predicate:"phoneConnection",params:[{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"}],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:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{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:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{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:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{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"}],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:"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:-532532493,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:"int"},{name:"file_size_max",type:"int"},{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:"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:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],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:"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:1705297877,predicate:"messages.sponsoredMessages",params:[{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:-2091463255,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:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{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:"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:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],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:1370914559,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:"string"}],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:-381896846,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{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"}],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:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],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:228423076,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:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?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:-497026848,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:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?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:-869258997,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:"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:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],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:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",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:"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:-1319462148,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:"int"},{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:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],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:1029681423,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"}],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:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{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:2057376407,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:"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:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?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:"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:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{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:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{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:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{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:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],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:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{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:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],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:-134016113,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:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?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:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],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:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{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:-262453244,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?int"}],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:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{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:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],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:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],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:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],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:-396644838,method:"messages.getUnreadReactions",params:[{name:"peer",type:"InputPeer"},{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:-2099097129,method:"messages.readReactions",params:[{name:"peer",type:"InputPeer"}],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:451818415,method:"messages.toggleBotInAttachMenu",params:[{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:262163967,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:"reply_to_msg_id",type:"flags.0?int"}],type:"WebViewResult"},{id:-768945848,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"}],type:"Bool"},{id:1790652275,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"}],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"}]},layer:140};var Oa=a(745),La=a.n(Oa),Na=a(4736),Za=a.n(Na);function qa(e){return e>>>0}function Ga(e,t){return e=qa(e),t=qa(t),Za()(e).shiftLeft(32).add(Za()(t))}const Ha=Za()(Number.MAX_SAFE_INTEGER),ja=Za()(Za()[2]).pow(64),Wa=ja.divide(Za()[2]);function za(e,t=256){return Za().fromArray(e instanceof Uint8Array?[...e]:e,t)}const Ka=+Va.API.constructors.find((e=>"boolFalse"===e.predicate)).id,Ja=+Va.API.constructors.find((e=>"boolTrue"===e.predicate)).id,Qa=+Va.API.constructors.find((e=>"vector"===e.predicate)).id,$a=+Va.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id;class Ya{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(Ja,(t||"")+":bool"):this.writeInt(Ka,(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=Za()(e)).isNegative()?ja.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>>",R(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(">>>",R(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(">>>",R(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?Va.MTProto:Va.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(let 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(Qa,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(let t in p)this.intView[p[t]]=e[t];return r.type}}class Xa{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),R(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=Ga(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(Wa)?s.minus(ja):s),!this.mtproto&&Ha.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===Ja||t!==Ka&&(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.subarray(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===$a){const a=(i=this.fetchBytes(t+"[packed_string]"),La().inflate(i,void 0));return new Xa(a).fetchObject(e,t)}if(r===Qa)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,_.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=Date.now(),p=this.lastPingDelayDisconnectId=(0,ke.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d),this.debug&&this.log.debug(`sendPingDelayDisconnect: ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}`);const f=F.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(f);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&this.log.debug(`sendPingDelayDisconnect: pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,v.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(f);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(this.log.error("sendPingDelayDisconnect: 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 Ya({mtproto:!0}),a=(0,ke.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(T.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=F.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,ss.Z)(this.authKey),this.serverSalt=(0,ss.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,M.kg)(this.name,M.v9.Log|M.v9.Debug|M.v9.Error|M.v9.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=A(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,se.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 Ya({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 Ya({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 Ya(a);if(!this.connectionInited){const e=Va.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(Va.layer,"layer");const t=Va.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(y.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(y.Z.version+(y.Z.isMainDomain?" "+y.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(y.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===os){const e=Va.API.methods.find((e=>"invokeAfterMsg"===e.method));os=e?+e.id:0}os?(s.storeInt(os,"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 w&&(this.longPollInterval=F.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(T.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(T.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=F.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(T.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?T.Q.Closed:T.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,_.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(T.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=F.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===T.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 ns(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,es.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({},rs),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=>Za()(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 w&&n&&!i){const e=new Ya({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 w&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof w||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new Ya({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 ns(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 Ya({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,ke.d)(8)%5),n=A(new Uint8Array(s)),i=(0,es.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new Ya({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 ns(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 w))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 Xa(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,as.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+R(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,as.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 Xa(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,as.Z)(n,this.sessionId)||this.prevSessionId&&(0,as.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+R(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 Xa(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,ts((s=Za()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;Et.Z.set({["dc"+this.dcId+"_server_salt"]:R(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof w&&(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 w&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=F.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof w&&(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=Za()(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),Et.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":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.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;this.lastPingDelayDisconnectId===t&&this.pingDelayDisconnectDeferred.resolve("pong");break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class ds extends H{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||y.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,P.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ps(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 fs=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 Ya;t.storeBytes((0,Da.Z)(e.modulus),"n"),t.storeBytes((0,Da.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[R(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 Xa(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 ls(this,void 0,void 0,(function*(){const t=new Ya({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",R(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));fs.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,as.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",R(e.serverNonce),R(e.pq),e.fingerprints);const i=yield fs.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 ls(this,void 0,void 0,(function*(){e.newNonce=A(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 Ya({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=ts(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>ls(this,void 0,void 0,(function*(){for(;;){const t=A(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=cs(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=za(o),d=Za()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=ts(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 Ya({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let g;d.ZP&&this.log("Send req_DH_params",f);try{g=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const m=g.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",m),"server_DH_params_fail"!==m._&&"server_DH_params_ok"!==m._)throw new Error("[MT] Server_DH_Params response invalid: "+m._);if(!(0,as.Z)(e.nonce,m.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,as.Z)(e.serverNonce,m.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===m._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,as.Z)(t,m.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,m.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return ls(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 Xa(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,as.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,as.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,as.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=R(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=za(a),i=Za()(s,16);if(n.compare(Za().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(Za().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=Za()(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 ls(this,void 0,void 0,(function*(){const t=(0,Da.Z)(e.g.toString(16));e.b=A(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new Ya({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 Ya({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,as.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,as.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),g=l.slice(0,8),m=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],g))).slice(-16);if(!(0,as.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=cs(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",m,c,a),e.authKeyId=m,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],g))).slice(-16);if(!(0,as.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],g))).slice(-16);if(!(0,as.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)=>ls(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:A(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class ms extends H{after(){this.lastMessageId=[0,0],this.timeOffset=0,Et.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,ke.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,Ga(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&&(Et.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class hs{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 us extends H{getPaymentForm(e,t){return this.apiManager.invokeApi("payments.getPaymentForm",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,re.Z)(t)}).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,re.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a,s){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:s,peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,re.Z)(t),info:a})}sendPaymentForm(e,t,a,s,n,i,r){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:a,peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,re.Z)(t),requested_info_id:s,shipping_option_id:n,credentials:i,tip_amount:r||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})}}const ys=new class{constructor(){this.cryptoPortPromise=(0,_.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,G.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{if(this.cryptoPortAttached)return;this.cryptoPortAttached=!0;const n=a.ports[0];s.Z.attachPort(n),this.cryptoPortPromise.resolve()}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new Q;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new ea,appChatsManager:new Be,appDocsManager:new mt,appPhotosManager:new ta,appPollsManager:new aa,appUsersManager:new ba,appWebPagesManager:new Ma,appDraftsManager:new ht,appProfileManager:new ia,appNotificationsManager:new $t,apiUpdatesManager:new Ce,appAvatarsManager:new we,appGroupCallsManager:new Pt,appCallsManager:new De,appReactionsManager:new ca,appMessagesManager:new Kt,appMessagesIdsManager:new At,appPrivacyManager:new sa,appInlineBotsManager:new wt,appStickersManager:new ua,referenceDatabase:new X,appEmojiManager:new vt,filtersStorage:new Pe,dialogsStorage:new ue,apiManager:new Ra,cryptoWorker:s.Z,passwordManager:new $,apiFileManager:new ka,peersStorage:new xa,thumbsStorage:new Ba,networkerFactory:new ds,rootScope:new l,authorizer:new gs,dcConfigurator:new O,timeManager:new ms,appStoragesManager:e,appStateManager:u,appWebDocsManager:new hs,appPaymentsManager:new us};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),F.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,Me.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,u.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()}},_s=ys;let vs=!0;function bs(){return vs}const Ps=(0,M.kg)("MTPROTO"),Ms=new f.Z;Ms.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})=>{Ps("got state",e,a),u.userId=i,u.newVersion=s,u.oldVersion=n,Object.keys(e).forEach((t=>{u.pushToState(t,e[t],!0,!a.includes(t))})),q.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,Ea.Z)(e,t),event:(e,t)=>{Ps("will redirect event",e,t),Ms.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{vs=e},createObjectURL:e=>URL.createObjectURL(e)}),Ps("MTProto start"),_s.start(),_s.getManagers(),Ht.start(),function(e,t,a){const s=a=>{e.attachPort(a),t&&t(a)};a&&e.setOnPortDisconnect(a),"undefined"!=typeof SharedWorkerGlobalScope?F.Z.addEventListener("connect",(e=>s(e.source))):s(F.Z)}(Ms,(e=>{Ht.addTab(e)}),(e=>{Ht.deleteTab(e)}))},1507:(e,t,a)=>{a.d(t,{IA:()=>i,NM:()=>s,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647},6875:(e,t,a)=>{a.d(t,{Z:()=>n});const s=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function n(e){for(let t=0;ts.has(e._)&&n!==t&&e._===a._&&e.offset-a.length===a.offset)),-1!==n){const t=e[n];a.length+=t.length,e.splice(n,1)}}while(-1!==n)}}},8859:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(2423);const n=new Set(["messageEntityPre","messageEntityCode"]);function i(e,t){let a=-1;return e.find((e=>(n.has(e._)&&(a=e.offset+e.length),t.offset=e.offset&&t.length+t.offset<=e.length+e.offset))))}},2423:(e,t,a)=>{a.d(t,{$2:()=>d,E:()=>f,QB:()=>c,SC:()=>l,bu:()=>p,it:()=>o,kO:()=>m,tY:()=>g});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="["+n+"0-9]",r="((?:https?|ftp)://|mailto:)?",o=r+"(?:"+i+"{1,64}(?::"+i+"{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}|"+i+"["+n+"·0-9-]{0,64}(?:\\."+i+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",p=(new RegExp("^"+r.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+o+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#[0-9_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]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),f=/^(([^<>()[\]\\.,;:\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,}))$/,c=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,l={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},g=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let e in l)g.add(l[e]);const m=/^\+\d+$/},6241:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(8859),n=a(1346);function i(e,t){const a=t.filter((t=>!(0,s.Z)(e,t)));e.push(...a),(0,n.Z)(e);for(let t=0;t{function s(e){e.sort(((e,t)=>e.offset-t.offset||t.length-e.length))}a.d(t,{Z:()=>s})},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}},o={};function p(e){var t=o[e];if(void 0!==t)return t.exports;var a=o[e]={id:e,loaded:!1,exports:{}};return r[e].call(a.exports,a,a.exports,p),a.loaded=!0,a.exports}p.m=r,p.x=()=>{var e=p.O(void 0,[699,211,725,960,740,27],(()=>p(8344)));return p.O(e)},e=[],p.O=(t,a,s,n)=>{if(!a){var i=1/0;for(f=0;f=n)&&Object.keys(p.O).every((e=>p.O[e](a[o])))?a.splice(o--,1):(r=!1,n0&&e[f-1][2]>n;f--)e[f]=e[f-1];e[f]=[a,s,n]},p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},p.d=(e,t)=>{for(var a in t)p.o(t,a)&&!p.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},p.f={},p.e=e=>Promise.all(Object.keys(p.f).reduce(((t,a)=>(p.f[a](e,t),t)),[])),p.u=e=>960===e?"960.7ae964ab6031f51a0275.bundle.js":740===e?"740.b672541847aa35089884.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"15a67f69d99bd6da42da",27:"0409c6d29d5c2ee62ee6",104:"637ee92c4436d936af0a",211:"a7ea0f3283af2967a6ae",301:"908ec7163f3671b91bdb",642:"f2d4e67ea15d5329cd0b",699:"f16d6f756c34f3914132",725:"12c1ba16de4c3fac7523"}[e]+".chunk.js",p.miniCssF=e=>{},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},p.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;p.g.importScripts&&(e=p.g.location+"");var t=p.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(/\/[^\/]+$/,"/"),p.p=e})(),t=p.u,a=p.e,s=new Map,n=new Map,p.u=function(e){return t(e)+(s.has(e)?"?"+s.get(e):"")},p.e=function(e){return a(e).catch((function(a){var i=n.has(e)?n.get(e):999999;if(i<1){var r=t(e);throw a.message="Loading chunk "+e+" failed after 999999 retries.\n("+r+")",a.request=r,a}return new Promise((function(t){setTimeout((function(){var a=Date.now();s.set(e,a),n.set(e,i-1),t(p.e(e))}),3e3)}))}))},(()=>{var e={678:1};p.f.i=(t,a)=>{e[t]||importScripts(p.p+p.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,n,i]=t;for(var r in n)p.o(n,r)&&(p.m[r]=n[r]);for(i&&i(p);s.length;)e[s.pop()]=1;a(t)}})(),i=p.x,p.x=()=>Promise.all([699,211,725,960,740,27].map(p.e,p)).then(i),p.x()})(); -//# sourceMappingURL=mtproto.worker.d4c394cfcd75943f854f.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.d4c394cfcd75943f854f.chunk.js.map b/public/mtproto.worker.d4c394cfcd75943f854f.chunk.js.map deleted file mode 100644 index 55c0d5e6d..000000000 --- a/public/mtproto.worker.d4c394cfcd75943f854f.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"mtproto.worker.d4c394cfcd75943f854f.chunk.js","mappings":"uBAAIA,ECEIC,EACAC,EACAC,EACAC,ECLJC,E,mCCQG,MAAMC,EAAyE,CAAC,GAAK,CAAC,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,IAAI,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,GAAG,GAAG,CAAC,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,mBAAmB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,oDAAoD,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,yCAAyC,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","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/lib/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/helpers/object/getDeepProperty.ts","webpack://tweb/./src/lib/mtproto/networkStats.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/helpers/object/defineNotNumerableProperties.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/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.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/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.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/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.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/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/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.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/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};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,725,960,740,27].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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode, \r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], \r\n log?: string, \r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","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 } from \"../layer\";\nimport type { AppMessagesManager, Dialog, 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 { 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\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, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {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 '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_recent': MyDocument[],\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, 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': string,\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': string,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\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 = NULL_PEER_ID;\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.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\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 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","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach((key) => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport noop from \"../../helpers/noop\";\r\nimport { DcId } from \"../../types\";\r\n\r\nexport class NetworkStats {\r\n public sent: number;\r\n public received: number;\r\n public awaitingChunks: Map}[]>;\r\n\r\n constructor() {\r\n this.sent = this.received = 0;\r\n this.awaitingChunks = new Map();\r\n }\r\n\r\n public addSent(dcId: DcId, length: number) {\r\n this.sent += length;\r\n }\r\n\r\n public addReceived(dcId: DcId, length: number) {\r\n this.received += length;\r\n\r\n const awaitingChunks = this.awaitingChunks.get(dcId);\r\n const awaitingLength = awaitingChunks?.length;\r\n if(awaitingLength) {\r\n for(let i = 0; i < awaitingLength; ++i) {\r\n const awaiting = awaitingChunks[i];\r\n if(length >= awaiting.length) {\r\n awaiting.deferred.resolve();\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public waitForChunk(dcId: DcId, length: number) {\r\n const deferred = deferredPromise();\r\n let awaitingChunks = this.awaitingChunks.get(dcId);\r\n if(!awaitingChunks) {\r\n this.awaitingChunks.set(dcId, awaitingChunks = []);\r\n }\r\n\r\n const awaiting = {length, deferred};\r\n deferred.catch(noop).finally(() => {\r\n indexOfAndSplice(awaitingChunks, awaiting);\r\n });\r\n\r\n awaitingChunks.push(awaiting);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst networkStats = new NetworkStats();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkStats = networkStats);\r\nexport default networkStats;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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';\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport randomize from \"../../../helpers/array/randomize\";\r\nimport cryptoMessagePort from \"../../crypto/cryptoMessagePort\";\r\nimport { Codec } from \"./codec\";\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n private id: number;\r\n private idPromise: Promise;\r\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\r\n\r\n // private cryptoEncKey: CryptoKey;\r\n // private cryptoDecKey: CryptoKey;\r\n // private cryptoKey: CryptoKey;\r\n\r\n // private encIv: Uint8Array;\r\n // private decIv: Uint8Array;\r\n\r\n // private decIvCounter: Counter;\r\n\r\n public async init(codec: Codec) {\r\n if(this.idPromise !== undefined) {\r\n this.release();\r\n }\r\n\r\n const initPayload = new Uint8Array(64);\r\n randomize(initPayload);\r\n \r\n while(true) {\r\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\r\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n randomize(initPayload);\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\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]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n \r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\r\n encKey,\r\n encIv,\r\n decKey,\r\n decIv\r\n });\r\n\r\n this.process = async(data, operation) => {\r\n await idPromise;\r\n return this._process(data, operation);\r\n };\r\n\r\n this.id = await idPromise;\r\n \r\n this.process = this._process;\r\n \r\n // this.decIvCounter = new Counter(this.decIv);\r\n /* const key = this.cryptoEncKey = await subtle.importKey(\r\n 'raw',\r\n encKey,\r\n {name: 'AES-CTR'},\r\n false,\r\n ['encrypt']\r\n ); */\r\n\r\n // this.cryptoDecKey = await subtle.importKey(\r\n // 'raw',\r\n // decKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt']\r\n // );\r\n\r\n // this.cryptoKey = await subtle.importKey(\r\n // 'raw',\r\n // encKey,\r\n // {name: 'AES-CTR'},\r\n // false,\r\n // ['encrypt', 'decrypt']\r\n // );\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = await this.encode(initPayload.slice());\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n\r\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\r\n return cryptoMessagePort.invoke('invoke', {\r\n method: 'aes-ctr-process',\r\n args: [{id: this.id, data, operation}],\r\n }, undefined, undefined, [data.buffer]) as Promise;\r\n };\r\n\r\n public encode(payload: Uint8Array) {\r\n /* return subtle.encrypt({\r\n name: 'AES-CTR',\r\n counter: this.encIv,\r\n length: 64\r\n },\r\n this.cryptoEncKey,\r\n payload\r\n ); */\r\n return this.process(payload, 'encrypt');\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.process(payload, 'decrypt');\r\n }\r\n\r\n public async release() {\r\n const idPromise = this.idPromise;\r\n if(idPromise === undefined) {\r\n return;\r\n }\r\n\r\n this.id = undefined;\r\n this.idPromise = undefined;\r\n\r\n const id = await idPromise;\r\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\r\n }\r\n\r\n public destroy() {\r\n this.release();\r\n }\r\n\r\n // public encode(payload: Uint8Array) {\r\n // let res = this.encNew.encrypt(payload);\r\n // let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n // return bytes;\r\n // }\r\n\r\n // public async decode(payload: Uint8Array) {\r\n // const counter = this.decIvCounter.counter.slice();\r\n // this.decIvCounter.increment();\r\n\r\n // const n: ArrayBuffer = await subtle.encrypt({\r\n // name: 'AES-CTR',\r\n // counter: counter,\r\n // length: 64\r\n // },\r\n // this.cryptoDecKey,\r\n // payload\r\n // );\r\n\r\n // const decoded = this.decNew.update(payload);\r\n \r\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\r\n\r\n // return decoded;\r\n // }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { bytesFromHex, addPadding } from \"../../bin_utils\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass AbridgedPacketCodec implements Codec {\r\n public tag = 0xef;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n public encodePacket(data: Uint8Array) {\r\n const len = data.byteLength >> 2;\r\n let header: Uint8Array;\r\n if(len < 127) {\r\n header = new Uint8Array([len]);\r\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\r\n //header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\r\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\r\n //console.log('got nobody cause im braindead', header, len);\r\n }\r\n \r\n return header.concat(data);\r\n //return new Uint8Array([...header, ...data]);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n let length = data[0];\r\n if(length >= 127) { // 0x7f\r\n length = data[1] | (data[2] << 8) | (data[3] << 16);\r\n\r\n return data.slice(4, length << 2 + 1); // need +1\r\n }\r\n \r\n return data.slice(1, length << 2 + 1); // need +1\r\n }\r\n}\r\n\r\nexport default new AbridgedPacketCodec();\r\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\";\nimport 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 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\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 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, suffix: string, premium?: boolean) => {\n const path = connectionType !== 'client' ? 'apiws' + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\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, suffix: string, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(let 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 const suffix = connectionType === 'client' ? '' : '-1';\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix, 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport deferredPromise, { CancellablePromise } from \"../../../../helpers/cancellablePromise\";\r\nimport type { StoragesResults } from \"./loadStorages\";\r\n\r\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\r\nexport default RESET_STORAGES_PROMISE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { 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 { 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\n public clear: (init?: boolean) => void;\n \n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type{ Chat } from \"../../../../layer\";\r\nimport type{ Dialog } from \"../../appMessagesManager\";\r\nimport type{ User } from \"../../appUsersManager\";\r\nimport type { StoragesStorages } from \"./createStorages\";\r\nimport { recordPromiseBound } from \"../../../../helpers/recordPromise\";\r\nimport { Awaited } from \"../../../../types\";\r\nimport { logger } from \"../../../logger\";\r\nimport RESET_STORAGES_PROMISE from \"./resetStoragesPromise\";\r\n\r\nexport type StoragesResults = Awaited>;\r\n\r\nasync function loadStoragesInner(storages: StoragesStorages) {\r\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\r\n const storagesKeys = Object.keys(storages) as Array;\r\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\r\n const promise = storages[key].getAll();\r\n return recordPromise(promise, 'storage ' + (key as any as string));\r\n });\r\n \r\n const storagesResults: {\r\n users: User[],\r\n chats: Chat[],\r\n dialogs: Dialog[]\r\n } = {} as any;\r\n const arr = await Promise.all(storagesPromises);\r\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\r\n storagesResults[storagesKeys[i]] = arr[i] as any;\r\n }\r\n\r\n arr.splice(0, storagesKeys.length);\r\n\r\n const resetStorages = await RESET_STORAGES_PROMISE;\r\n if(resetStorages.size) {\r\n for(const key of resetStorages) {\r\n storagesResults[key].length = 0;\r\n }\r\n\r\n resetStorages.clear();\r\n }\r\n\r\n return storagesResults;\r\n}\r\n\r\nlet promise: ReturnType;\r\nexport default function loadStorages(storages: StoragesStorages) {\r\n return promise ??= loadStoragesInner(storages);\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat } from \"../../../../layer\";\r\nimport type { Dialog } from \"../../appMessagesManager\";\r\nimport type { User } from \"../../appUsersManager\";\r\nimport DATABASE_STATE from \"../../../../config/databases/state\";\r\nimport AppStorage from \"../../../storage\";\r\n\r\nexport type StoragesStorages = {\r\n users: AppStorage, typeof DATABASE_STATE>,\r\n chats: AppStorage, typeof DATABASE_STATE>,\r\n dialogs: AppStorage, typeof DATABASE_STATE>\r\n};\r\n\r\nexport default function createStorages() {\r\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\r\n const storages: StoragesStorages = {} as any;\r\n for(const name of names) {\r\n // @ts-ignore\r\n storages[name] = new AppStorage(DATABASE_STATE, name);\r\n }\r\n\r\n return storages;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport randomize from '../../helpers/array/randomize';\r\nimport { AppManager } from '../appManagers/manager';\r\n\r\nexport class PasswordManager extends AppManager {\r\n public getState(): Promise {\r\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then((state) => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n randomize(salt1);\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public getInputCheckPassword(password: string, state: AccountPassword) {\r\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return this.apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then((auth) => {\r\n if(auth._ === 'auth.authorization') {\r\n this.apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return this.apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Photo } from \"../../layer\";\nimport { logger } from \"../logger\";\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\nimport deepEqual from \"../../helpers/object/deepEqual\";\nimport { AppManager } from \"../appManagers/manager\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions;\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\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.wrapSingleMessage(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 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 '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","export default function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\n //const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach((name) => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from \"../../appMessagesManager\";\nimport type getDialogIndexKey from \"./getDialogIndexKey\";\n\nexport default function setDialogIndex(\n dialog: Dialog, \n indexKey: ReturnType,\n index: number\n) {\n return 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, DialogPeer, Message, MessageAction, MessageMedia, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport tsNow from \"../../helpers/tsNow\";\nimport SearchIndex from \"../searchIndex\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { 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 getPeerId from \"../appManagers/utils/peers/getPeerId\";\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\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: LOCAL_FOLDER_ID = undefined;\nexport type LOCAL_FOLDER_ID = 0 | 1;\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 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.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\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 this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\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(dialog, undefined, true);\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 if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\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, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], 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.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\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(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n let folder = this.folders[id];\n if(!folder) {\n folder = this.folders[id] = {\n dialogs: [], \n id, \n unreadMessagesCount: 0, \n unreadPeerIds: new Set(), \n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n }\n\n return folder;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\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 return skipMigrated ? folder.dialogs.filter((dialog) => 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: Dialog;\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(filterId <= 1) return getDialogIndexKey(filterId as LOCAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.orderIndex);\n }\n \n public isPeerUnmuted(peerId: PeerId) {\n return !this.appNotificationsManager.isPeerLocalMuted(peerId, true);\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 return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n /* if(filter.id <= 1) {\n index = getDialogIndex(dialog, getDialogIndexKey(filter.id));\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = getDialogIndex(dialog);\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, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let 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(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && 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 getDialogIndex(peerId: PeerId | Dialog, indexKey: ReturnType) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOnly(peerId);\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 if(date === undefined) {\n date = tsNow(true) + this.timeManager.getServerTimeOffset();\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex((d) => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, 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) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\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));\n }\n }\n\n return () => callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isPeerUnmuted(dialog.peerId);\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.isPeerUnmuted(dialog.peerId);\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\n ) {\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n const {peerId} = dialog;\n if(toggleDialog) {\n folder.unreadPeerIds.add(peerId);\n } else {\n folder.unreadPeerIds.delete(peerId);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(peerId);\n } else {\n folder.unreadUnmutedPeerIds.delete(peerId);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\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 }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message)?.date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey(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) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(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) {\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: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex((d) => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(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 savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\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 dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\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) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage)?.date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage)?.date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\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(topMessage || dialog.draft?._ === 'draftMessage') {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\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[peerId];\n }\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\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;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\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(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = 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(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.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, 0, 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);\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 settings: dialog.notify_settings\n });\n\n if(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(dialog, message?.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId: number = 0, skipMigrated = false): {\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n } | Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n if(folderId > 1) {\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(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId: LOCAL_FOLDER_ID = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId as LOCAL_FOLDER_ID;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\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 === folderId) {\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, realFolderId).then((result) => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, 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 // 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 = 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.folder_id = folder_id as LOCAL_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 ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = 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 if(dialog) {\n if(!update.pFlags.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(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\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 const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\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 handleOrder(dialogsResult.dialogs.map((d) => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n handleOrder(update.order.map((peer) => getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * 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, Update } from \"../../layer\";\nimport { Modify } from \"../../types\";\nimport type { Dialog } from '../appManagers/appMessagesManager';\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport copy from \"../../helpers/object/copy\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\nimport getPeerId from \"../appManagers/utils/peers/getPeerId\";\nimport { AppManager } from \"../appManagers/manager\";\nimport assumeType from \"../../helpers/assumeType\";\n\nexport type MyDialogFilter = Modify;\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 START_ORDER_INDEX = 2;\n\n// const LOCAL_FILTER: MyDialogFilter = {\n// _: 'dialogFilter',\n// id: 0,\n// title: '',\n// exclude_peers: [],\n// include_peers: [],\n// pinned_peers: [],\n// excludePeerIds: [],\n// includePeerIds: [],\n// pinnedPeerIds: [],\n// pFlags: {}\n// };\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n this.filters = {};\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\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 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 return this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n\n // delete this.filters[0];\n // delete this.filters[1];\n // this.getLocalFilter(0);\n // this.getLocalFilter(1);\n });\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= {...copy(LOCAL_FILTER), 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.reloadedPeerIds = new Set();\n }\n\n this.orderIndex = START_ORDER_INDEX;\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 }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n if(filter.id <= 1) {\n return dialog.folder_id === filter.id;\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.folder_id === 1) {\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 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({type: '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: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\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.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\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(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = 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 = 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 && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n return filters.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) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n // if(filter._ === 'dialogFilterDefault') {\n // return;\n // // filter = this.getLocalFilter(0);\n // // delete filter.orderIndex;\n // }\n\n assumeType(filter);\n convertment.forEach(([from, to]) => {\n assumeType(filter);\n filter[to] = filter[from].map((peer) => 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 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.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n\n return filter;\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as MyDialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\r\n // const callbacks: Array<(...args: any[]) => any> = [];\r\n\r\n constructors.forEach((baseCtor) => {\r\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\r\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\r\n /* if(name === '_constructor') {\r\n callbacks.push(value.value);\r\n return;\r\n } else */if(name === 'constructor') {\r\n return;\r\n }\r\n\r\n Object.defineProperty(\r\n derivedCtor.prototype,\r\n name,\r\n value\r\n );\r\n });\r\n });\r\n\r\n // if(callbacks.length) {\r\n // function c(...args: any[]): any {\r\n // callbacks.forEach((cb, idx) => {\r\n // // @ts-ignore\r\n // cb.apply(this, args[idx] || []);\r\n // });\r\n // };\r\n\r\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\r\n // configurable: true,\r\n // enumerable: true,\r\n // value: c,\r\n // writable: true\r\n // });\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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 getPeerId from './utils/peers/getPeerId';\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?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: 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 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 &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\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 clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\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 let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\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 getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\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: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.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 this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.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 this.debug && this.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 this.debug && this.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 if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\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 = 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 = 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(getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(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 && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\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 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/* || '0.8.6' */;\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) => {\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 let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\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","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 * 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, InputChannel, InputChatPhoto, InputFile, InputPeer, SponsoredMessage, Update, Updates } from \"../../layer\";\nimport { isRestricted } from \"../../helpers/restrictions\";\nimport { AppManager } from \"./manager\";\nimport getPeerId from \"./utils/peers/getPeerId\";\nimport hasRights from \"./utils/chats/hasRights\";\nimport getParticipantPeerId from \"./utils/chats/getParticipantPeerId\";\nimport { AppStoragesManager } from \"./appStoragesManager\";\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]: Chat.channel | Chat.chat | any};\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 = getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\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 if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\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 if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\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._ === '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: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\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.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\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 if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n this.rootScope.dispatchEvent('peer_title_edit', peerId);\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] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(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: Chat.chat = this.getChat(id);\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 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._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === '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._ === 'chatEmpty' || !(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).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.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\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.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?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if(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) {\n return this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\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((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\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((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\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 });\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\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((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\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((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: Array) {\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public isRestricted(chatId: ChatId) {\n const chat: Chat.channel = this.getChat(chatId);\n const restrictionReasons = chat.restriction_reason;\n\n return !!(chat.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\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 return this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300}).then((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 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","/*\n * 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\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\",\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string, web?: boolean) {\n\t\trequestedServerLanguage = true;\n const managers = rootScope.managers;\n\t\treturn Promise.all([\n\t\t\tmanagers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: web ? 'web' : App.langPack\n\t\t\t}),\n\t\t\t!web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tmanagers.apiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n\t\treturn loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach((l) => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n\t\tif(langPack.lang_code !== currentLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach((country) => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== currentLangCode) {\n\t\t\trootScope.dispatchEvent('language_change', currentLangCode);\n\t\t\tlastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach((element) => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && 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\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'];\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n const cachedDateTimeFormats: Map = 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\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n let hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key \n * @param wasObject \n * @param newObject \n */\n export 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","/*\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 { AccountWallPapers, Document, 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 getDocumentInput from './utils/docs/getDocumentInput';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport type { ThumbCache } from '../storages/thumbs';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\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 case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\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 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 return;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\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 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 }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(isServiceWorkerOnline()) {\n if((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 }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = '';\n }\n\n 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.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: '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,\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 return this.apiFileManager.requestFilePart(dcId, getDocumentInput(doc), offset, limit);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { FileURLType, getFileURL } from \"../../../../helpers/fileName\";\r\nimport { Document, PhotoSize } from \"../../../../layer\";\r\nimport getDocumentDownloadOptions from \"./getDocumentDownloadOptions\";\r\n\r\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\r\n let type: FileURLType;\r\n if(download) {\r\n type = 'download';\r\n } else if(thumb) {\r\n type = 'thumb';\r\n } else if(doc.supportsStreaming) {\r\n type = 'stream';\r\n } else {\r\n type = 'document';\r\n }\r\n\r\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\nimport { AppManager } from \"./manager\";\r\nimport getPeerId from \"./utils/peers/getPeerId\";\r\nimport generateMessageId from \"./utils/messageId/generateMessageId\";\r\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager extends AppManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerId = getPeerId(update.peer);\r\n this.saveDraft(peerId, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n\r\n /* return */stateStorage.get('drafts').then((drafts) => {\r\n this.drafts = drafts || {};\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n this.appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = this.apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n private draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = this.appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return this.apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n this.rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../config/app\";\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\nimport isObject from \"../../helpers/object/isObject\";\nimport validateInitObject from \"../../helpers/object/validateInitObject\";\nimport I18n from \"../langPack\";\nimport fixEmoji from \"../richTextProcessor/fixEmoji\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport { AppManager } from \"./manager\";\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 = 36;\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: string[];\n private getRecentEmojisPromise: Promise;\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(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\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.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() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = this.appStateManager.getState().then((state) => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = fixEmoji(emoji);\n this.getRecentEmojis().then((recent) => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n this.appStateManager.pushToState('recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\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 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: {_: 'inputPeerSelf'},\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: {_: 'inputPeerSelf'},\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Document, InputMedia } from \"../../../../layer\";\r\n\r\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\r\n return {\r\n _: 'inputMediaDocument',\r\n id: {\r\n _: 'inputDocument',\r\n id: doc.id,\r\n access_hash: doc.access_hash,\r\n file_reference: doc.file_reference\r\n },\r\n ttl_seconds: 0\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport type { MyTopPeer } from \"./appUsersManager\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport insertInDescendSortedArray from \"../../helpers/array/insertInDescendSortedArray\";\r\nimport { AppManager } from \"./manager\";\r\nimport getPhotoMediaInput from \"./utils/photos/getPhotoMediaInput\";\r\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\r\nimport generateQId from \"./utils/inlineBots/generateQId\";\r\nimport getDocumentMediaInput from \"./utils/docs/getDocumentMediaInput\";\r\nimport { AppMessagesManager } from \"./appMessagesManager\";\r\n\r\nexport class AppInlineBotsManager extends AppManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\r\n bot: this.appUsersManager.getUserInput(botId),\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = this.appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = this.appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n this.appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n return this.appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = this.appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: this.appPeersManager.getInputPeerById(peerId),\r\n msg_id: getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n sendAsPeerId: PeerId,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = getDocumentMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaInvoice': {\r\n // const photo = sendMessage.photo;\r\n // inputMedia = {\r\n // _: 'inputMediaInvoice',\r\n // description: sendMessage.description,\r\n // title: sendMessage.title,\r\n // photo: photo && {\r\n // _: 'inputWebDocument',\r\n // attributes: photo.attributes,\r\n // mime_type: photo.mime_type,\r\n // size: photo.size,\r\n // url: photo.url\r\n // },\r\n // invoice: undefined,\r\n // payload: undefined,\r\n // provider: undefined,\r\n // provider_data: undefined,\r\n // start_param: undefined\r\n // };\r\n\r\n messageMedia = {\r\n _: 'messageMediaInvoice',\r\n title: sendMessage.title,\r\n description: sendMessage.description,\r\n photo: sendMessage.photo,\r\n currency: sendMessage.currency,\r\n total_amount: sendMessage.total_amount,\r\n pFlags: {\r\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\r\n test: sendMessage.pFlags.test\r\n },\r\n start_param: undefined\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia && messageMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n messageMedia\r\n };\r\n }\r\n\r\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MESSAGE_ID_INCREMENT } from \"./utils/messageId\";\r\nimport generateMessageId from \"./utils/messageId/generateMessageId\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private tempNum = 0;\r\n\r\n public generateTempMessageId(messageId: number) {\r\n const num = ++this.tempNum;\r\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport loadScript from \"../../helpers/dom/loadScript\";\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(\r\n canRedirect &&\r\n curValue?.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts\r\n ) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map((url) => {\r\n return loadScript(url).then((script) => {\r\n script.remove();\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","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 let 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","/*\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 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 } from \"../../layer\";\nimport { ArgumentTypes, InvokeApiOptions } from \"../../types\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { GLOBAL_FOLDER_ID, LOCAL_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 { MUTE_UNTIL, NULL_PEER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport 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 type { MediaSize } from \"../../helpers/mediaSize\";\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 getPeerId from \"./utils/peers/getPeerId\";\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 type { Progress } from \"./appDownloadManager\";\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\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\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;\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\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: {[peerId: PeerId]: 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 = null;\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: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\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: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: 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\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: Dialog) => 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 if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\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 }\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 this.setDialogToStateIfMessageIsTop(message);\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] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (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 let 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: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true,\n sendAsPeerId: PeerId,\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 let 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 = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\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 }, 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 // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(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, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }> = {}) {\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 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 let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\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: '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 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)) {\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,\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: '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(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 \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 = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\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 {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\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'});\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});\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 };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : 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 */) => {\n toggleError(true);\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'});\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) => {\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(true);\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, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n sendAsPeerId: PeerId,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...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', files, 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 = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\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, file, 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: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\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'});\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 }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach((message) => toggleError(message, true));\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 this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then((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 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: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\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(peerId: PeerId, inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia}, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint,\n sendAsPeerId: PeerId,\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 let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\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 }, 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) => {\n toggleError(true);\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: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true,\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 let 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 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 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: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n sendAsPeerId: PeerId, \n threadId: number,\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(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(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\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 return peerId.isAnyChat() && this.appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\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(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\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 getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\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 return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: LOCAL_FOLDER_ID, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\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\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\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\n return this.apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId: LOCAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), (dialog) => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\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(!getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map((key) => key.toPeerId());\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 = (dialogsResult 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 if(getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.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', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\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\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean,\n sendAsPeerId: PeerId,\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] = 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\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (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 }).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 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.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 && getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\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 reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = getPeerId(inputPeer);\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 this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n return this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\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\n // fullfillLeft();\n // resolve();\n }, (err) => {\n // fullfillLeft();\n // resolve();\n // reject(err);\n }).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(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return this.apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\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 return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(this.appPeersManager.isChannel(peerId)) {\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(this.appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.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 if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\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 getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\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 }).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) {\n return this.pinnedMessages[peerId]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId) {\n return this.pinnedMessages[peerId]?.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[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 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 if(message.pFlags === undefined) {\n message.pFlags = {};\n }\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.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 const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\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 if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) {\n message.reply_to.reply_to_top_id = generateMessageId(message.reply_to.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 ? 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 : getPeerId(message.from_id);\n }\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 = 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 = 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 if(isMessage && message.media) {\n let unsupported = false;\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n message.media.photo = this.appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.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(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = message.media.document;\n message.media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!message.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 message.media.webpage = this.appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\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 message.media.photo = this.appWebDocsManager.saveWebDocument(message.media.photo);\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n\n if(unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\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) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = this.appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\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(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const appConfig = await this.apiManager.getAppConfig();\n const max = filterId === 1 ? \n (this.rootScope.premium ? appConfig.dialogs_folder_pinned_limit_premium : appConfig.dialogs_folder_pinned_limit_default) : \n (this.rootScope.premium ? appConfig.dialogs_pinned_limit_premium : appConfig.dialogs_pinned_limit_default);\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n if(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\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: Chat.chat = this.appChatsManager.getChat(migrateFrom.toChatId());\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 if(!message.pFlags.out || (\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;\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 let 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 = 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(peerId: PeerId, filters: MessagesFilter[], canCache = true): Promise {\n if(this.appPeersManager.isRestricted(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 });\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.isRestricted(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 let 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: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\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.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 result.max_id = historyStorage.maxId = 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 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 obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!this.appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\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', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\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: Chat.channel = this.appChatsManager.getChat(channelId);\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 if(!this.getReadMaxIdIfUnread(peerId, threadId)) {\n if(!force && !threadId) {\n const dialog = 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 }\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 public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\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) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (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);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = 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);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\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).then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return this.apiManager.invokeApiSingle('messages.getUnreadMentions', {\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 }).then((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 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 if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (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) {\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(this.appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted(peerId, true),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n this.getNotifyPeerSettings(peerId).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 private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(message) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\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 const dialog = this.getDialogOnly(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 const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(message._ === 'messageService' && message.action._ === 'messageActionPaymentSent') {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = 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);\n }\n\n return;\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 const pendingMessage = 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(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 if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\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);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\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 if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = ctx.setTimeout(this.handleNotifications, 0);\n }\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 = 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 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 = 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', {[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 && 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 // 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 return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\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) : getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = 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);\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 = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\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 if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && 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\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && 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(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\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 if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\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 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);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\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 getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getHistoryMessagesStorage(peerId), messages);\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 historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).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 foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\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, foundDialog);\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: Chat.channel = this.appChatsManager.getChat(channelId);\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !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 this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).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.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) : 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.wrapSingleMessage(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[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 if(peer._ === 'notifyPeer') {\n const peerId = getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\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 = 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 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?.reply_to && threadMessage.peerId?.isAnyChat()) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(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', {storageKey: pendingData.storage.key, message, sequential: pendingData.sequential});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, muteUntil: number) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n return this.appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: this.appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public togglePeerMute(peerId: PeerId, mute?: boolean) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n\n return this.mutePeer(peerId, mute ? MUTE_UNTIL : 0);\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.isRestricted(peerId)) {\n return false;\n }\n \n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(peerId.toChatId(), 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 // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\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\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, '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?: string, \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) => getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: string}[] = messageReactionsList.reactions.map((reaction) => ({peerId: 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: Chat.chat | Chat.channel = this.appChatsManager.getChat(message.peerId.toChatId());\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 const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\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.isRestricted(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) {\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.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() && !this.appChatsManager.isInChat(peerId.toChatId());\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.isRestricted(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(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\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: any = {\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.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(this.appPeersManager.isChannel(peerId)) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).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 channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\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 = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false) {\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 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 ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(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', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\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[peerId] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[peerId];\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) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\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) => _reactionCount.reaction === reactionCount.reaction);\n return (\n message.pFlags.out && (\n !previousReactionCount || \n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.pFlags.chosen && (\n !previousReactionCount || \n !previousReactionCount.pFlags.chosen\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getFileNameByLocation } from \"../../../../helpers/fileName\";\r\nimport { Document } from \"../../../../layer\";\r\nimport getDocumentInput from \"./getDocumentInput\";\r\n\r\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\r\n return getFileNameByLocation(getDocumentInput(doc, thumbSize), {fileName: doc.file_name});\r\n}\r\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport tsNow from \"../../helpers/tsNow\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport { MUTE_UNTIL } from \"../mtproto/mtproto_config\";\r\nimport throttle from \"../../helpers/schedulers/throttle\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\nimport { AppManager } from \"./manager\";\r\nimport getPeerId from \"./utils/peers/getPeerId\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager extends AppManager {\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n \r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n private checkMuteUntilTimeout: number;\r\n private checkMuteUntilThrottled: () => void;\r\n\r\n private notifyContactsSignUp: Promise;\r\n\r\n protected after() {\r\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\r\n\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n this.rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n return this.appStateManager.getState().then((state) => {\r\n if(state.notifySettings) {\r\n for(const key in state.notifySettings) {\r\n assumeType>(key);\r\n this.savePeerSettings({\r\n key,\r\n settings: state.notifySettings[key]\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then((settings) => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return this.apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then((value) => {\r\n if(value) {\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // public getNotifyExceptions() {\r\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n // .then((updates) => {\r\n // apiUpdatesManager.processUpdateMessage(updates);\r\n // });\r\n // }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then((value) => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private checkMuteUntil = () => {\r\n if(this.checkMuteUntilTimeout !== undefined) {\r\n clearTimeout(this.checkMuteUntilTimeout);\r\n this.checkMuteUntilTimeout = undefined;\r\n }\r\n\r\n const timestamp = tsNow(true);\r\n let closestMuteUntil = MUTE_UNTIL;\r\n for(const peerId in this.peerSettings.notifyPeer) {\r\n const peerNotifySettings = this.peerSettings.notifyPeer[peerId];\r\n if(peerNotifySettings instanceof Promise) {\r\n continue;\r\n }\r\n\r\n const muteUntil = peerNotifySettings.mute_until;\r\n if(!muteUntil) {\r\n continue;\r\n }\r\n\r\n if(muteUntil <= timestamp) {\r\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\r\n peerNotifySettings.mute_until = 0;\r\n\r\n this.apiUpdatesManager.saveUpdate({\r\n _: 'updateNotifySettings',\r\n peer: {\r\n _: 'notifyPeer',\r\n peer: this.appPeersManager.getOutputPeer(peerId.toPeerId())\r\n },\r\n notify_settings: peerNotifySettings\r\n });\r\n } else if(muteUntil < closestMuteUntil) {\r\n closestMuteUntil = muteUntil;\r\n }\r\n }\r\n\r\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\r\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\r\n };\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n this.appStateManager.getState().then((state) => {\r\n const notifySettings = state.notifySettings;\r\n notifySettings[key] = settings;\r\n this.appStateManager.pushToState('notifySettings', notifySettings);\r\n });\r\n } else {\r\n this.checkMuteUntilThrottled();\r\n }\r\n\r\n //rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\r\n }\r\n\r\n private getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n private getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = this.appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === this.appPeersManager.peerId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { getRestrictionReason } from \"../../helpers/restrictions\";\r\nimport isObject from \"../../helpers/object/isObject\";\r\nimport { AppManager } from \"./manager\";\r\nimport getPeerId from \"./utils/peers/getPeerId\";\r\nimport isUser from \"./utils/peers/isUser\";\r\nimport isAnyChat from \"./utils/peers/isAnyChat\";\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager extends AppManager {\r\n public get peerId() {\r\n return this.appUsersManager.userId.toPeerId();\r\n }\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n if(this.isRestricted(peerId)) {\r\n return;\r\n }\r\n\r\n const photo = peerId.isUser() \r\n ? this.appUsersManager.getUserPhoto(peerId.toUserId())\r\n : this.appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : undefined;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = this.appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(this.appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return this.appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return this.appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? this.appUsersManager.getUser(peerId.toUserId())\r\n : this.appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return isUser(peerId);\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return isAnyChat(peerId);\r\n }\r\n\r\n public isRestricted(peerId: PeerId) {\r\n return peerId.isUser() ? this.appUsersManager.isRestricted(peerId.toUserId()) : this.appChatsManager.isRestricted(peerId.toChatId());\r\n }\r\n\r\n public getRestrictionReasonText(peerId: PeerId) {\r\n const peer: Chat.channel | User.user = this.getPeer(peerId);\r\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\r\n if(reason) {\r\n return reason.text;\r\n } else {\r\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\r\n }\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer', \r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return this.appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return this.appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = this.appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === this.peerId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): Extract {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = this.appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \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._ === 'photoEmpty') return undefined;\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 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport copy from \"../../helpers/object/copy\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport parseMarkdown from \"../richTextProcessor/parseMarkdown\";\r\nimport { AppManager } from \"./manager\";\r\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\r\n\r\nexport class AppPollsManager extends AppManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map((index) => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return this.apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid),\r\n options\r\n }).then((updates) => {\r\n this.log('sendVote updates:', updates);\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return this.apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: getServerMessageId(message.mid)\r\n }).then((updates) => {\r\n this.apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return this.apiManager.invokeApi('messages.getPollVotes', {\r\n peer: this.appPeersManager.getInputPeerById(message.peerId),\r\n id: getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n this.appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return this.appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey } from \"../../layer\";\r\nimport convertInputKeyToKey from \"../../helpers/string/convertInputKeyToKey\";\r\nimport { AppManager } from \"./manager\";\r\n\r\nexport class AppPrivacyManager extends AppManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n this.rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return this.apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n this.apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map((inputRule) => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then((privacyRules) => {\r\n this.appUsersManager.saveApiUsers(privacyRules.users);\r\n this.appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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 getPeerId from \"./utils/peers/getPeerId\";\nimport getPhotoInput from \"./utils/photos/getPhotoInput\";\nimport getParticipantPeerId from \"./utils/chats/getParticipantPeerId\";\nimport ctx from \"../../environment/ctx\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\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 typingsInPeer: {[peerId: PeerId]: 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) {\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 this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\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 fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = this.appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\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 const peerId = id.toPeerId(true);\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.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 &&\n chat.pFlags && (\n // chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.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 if(this.chatsFull[id] !== undefined && !override) {\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 const peerId = id.toPeerId(true);\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.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: Chat.channel | Chat.channelForbidden = this.appChatsManager.getChat(id);\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [{\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(this.appPeersManager.peerId, 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 });\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 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 getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\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, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && 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, 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, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = 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) {\n return this.typingsInPeer[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 { Awaited } from '../types';\n\nexport default function callbackifyAll(\n values: T, \n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): PromiseLike | 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 assumeType from \"../../helpers/assumeType\";\nimport callbackify from \"../../helpers/callbackify\";\nimport callbackifyAll from \"../../helpers/callbackifyAll\";\nimport copy from \"../../helpers/object/copy\";\nimport { AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Update, Updates } from \"../../layer\";\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { AppManager } from \"./manager\";\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\nimport getPeerId from \"./utils/peers/getPeerId\";\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 });\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 ?? [];\n\n const filteredChatAvailableReactions = chatAvailableReactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }).filter(Boolean);\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction.availableReaction[], quickReaction: AvailableReaction.availableReaction) {\n const availableReaction = findAndSplice(availableReactions, availableReaction => availableReaction.reaction === quickReaction.reaction);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction.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.getAppConfig(),\n this.getAvailableReactions()\n ], ([appConfig, availableReactions]) => {\n return availableReactions.find((reaction) => reaction.reaction === appConfig.reactions_default);\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?: string, 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: string) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getAppConfig();\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 sendReaction(message: Message.message, reaction?: string, onlyLocal?: boolean) {\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 let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n let chosenReactionIdx = reactions ? reactions.results.findIndex((reactionCount) => reactionCount.pFlags.chosen) : -1;\n let chosenReaction = chosenReactionIdx !== -1 && reactions.results[chosenReactionIdx];\n if(chosenReaction) { // clear current reaction\n --chosenReaction.count;\n delete chosenReaction.pFlags.chosen;\n\n if(reaction === chosenReaction.reaction) {\n reaction = undefined;\n }\n\n if(!chosenReaction.count) {\n reactions.results.splice(chosenReactionIdx, 1);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n }\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(!this.appPeersManager.isBroadcast(message.peerId)) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionCount.reaction === reaction);\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction,\n pFlags: {}\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.pFlags.chosen = true;\n\n if(!reactions.recent_reactions && reactions.pFlags.can_see_list) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const userReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId)) {\n reactions.recent_reactions.push(userReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(userReaction);\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 return (b.count - a.count) || (indexes.get(a.reaction) - indexes.get(b.reaction));\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\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, chosenReaction?.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 { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } 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';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\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: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n \n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\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.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: () => {\n this.getRecentStickers().then(({stickers}) => {\n this.rootScope.dispatchEvent('stickers_recent', stickers as MyDocument[]);\n });\n }\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 public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\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 delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\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(): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.saveStickers(res.stickers);\n return res;\n }\n });\n\n return res;\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 ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet || !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.apiFileManager.downloadMedia({media: doc}),\n sound ? this.apiFileManager.downloadMedia({media: sound}) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n \n private saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\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 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) {\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(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\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: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\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 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: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let 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 public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers', \n processResult: (allStickers) => {\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 }\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 arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public pushRecentSticker(docId: DocId) {\n const doc = this.appDocsManager.getDoc(docId);\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 public clearRecentStickers() {\n this.rootScope.dispatchEvent('stickers_recent', []);\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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\";\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]: UserId};\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: update.username\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 if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\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 }\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 if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\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 || (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 userId = this.usernames[username];\n if(userId) {\n return this.users[userId];\n }\n\n return this.apiManager.invokeApi('contacts.resolveUsername', {username}).then((resolvedPeer) => {\n return 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 user.username,\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 ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n return userIds.map((userId) => userId.toPeerId(false));\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 private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(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 if(user.pFlags === undefined) {\n user.pFlags = {};\n }\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 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 //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\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\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n this.rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\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 status = this.getUser(status).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] || {_: 'userEmpty', id, pFlags: {deleted: true}, access_hash: ''} as any as User;\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 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 getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\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 if(user.pFlags && 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\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, showPhone?: true) {\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: showPhone\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 isRestricted(userId: UserId) {\n const user: MTUser.user = this.getUser(userId);\n const restrictionReasons = user.restriction_reason;\n\n return !!(user.pFlags.restricted && restrictionReasons && isRestricted(restrictionReasons));\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport { WebPage } from \"../../layer\";\r\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\r\nimport { AppManager } from \"./manager\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager extends AppManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n protected after() {\r\n this.apiUpdatesManager.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n // delete apiWebPage.description\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n this.rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getCachedWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n\r\n public getWebPage(url: string) {\r\n return this.apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n },\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ReferenceBytes } from \"./referenceDatabase\";\r\nimport Modes from \"../../config/modes\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, WebDocument } from \"../../layer\";\r\nimport { DcId } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport fileManager from \"../fileManager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\nimport readBlobAsArrayBuffer from \"../../helpers/blob/readBlobAsArrayBuffer\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\nimport findAndSplice from \"../../helpers/array/findAndSplice\";\r\nimport fixFirefoxSvg from \"../../helpers/fixFirefoxSvg\";\r\nimport { AppManager } from \"../appManagers/manager\";\r\nimport { getEnvironment } from \"../../environment/utils\";\r\nimport MTProtoMessagePort from \"./mtprotoMessagePort\";\r\nimport getFileNameForUpload from \"../../helpers/getFileNameForUpload\";\r\nimport type { Progress } from \"../appManagers/appDownloadManager\";\r\nimport getDownloadMediaDetails from \"../appManagers/utils/download/getDownloadMediaDetails\";\r\nimport networkStats from \"./networkStats\";\r\nimport pause from \"../../helpers/schedulers/pause\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n // getFileMethod: Parameters[1]\r\n};\r\n\r\nexport type DownloadMediaOptions = {\r\n media: Photo.photo | Document.document | WebDocument,\r\n thumb?: PhotoSize,\r\n queueId?: number,\r\n onlyCache?: boolean\r\n};\r\n\r\ntype DownloadPromise = CancellablePromise;\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// };\r\n\r\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n// type: 'refreshReference',\r\n// payload: ReferenceBytes,\r\n// originalPayload: ReferenceBytes\r\n// };\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\n\r\nconst REGULAR_DOWNLOAD_DELTA = 36;\r\nconst PREMIUM_DOWNLOAD_DELTA = 72;\r\n\r\nexport class ApiFileManager extends AppManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private downloadPromises: {\r\n [fileName: string]: DownloadPromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: CancellablePromise\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n protected after() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : (this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = findAndSplice(downloadPull, d => d.queueId === 0) || findAndSplice(downloadPull, d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n\r\n const promise = data.cb();\r\n const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * 1024 * 128);\r\n Promise.race([\r\n promise,\r\n networkPromise\r\n ]).then(() => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n networkPromise.resolve();\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n \r\n networkPromise.reject(error);\r\n }).finally(() => {\r\n promise.then(data.deferred.resolve, data.deferred.reject);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return this.apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = this.apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\r\n return 512 * 1024;\r\n }\r\n\r\n let bytes = 128 * 1024;\r\n\r\n while((size / bytes) > 2000) {\r\n bytes *= 2;\r\n }\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\r\n };\r\n\r\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n const buffer = bytes.slice().buffer;\r\n if(getEnvironment().IS_FIREFOX) {\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\r\n return fixFirefoxSvg(text as string);\r\n }).then((text) => {\r\n const textEncoder = new TextEncoder();\r\n return textEncoder.encode(text);\r\n });\r\n }\r\n\r\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance();\r\n return instance.invoke('convertWebp', {fileName, bytes});\r\n };\r\n\r\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\r\n const instance = MTProtoMessagePort.getInstance();\r\n return instance.invoke('convertOpus', {fileName, bytes});\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n this.referenceDatabase.refreshReference(reference).then(deferred.resolve, deferred.reject);\r\n // const task = {type: 'refreshReference', payload: reference};\r\n // notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then((reference) => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public isDownloading(fileName: string) {\r\n return !!this.downloadPromises[fileName];\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloadPromises[fileName];\r\n }\r\n\r\n public getUpload(fileName: string) {\r\n return this.uploadPromises[fileName];\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadPromise {\r\n if(!fileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'application/x-tgwallpattern') {\r\n process = this.uncompressTGV;\r\n options.mimeType = 'image/svg+xml';\r\n } else if(options.mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n } else if(options.mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\r\n process = this.convertOpus;\r\n options.mimeType = 'audio/wav';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.downloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob) => {\r\n if(blob instanceof Blob && blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.delete(fileName).then(() => {\r\n return this.download(options);\r\n }).catch(() => {\r\n return this.download(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred: DownloadPromise = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.downloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n if(!options.onlyCache) {\r\n await this.delete(fileName);\r\n }\r\n\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch((err) => {\r\n if(options.onlyCache) {\r\n errorHandler(err);\r\n return;\r\n }\r\n\r\n //this.log('not cached', fileName);\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, size || limit, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = (offset + limit) >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n const progress: Progress = {done, offset, total: size, fileName};\r\n deferred.notify(progress);\r\n //}\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await fileWriter.write(bytes, offset);\r\n }\r\n\r\n if(isFinal && process) {\r\n const bytes = fileWriter.getParts();\r\n const processedResult = await processDownloaded(bytes);\r\n checkCancel();\r\n\r\n fileWriter.replaceParts(processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n const realSize = size || bytes.byteLength;\r\n if(!size) {\r\n fileWriter.trim(realSize);\r\n }\r\n\r\n deferred.resolve(fileWriter.finalize(realSize < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: Progress) => {\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n };\r\n\r\n this.downloadPromises[fileName] = deferred;\r\n\r\n deferred.catch(noop).finally(() => {\r\n delete this.downloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\r\n let {media, thumb} = options;\r\n const isPhoto = media._ === 'photo';\r\n if(isPhoto && !thumb) {\r\n return Promise.reject('preloadPhoto photoEmpty!');\r\n }\r\n\r\n // get original instance with correct file_reference instead of using copies\r\n const isDocument = media._ === 'document';\r\n // const isWebDocument = media._ === 'webDocument';\r\n if(isDocument) media = this.appDocsManager.getDoc((media as Photo.photo).id);\r\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Document.document).id);\r\n\r\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\r\n\r\n let promise = this.getDownload(fileName);\r\n if(!promise) {\r\n promise = this.download(downloadOptions);\r\n \r\n if(isDocument && !thumb) {\r\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\r\n promise.catch(noop).finally(() => {\r\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\r\n });\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\r\n const {media, thumb} = options;\r\n\r\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\r\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\r\n return Promise.resolve(cacheContext.url);\r\n }\r\n\r\n return this.downloadMedia(options).then((blob) => {\r\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\r\n const url = URL.createObjectURL(blob);\r\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\r\n }\r\n\r\n return cacheContext.url;\r\n });\r\n }\r\n\r\n public downloadMediaVoid(options: DownloadMediaOptions) {\r\n return this.downloadMedia(options).then(noop);\r\n }\r\n\r\n private delete(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.downloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n fileName ||= getFileNameForUpload(file);\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferred = deferredPromise();\r\n if(totalParts > 4000) {\r\n deferred.reject({type: 'FILE_TOO_BIG'});\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then((buffer) => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return self.apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then(() => {\r\n if(canceled) {\r\n return;\r\n }\r\n\r\n ++doneParts;\r\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\r\n deferred.notify(progress);\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: Progress) => {\r\n this.rootScope.dispatchEvent('download_progress', progress);\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.uploadPromises[fileName];\r\n });\r\n\r\n return this.uploadPromises[fileName] = deferred;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\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 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","/*\n * 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 { ignoreRestrictionReasons } from \"../../helpers/restrictions\";\nimport { MethodDeclMap, User } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport { AppManager } from \"../appManagers/manager\";\nimport { ApiError } from \"./apiManager\";\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 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 private appConfig: MTAppConfig;\n private getAppConfigPromise: Promise;\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 }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n //console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n // this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n \n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n \n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n \n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(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}\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 originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(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() {\n return this.invokeApiCacheable('help.getConfig');\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) return this.appConfig;\n if(this.getAppConfigPromise && !overwrite) return this.getAppConfigPromise;\n const promise: Promise = this.getAppConfigPromise = this.invokeApi('help.getAppConfig').then((config: MTAppConfig) => {\n if(this.getAppConfigPromise !== promise) {\n return this.getAppConfigPromise;\n }\n \n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n return config;\n });\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 * 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 \n \n \n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type { UserAuth } from './mtproto_config';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, { MTMessage } from './networker';\n//import { telegramMeWebService } from './mtproto';\nimport { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\nimport { logger } from '../logger';\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\nimport type { MethodDeclMap } from '../../layer';\nimport deferredPromise, { CancellablePromise } from '../../helpers/cancellablePromise';\n//import { clamp } from '../../helpers/number';\nimport App from '../../config/app';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport IDBStorage, { IDB } from '../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 AppStorage from '../storage';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\nnetworker.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: [\"6888292542796810828\"]\n}, {\n notContentRelated: true\n}).then((res) => {\n console.log('status', res);\n}); */\n\n//console.error('apiManager included!');\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\n\nexport type ApiError = Partial<{\n code: number,\n type: string,\n description: string,\n originalError: any,\n stack: string,\n handled: boolean,\n input: string,\n message: ApiError\n}>;\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\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 = networkers.length - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n \n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\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 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 = () => {\n this.log('networker drain', networker.dcId);\n\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 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 let 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 !== undefined ? 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') {\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\";\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 = '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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\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\":\"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\":\"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\":\"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\":-779165146,\"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?Vector\"}],\"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\":\"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\":-1460809483,\"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\"}],\"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\":-1938625919,\"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\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?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\"}],\"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\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"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\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"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\":\"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\"}],\"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\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"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\":\"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\":\"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\":\"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\":512177195,\"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\":\"int\"},{\"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\":408623183,\"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\"}],\"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\":-673242758,\"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\":\"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\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":1073147056,\"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\":\"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\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-468280483,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"},{\"name\":\"menu_button\",\"type\":\"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\":\"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\":-2107528095,\"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\":\"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\"}],\"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\":-362240487,\"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\":\"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?Vector\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1682413576,\"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\":\"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\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"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\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"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\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"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\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"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\":215516896,\"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\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-646342540,\"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\"}],\"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\":\"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\":-2074799289,\"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\"}],\"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\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"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\":378828315,\"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\":\"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\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"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\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"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\"}],\"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\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"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\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"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\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"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\"}],\"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\":\"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\":-532532493,\"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\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"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\":\"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\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"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\":\"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\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"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\":-2091463255,\"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\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"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\":\"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\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"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\":1370914559,\"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\":\"string\"}],\"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\":-381896846,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"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\"}],\"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\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"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\":228423076,\"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\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?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\":-497026848,\"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\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?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\":-869258997,\"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\":\"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\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"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\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"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\":\"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\":-1319462148,\"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\":\"int\"},{\"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\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"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\":1029681423,\"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\"}],\"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\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"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\":2057376407,\"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\":\"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\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?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\":\"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\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"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\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"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\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"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\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"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\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"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\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"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\":-134016113,\"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\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?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\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"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\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"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\":-262453244,\"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?int\"}],\"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\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"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\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"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\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"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\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"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\":-396644838,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"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\":-2099097129,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"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\":451818415,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":262163967,\"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\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"WebViewResult\"},{\"id\":-768945848,\"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\"}],\"type\":\"Bool\"},{\"id\":1790652275,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"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\"}]},\"layer\":140} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\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\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(let 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(let 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.subarray(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.subarray(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.subarray(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 //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\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 /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \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;\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 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, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\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 = 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 this.debug && this.log.debug(`sendPingDelayDisconnect: ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}`);\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 && this.log.debug(`sendPingDelayDisconnect: 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 this.log.error('sendPingDelayDisconnect: 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 = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\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}) {\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] || '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 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.debug('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 this.pingDelayDisconnectDeferred.resolve('pong');\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport indexOfAndSplice from \"../../helpers/array/indexOfAndSplice\";\r\nimport { AppManager } from \"../appManagers/manager\";\r\n\r\nexport class NetworkerFactory extends AppManager {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n\r\n public onConnectionStatusChange(status: ConnectionStatusChange) {\r\n this.rootScope.dispatchEvent('connection_status_change', status);\r\n // ({type: 'connectionStatusChange', payload: status});\r\n }\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public unsetConnectionInited() {\r\n for(const networker of this.networkers) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport cryptoWorker from '../crypto/cryptoMessagePort';\r\nimport Modes from \"../../config/modes\";\r\nimport bytesFromHex from \"../../helpers/bytes/bytesFromHex\";\r\nimport bytesToHex from \"../../helpers/bytes/bytesToHex\";\r\nimport bigInt from 'big-integer';\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\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 { ApiError } from \"./apiManager\";\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\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 { InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm } from \"../../layer\";\nimport { AppManager } from \"./manager\";\nimport getServerMessageId from \"./utils/messageId/getServerMessageId\";\n\nexport default class AppPaymentsManager extends AppManager {\n public getPaymentForm(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\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 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(peerId: PeerId, mid: number, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\n info\n });\n }\n\n public sendPaymentForm(\n peerId: PeerId, \n mid: number,\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 peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport callbackify from \"../../helpers/callbackify\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport cryptoMessagePort from \"../crypto/cryptoMessagePort\";\r\nimport MTProtoMessagePort from \"../mtproto/mtprotoMessagePort\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport { AppStoragesManager } from \"./appStoragesManager\";\r\nimport createManagers from \"./createManagers\";\r\n\r\ntype Managers = Awaited>;\r\n\r\nexport class AppManagersManager {\r\n private managers: Managers | Promise;\r\n private cryptoPortAttached: boolean;\r\n private cryptoPortPromise: CancellablePromise;\r\n\r\n constructor() {\r\n this.cryptoPortPromise = deferredPromise();\r\n this.cryptoPortPromise.then(() => {\r\n this.cryptoPortPromise = undefined;\r\n });\r\n }\r\n\r\n public start() {\r\n const port = MTProtoMessagePort.getInstance();\r\n\r\n port.addEventListener('manager', ({name, method, args}) => {\r\n return callbackify(this.getManagers(), (managers) => {\r\n // @ts-ignore\r\n const manager = managers[name];\r\n return manager[method].apply(manager, args);\r\n });\r\n });\r\n\r\n port.addEventListener('cryptoPort', (payload, source, event) => {\r\n if(this.cryptoPortAttached) {\r\n return;\r\n }\r\n \r\n this.cryptoPortAttached = true;\r\n const port = event.ports[0];\r\n cryptoMessagePort.attachPort(port);\r\n this.cryptoPortPromise.resolve();\r\n });\r\n }\r\n\r\n public async createManagers() {\r\n const appStoragesManager = new AppStoragesManager();\r\n \r\n await Promise.all([\r\n // new Promise(() => {}),\r\n appStoragesManager.loadStorages(),\r\n this.cryptoPortPromise\r\n ]);\r\n\r\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\r\n return this.managers = managers;\r\n }\r\n\r\n public getManagers() {\r\n return this.managers ??= this.createManagers();\r\n }\r\n}\r\n\r\nconst appManagersManager = new AppManagersManager();\r\nexport default appManagersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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\";\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 };\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';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\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 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\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n}, (source) => {\n appTabsManager.deleteTab(source);\n});\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from \"../environment/ctx\";\r\nimport SuperMessagePort from \"../lib/mtproto/superMessagePort\";\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort, \r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (s: any) => {\r\n messagePort.attachPort(s);\r\n onConnect && onConnect(s);\r\n };\r\n\r\n onDisconnect && messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source));\r\n } else {\r\n attachPort(ctx);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MessageEntity } from \"../../layer\";\n\nconst CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { PASS_CONFLICTING_ENTITIES } from \".\";\nimport { MessageEntity } from \"../../layer\";\n\nconst SINGLE_ENTITIES: Set = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n \n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n \n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * 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(let 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\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 { MessageEntity } from \"../../layer\";\nimport findConflictingEntity from \"./findConflictingEntity\";\nimport sortEntities from \"./sortEntities\";\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","import { MessageEntity } from \"../../layer\";\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}","// 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,725,960,740,27], () => (__webpack_require__(8344)))\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 === 960) return \"960.7ae964ab6031f51a0275.bundle.js\";\n\tif (chunkId === 740) return \"740.b672541847aa35089884.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"15a67f69d99bd6da42da\",\"27\":\"0409c6d29d5c2ee62ee6\",\"104\":\"637ee92c4436d936af0a\",\"211\":\"a7ea0f3283af2967a6ae\",\"301\":\"908ec7163f3671b91bdb\",\"642\":\"f2d4e67ea15d5329cd0b\",\"699\":\"f16d6f756c34f3914132\",\"725\":\"12c1ba16de4c3fac7523\"}[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;","// 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","oldGetScript","oldLoadScript","queryMap","countMap","next","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","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","getFileURL","type","encodeURIComponent","JSON","stringify","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","forEach","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","clear","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","toPeerId","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","dispatchEventSingle","state","stateStorage","getState","setByKey","key","object","splitted","split","o","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","networkStats","sent","received","awaitingChunks","Map","addSent","dcId","addReceived","awaitingLength","awaiting","waitForChunk","catch","noop","finally","indexOfAndSplice","HTTP","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","byteLength","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","ws","connect","removeEventListener","undefined","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","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","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","encodeBody","toEncode","encoded","releasingPending","TEST_SUFFIX","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","suffix","path","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","MTTransportController","opened","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","Set","_context","deepEqual","add","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","wrapSingleMessage","peerId","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","hex","newHex","newContext","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","user_id","recentVoters","recent_voters","userId","recentReactions","recent_reactions","reaction","getPeerId","peer_id","action","userIds","users","inviter_id","chatIds","channel_id","chat_id","chatId","recentRepliers","recent_repliers","reply","defineNotNumerableProperties","props","writable","configurable","out","defineProperties","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","folders","pinnedOrders","allDialogsLoaded","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","folderId","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","newPinned","getFolderDialogs","dialogsResult","applyDialogs","d","after","rootScope","appUsersManager","getSelf","peerText","appPeersManager","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","getDialogIndexKeyByFilterId","prepareDialogUnreadCountModifying","chat","appChatsManager","getChat","dropDialogOnDeletion","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","appStateManager","appStoragesManager","getCache","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","isDialogsLoaded","loaded","resetPinnedOrder","getPinnedOrders","getOffsetDate","offsetDate","Math","min","getFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","skipMigrated","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","filtersStorage","getFilter","orderIndex","isPeerUnmuted","appNotificationsManager","isPeerLocalMuted","getFolderUnreadCount","unreadUnmutedCount","unreadCount","setDialogIndexInFilter","testDialogForFilter","pinnedIndex","pinnedPeerIds","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","getDialogIndex","getDialog","skipped","isObject","date","isPinned","tsNow","timeManager","getServerTimeOffset","filters","getFilters","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","callbacks","toggle","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","max","dispatchUnreadTimeout","_folder","justReturn","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","foundIndex","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","ignoreOffsetDate","saveGlobalOffset","pos","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","clearDialogFromState","foundDialog","wasPinned","keepLocal","releasePeer","dropDialogWithEvent","dropped","forEachReverse","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","updates","newUpdatesAfterReloadToHandle","saveUpdate","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","unshift","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","getDialogs","offsetIndex","limit","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","has","sort","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","FiltersStorage","reloadedPeerIds","clearFilters","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","updateDialogFilter","updateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","updateDialogFilterOrder","excludePeerIds","includes","includePeerIds","exclude_archived","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","flags","getOutputDialogFilter","bool","f","a","b","filterIncludedPinnedPeers","include_peers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","assumeType","to","oldFilter","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","self","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","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","getChannelInput","lastPtsUpdateTime","fwdHeader","reason","hasUser","post","hasChat","isUser","popPts","popSeq","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","platforms","ignore","getRestrictionReason","reasons","isRestricted","AppChatsManager","isPeerNeeded","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedPhoto","changedTitle","title","getChatTyped","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatPhoto","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","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","enabled","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","available_reactions","restrictionReasons","restriction_reason","restricted","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","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","v","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","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","textContent","arg","pushNextArgument","plain","select","item","Node","getCacheLangPack","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","window","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","mov","gif","pdf","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","docId","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","getDocumentInput","AppDraftsManager","drafts","getAllDraftPromise","updateDraftMessage","threadId","notify","getKey","getDraft","getAllDrafts","apiDraft","processApiDraft","force","draftsAreEqual","draft1","draft2","reply_to_msg_id","no_webpage","isEmptyDraft","syncDraft","localDraft","saveOnServer","serverDraft","draftObj","getInputEntities","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","recent","getRecentEmojis","indexEmojis","searchEmojis","emojis","reduce","acc","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","pushRecentEmoji","emoji","fixEmoji","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","ids","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","botId","bot","geo_point","stopTime","botResults","queryId","query_id","appDocsManager","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","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","telegramMeWebManager","disabled","hostname","setAuthorized","canRedirect","sessionStorage","curValue","ts","tgme_sync","loadScript","script","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","processAfter","cb","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","fetchSingleMessagesPromise","maxSeenId","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","incrementMaxSeenId","handleNotifications","_peerId","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","pendingData","tempId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","reply_to_peer_id","reply_to_mid","receiptMessage","ignoreExisting","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","forceUserOnline","top_msg_id","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","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","replyTo","reply_to_top_id","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","onUpdateChannelReload","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","verified","phone","onUpdatePinnedMessages","missingMessages","werePinned","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","chosen","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","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","send_as","silent","wrapMessageEntities","beforeMessageSending","sequential","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","files","sendFileDetails","groupId","invoke","multiMedia","multi_media","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","channelFull","appProfileManager","getCachedFullChat","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","originalMessage","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","fillConversations","getConversations","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","getDialogByPeerId","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","m","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","verify","appMessagesIdsManager","saveMessage","isMessage","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","appConfig","getAppConfig","dialogs_folder_pinned_limit_premium","dialogs_folder_pinned_limit_default","dialogs_pinned_limit_premium","dialogs_pinned_limit_default","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","getSearchStorage","getSearchCounters","canCache","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","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","some","readPeerId","reactionsCount","readParticipants","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","unsetEnd","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","newMaxId","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","requestPromises","getMessagesResult","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","default_send_as","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","checkMuteUntilThrottled","throttle","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerMuted","getPeerLocalSettings","respectType","n","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserPhoto","getUserString","getPeerUsername","getRestrictionReasonText","ignorePeerId","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","closed","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","AppProfileManager","usersFull","chatsFull","onUpdateUserTyping","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","chatFull","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","getProfile","usersUserFull","full_user","profile_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","getChannelFull","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","previous","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","callbackify","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","filteredChatAvailableReactions","unshiftQuickReactionInner","findAndSplice","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","chosenReactionIdx","chosenReaction","can_see_list","reactionCountIdx","userReaction","promiseKey","editMessageUpdateIdx","editMessageUpdate","EMOJI_SET_LOCAL_ID","EMOJI_ANIMATIONS_SET_LOCAL_ID","LOCAL_IDS_SET","AppStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","updateNewStickerSet","stickerSet","saveStickerSet","updateRecentStickers","getRecentStickers","stickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","getStickerSet","cachedSet","documents","refreshTime","useCache","getStickerSetInput","saveById","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","sets","covered","videos","toggleStickerSet","archived","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","allStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","recentStickers","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","pushRecentSticker","docEmoticon","_doc","clearRecentStickers","cleanUsername","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserPhoto","updateUserName","setUserNameToCache","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","oldUser","oldSearchUsername","searchUsername","fullName","wasContact","newContact","onContactUpdated","isUserOnlineVisible","isRegularUser","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","pathname","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","showPhone","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","ApiFileManager","cacheStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","networkPromise","race","setQueueId","getFileStorage","cancelDownload","canceled","cancel","requestWebFilePart","checkCancel","fileDownload","getDelta","checkedReference","getLimitPart","inputFileLocation","isDownloading","getDownload","getUpload","fileManager","IS_OPUS_SUPPORTED","cachedPromise","fileStorage","cacheFileWriter","resolved","errorHandler","_error","truncate","getFile","getFileWriter","fileWriter","writeFileDeferred","writeFilePromise","processDownloaded","delayed","superpuper","isFinal","write","getParts","processedResult","replaceParts","realSize","Infinity","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","parts","md5_checksum","it","reader","FileReader","readBlobAs","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","cacheKey","oldPromise","getAppConfigPromise","ignore_restriction_reasons","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","getTransportType","iterateNetworkers","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","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","networkerFactory","authorizer","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onDrain","isFileNetworker","canRelease","removeNetworker","setDrainTimeout","updatesProcessor","startTime","interval","cachedNetworker","isStopped","clearInterval","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","ThumbsStorage","thumbsCache","thumbFullSize","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","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","flagsOffsets","param","condType","fieldBit","storeObject","paramName","substr","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","escape","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","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","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","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","prepared","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","getPaymentForm","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","appManagersManager","cryptoPortPromise","getManagers","manager","apply","cryptoPortAttached","ports","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","appEmojiManager","passwordManager","appPaymentsManager","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","messagePort","onConnect","onDisconnect","attachPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","CAN_COMBINE_ENTITIES","combineSameEntities","nextEntityIdx","_i","nextEntity","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","currentEntity","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","newEntities","filtered","sortEntities","encodeEmoji","emojiText","unicodeSurrogates","points","char","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","every","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","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 46b58ef68..269525981 100644 --- a/public/report.html +++ b/public/report.html @@ -3,7 +3,7 @@ - tweb [27 Jul 2022 at 00:11] + tweb [20 Aug 2022 at 13:32] diff --git a/public/sw.02a19ec38e23a6d6a681.chunk.js b/public/sw.02a19ec38e23a6d6a681.chunk.js new file mode 100644 index 000000000..7101255e1 --- /dev/null +++ b/public/sw.02a19ec38e23a6d6a681.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,r,o,i,s={4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>s,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")))),s=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;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,{FK:()=>s,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,s=()=>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)=>{s().then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{a(e,...t)}))}))};r&&c.bind(null,!1),r&&c.bind(null,!0)},5003:(e,t,n)=>{n.d(t,{kg:()=>f,v9:()=>r});var r,o=n(410),i=n(4762),s=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"}(r||(r={}));const c=[r.None,r.Error,r.Warn,r.Log,r.Debug],l=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",d=[["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 f(e,t=r.Log|r.Warn|r.Error,n=!1,i=""){let g;o.ZP||n||(t=r.Error),l?i||(s.SU?i=u:s.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const m=function(...n){return t&r.Log&&console.log(i,(0,a.Z)(),e,...n)};return d.forEach((([n,r])=>{m[n]=function(...o){return t&r&&console[n](i,(0,a.Z)(),e,...o)}})),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}},1400:(e,t,n)=>{n.d(t,{Vp:()=>J,cM:()=>V,j6:()=>H});var r=n(5003);function o(e){return new Promise((t=>{setTimeout(t,e)}))}const i=self,s="cachedAssets";function a(e){return e.ok&&200===e.status}function c(e){return Promise.race([e,o(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,r)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,r(...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,r=void 0,i=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((o=void 0)||(o=Promise))((function(e,t){function s(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 n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,a)}c((i=i.apply(n,r||[])).next())}));var n,r,o,i}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}}function p(e){return{type:e}}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 p("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 r=this,o=void 0,s=function*(){let r=!1;const o=setTimeout((()=>{n(),r=!0}),15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const o=yield e(n);if(r)return;t(o)}catch(e){n(e)}clearTimeout(o)},new((i=void 0)||(i=Promise))((function(e,t){function n(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 r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,a)}c((s=s.apply(r,o||[])).next())}));var r,o,i,s})):Promise.reject(p("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,r=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 o=[];for(const[t,i]of n){const n=e.match(i).then((n=>{if(+n.headers.get(b)+86400<=r)return V("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})}));o.push(n)}return Promise.all(o)}))))),18e5),setInterval((()=>{const e=J();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?A:P,this.destroyDebounced=function(e,t,n=!0,r=!0){let o,i,s,a,c=!1;const u=t=>{const n=s,r=a;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),r(e)}},d=(...e)=>{i||(i=new Promise(((e,t)=>(s=e,a=t)))),o?(clearTimeout(o),c=!0,a(),i=new Promise(((e,t)=>(s=e,a=t)))):n&&(u(e),c=!1);const d=h.Z.setTimeout((()=>{!r||n&&!c||u(e),o===d&&(o=i=s=a=void 0,c=!1)}),t);return o=d,i.catch(l),i};return d.clearTimeout=()=>{o&&(h.Z.clearTimeout(o),a(),o=i=s=a=void 0,c=!1)},d}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return r=this,o=void 0,s=function*(){const r={docId:this.id,dcId:this.info.dcId,offset:e,limit:t},o=JSON.stringify(r),i=J();let s=v.get(i);s||v.set(i,s={});let a=s[o];if(a)return a.then((e=>e.bytes));this.loadedOffsets.add(e),a=s[o]=u(),H.invoke("requestFilePart",r,void 0,i).then(a.resolve,a.reject).finally((()=>{s[o]===a&&(delete s[o],Object.keys(s).length||v.delete(i))}));const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((i=void 0)||(i=Promise))((function(e,t){function n(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 r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,a)}c((s=s.apply(r,o||[])).next())}));var r,o,i,s}requestFilePartFromCache(e,t,n){const r=this.getChunkKey(e,t);return w.getFile(r).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((r=>r||this.requestFilePartFromWorker(e,t,n)))}saveChunkToCache(e,t,n){return e.then((e=>{const r=this.getChunkKey(t,n),o=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream",[b]:""+(Date.now()/1e3|0)}});return w.save(r,o)}))}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===i&&r===i+o||(e=e.slice(n-i,r-i+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,A=1048576;function k(e,t=2048){return e-e%t}var O=n(4762);function C(e,t){const n=Object.keys,r=typeof e;return e&&t&&"object"===r&&r===typeof t?n(e).length===n(t).length&&n(e).every((n=>C(e[n],t[n]))):e===t}class T{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,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),T.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const r=Array.from(e.indexNames);for(const t of r)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 r=!1;return setTimeout((()=>{r||n.onerror(p("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,o)=>{n.onsuccess=t=>{r=!0;const i=n.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},n.onerror=e=>{r=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},n.onupgradeneeded=e=>{r=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,o=n.result;this.stores.forEach((e=>{if(o.objectStoreNames.contains(e.name)){const r=n.transaction.objectStore(e.name);t(r,e)}else((e,n)=>{const r=e.createObjectStore(n.name);t(r,n)})(o,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new T(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}T.INSTANCES=[];class j{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=T.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,r)=>n.put(t[r],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,r=this.storeName){let o;return n&&(o=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((i=>new Promise(((s,a)=>{const c=i.transaction([r],e),l=()=>{clearTimeout(d),a(c.error)},u=()=>{clearTimeout(d),n&&this.log(n+": end",performance.now()-o);const e=p.map((e=>e.result));s(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(r)),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)}}var E=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((r=r.apply(e,t||[])).next())}))};const x=self,I=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/",_=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new j(e,t)}get(e){return E(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){var n;return E(this,void 0,void 0,(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){}}}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",{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:{}});x.addEventListener("push",(e=>{const t=e.data.json();V("push",t);let n=!1;const r=Promise.all([_.get("push_mute_until"),x.clients.matchAll({type:"window"})]).then((e=>{const[r,o]=e;if(V("matched clients",o),n=o.length>0,n)throw"Supress notification because some instance is alive";const i=Date.now();if(L()&&r&&i{V(e)}));const o=r.then((()=>Promise.all([_.get("push_settings"),_.get("push_lang")]))).then((e=>function(e,t,n){const r="assets/img/logo_filled_rounded.png";let o,i=e.title||"Telegram",s=e.description||"";e.custom&&(o=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||""),e.custom.peerId=""+o;let a="peer"+o;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview,a="unknown_peer"),V("show notify",i,s,r,e);const c=[{action:"mute1d",title:n.push_action_mute1d}];return x.registration.showNotification(i,{body:s,icon:r,tag:a,data:e,actions:c}).then((e=>{var t;(null==e?void 0:e.notification)&&(t=e.notification,N.has(t)||(N.add(t),t.onclose=D))})).catch((e=>{V.error("Show notification promise",e)}))}(t,e[0],e[1]))),i=o.catch((()=>(V("Closing all notifications on push",n),L()||n?R():x.registration.showNotification("Telegram",{tag:"unknown_peer"}).then((()=>{if(n)return R();setTimeout((()=>R()),n?0:100)})).catch((e=>{V.error("Show notification error",e)})))));e.waitUntil(i)})),x.addEventListener("notificationclick",(e=>{const t=e.notification;V("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&L())return V("[SW] mute for 1d"),void _.set("push_mute_until",Date.now()+864e5);const r=t.data;if(!r)return;const o=x.clients.matchAll({type:"window"}).then((e=>{r.action=n,F=r;for(let t=0;tx.clients.openWindow(e.baseUrl||I)))})).catch((e=>{V.error("Clients.matchAll error",e)}));e.waitUntil(o)})),x.addEventListener("notificationclose",D);const N=new Set;let F;function D(e){var t;t=e.notification,N.delete(t)}function R(){for(const e of N)try{e.close()}catch(e){}let e;return e="getNotifications"in x.registration?x.registration.getNotifications({}).then((e=>{for(let t=0,n=e.length;t{V.error("Offline register SW error",e)})):Promise.resolve(),N.clear(),e}function L(){return O.IS_FIREFOX}var W=n(153),M=n(410);class q extends W.Z{constructor(){super("SERVICE"),M.GO&&(M.GO.serviceMessagePort=this)}}var U=n(1352);const G=new Map,$=p("UNKNOWN");self.downloadMap=G;const B={download:e=>{const{id:t}=e;if(G.has(t))return Promise.reject($);const n=new CountQueuingStrategy({highWaterMark:1}),r=u();let o;r.then((()=>{setTimeout((()=>{G.delete(t)}),5e3)}),(()=>{G.delete(t)}));const i=new ReadableStream({start:e=>{o=e},cancel:e=>{r.reject($)}},n),s=Object.assign(Object.assign({},e),{readableStream:i,promise:r,controller:o});return G.set(t,s),r.catch((()=>{throw $}))},downloadChunk:({id:e,chunk:t})=>{const n=G.get(e);return n?n.controller.enqueue(t):Promise.reject()},downloadFinalize:e=>{const t=G.get(e);return t?(t.promise.resolve(),t.controller.close()):Promise.reject()},downloadCancel:e=>{const t=G.get(e);if(t)return t.promise.reject(),t.controller.error()}};function Z(e,t){e.respondWith(o(100).then((()=>{const e=G.get(t);if(!e||e.used)return;e.used=!0;const n=e.readableStream;return new Response(n,{headers:e.headers})})))}function z(){if(G.size)for(const[e,t]of G)t.controller.error()}const V=(0,r.kg)("SW",r.v9.Error|r.v9.Debug|r.v9.Log|r.v9.Warn,!0),K=self;let X;const J=()=>X,Y=e=>{V("window connected",e.id),"none"!==e.frameType?((e=>{te.size||X||(e=>{const t=new MessageChannel;H.attachPort(X=t.port1),H.invokeVoid("port",void 0,e,[t.port2])})(e)})(e),te.add(e.id)):V.warn("maybe a bugged Safari starting window",e.id)},H=new q;H.addMultipleEventsListeners({notificationsClear:R,toggleStorages:({enabled:e,clearWrite:t})=>{m.toggleStorage(e,t)},pushPing:(e,t)=>{!function(e,t){F&&t&&(H.invokeVoid("pushClick",F,t),F=void 0),e.lang&&_.set("push_lang",e.lang),e.settings&&_.set("push_settings",e.settings)}(e,t)},hello:(e,t)=>{Y(t)}});const{onDownloadFetch:Q,onClosedWindows:ee}=function(e){return e.addMultipleEventsListeners(B),{onDownloadFetch:Z,onClosedWindows:z}}(H);(0,U.FK)().then((e=>{V(`got ${e.length} windows from the start`),e.forEach((e=>{Y(e)}))}));const te=new Set;!function(e,t,n){const r=(t,n)=>{e.attachListenPort(t),n&&e.attachSendPort(n)};e.setOnPortDisconnect((e=>{e instanceof WindowClient&&te.has(e.id)&&(V("window disconnected"),te.delete(e.id),te.size||(V.warn("no windows left"),X&&(H.detachPort(X),X=void 0),ee()))})),"undefined"!=typeof SharedWorkerGlobalScope?h.Z.addEventListener("connect",(e=>r(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?r(h.Z,null):r(h.Z,h.Z)}(H);const ne=e=>{if(!O.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,o=function*(){try{const t=yield c(i.caches.open(s)),n=yield c(t.match(e.request,{ignoreVary:!0}));if(n&&a(n))return n;const r={Vary:"*"};let o=yield fetch(e.request,{headers:r});if(a(o))t.put(e.request,o.clone());else if(304===o.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);o=yield fetch(n,{headers:r}),a(o)&&t.put(e.request,o.clone())}return o}catch(t){return fetch(e.request)}},new((r=void 0)||(r=Promise))((function(e,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(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(s,a)}c((o=o.apply(t,n||[])).next())}));var t,n,r,o}(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(", "),[r,o]=n[0].split("-");return[+r,+o||0]}(e.request.headers.get("Range")),r=JSON.parse(decodeURIComponent(t)),o=S.get(r);e.respondWith(Promise.race([(45e3,new Promise((e=>{setTimeout((()=>{e(new Response("",{status:408,statusText:"Request timed out."}))}),45e3)}))),o.requestRange(n)]))}(e,n);break;case"download":Q(e,n)}}catch(t){V.error("fetch error",t),e.respondWith(new Response("",{status:500,statusText:"Internal Server Error",headers:{"Cache-Control":"no-cache"}}))}},re=()=>{K.onfetch=ne};K.addEventListener("install",(e=>{V("installing"),e.waitUntil(K.skipWaiting().then((()=>V("skipped waiting"))))})),K.addEventListener("activate",(e=>{V("activating",K),e.waitUntil(K.caches.delete(s).then((()=>V("cleared assets cache")))),e.waitUntil(K.clients.claim().then((()=>V("claimed clients"))))})),K.onoffline=K.ononline=re,re()}},a={};function c(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={exports:{}};return s[e](n,n.exports,c),n.exports}c.m=s,c.x=()=>{var e=c.O(void 0,[437],(()=>c(1400)));return c.O(e)},e=[],c.O=(t,n,r,o)=>{if(!n){var i=1/0;for(u=0;u=o)&&Object.keys(c.O).every((e=>c.O[e](n[a])))?n.splice(a--,1):(s=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o]},c.d=(e,t)=>{for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((t,n)=>(c.f[n](e,t),t)),[])),c.u=e=>e+".8cd31f38250954e80fcd.bundle.js",c.miniCssF=e=>{},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;c.g.importScripts&&(e=c.g.location+"");var t=c.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(/\/[^\/]+$/,"/"),c.p=e})(),t=c.u,n=c.e,r=new Map,o=new Map,c.u=function(e){return t(e)+(r.has(e)?"?"+r.get(e):"")},c.e=function(e){return n(e).catch((function(n){var i=o.has(e)?o.get(e):999999;if(i<1){var s=t(e);throw n.message="Loading chunk "+e+" failed after 999999 retries.\n("+s+")",n.request=s,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();r.set(e,n),o.set(e,i-1),t(c.e(e))}),3e3)}))}))},(()=>{var e={670:1};c.f.i=(t,n)=>{e[t]||importScripts(c.p+c.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,o,i]=t;for(var s in o)c.o(o,s)&&(c.m[s]=o[s]);for(i&&i(c);r.length;)e[r.pop()]=1;n(t)}})(),i=c.x,c.x=()=>c.e(437).then(i),c.x()})(); +//# sourceMappingURL=sw.02a19ec38e23a6d6a681.chunk.js.map \ No newline at end of file diff --git a/public/sw.02a19ec38e23a6d6a681.chunk.js.map b/public/sw.02a19ec38e23a6d6a681.chunk.js.map new file mode 100644 index 000000000..688923139 --- /dev/null +++ b/public/sw.02a19ec38e23a6d6a681.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.02a19ec38e23a6d6a681.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/startup chunk dependencies","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/helpers/makeError.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/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/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};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(437).then(next);\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({includeUncontrolled: false, type: 'window'});\r\n};\r\n\r\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n // console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\n * 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) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from '../../helpers/schedulers/pause';\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n\r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n\r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n\r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export default function noop() {}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from './noop';\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: (reason?: any) => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n const deferredHelper: any = {\r\n isFulfilled: false,\r\n isRejected: false,\r\n\r\n notify: () => {},\r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n },\r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n\r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n\r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n\r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = noop;\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport StreamWriter from './streamWriter';\r\n\r\nexport default class MemoryWriter implements StreamWriter {\r\n private bytes: Uint8Array;\r\n\r\n constructor(\r\n private mimeType: string,\r\n private size: number,\r\n private saveFileCallback?: (blob: Blob) => Promise\r\n ) {\r\n this.bytes = new Uint8Array(size);\r\n }\r\n\r\n public async write(part: Uint8Array, offset: number) {\r\n // sometimes file size can be bigger than the prov\r\n const endOffset = offset + part.byteLength;\r\n if(endOffset > this.bytes.byteLength) {\r\n const newBytes = new Uint8Array(endOffset);\r\n newBytes.set(this.bytes, 0);\r\n this.bytes = newBytes;\r\n }\r\n\r\n this.bytes.set(part, offset);\r\n };\r\n\r\n public truncate() {\r\n this.bytes = new Uint8Array();\r\n }\r\n\r\n public trim(size: number) {\r\n this.bytes = this.bytes.slice(0, size);\r\n }\r\n\r\n public finalize(saveToStorage = true) {\r\n const blob = blobConstruct(this.bytes, this.mimeType);\r\n\r\n if(saveToStorage && this.saveFileCallback) {\r\n this.saveFileCallback(blob);\r\n }\r\n\r\n return blob;\r\n }\r\n\r\n public getParts() {\r\n return this.bytes;\r\n }\r\n\r\n public replaceParts(parts: Uint8Array) {\r\n this.bytes = parts;\r\n }\r\n}\r\n","export default function makeError(type: Error['type']) {\n const error: ApiError = {\n type\n };\n\n return error;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../../config/modes';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\nimport MemoryWriter from './memoryWriter';\r\nimport FileManager from './memoryWriter';\r\nimport FileStorage from './fileStorage';\r\nimport makeError from '../../helpers/makeError';\r\nimport deferredPromise from '../../helpers/cancellablePromise';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController implements FileStorage {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n // private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n\r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n // console.warn('getFile:', response, fileName);\r\n throw makeError('NO_ENTRY_FOUND');\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n\r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject(makeError('STORAGE_OFFLINE'));\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n // console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\r\n return {\r\n deferred: deferredPromise(),\r\n getWriter: () => {\r\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return writer;\r\n }\r\n };\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n\r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport {InputFileLocation} from '../../layer';\r\nimport CacheStorageController from '../files/cacheStorage';\r\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\r\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\r\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\r\nimport timeout from './timeout';\r\n\r\nconst deferredPromises: Map}> = new Map();\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\nconst USE_CACHE = true;\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then((requests) => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n const mtprotoMessagePort = getMtprotoMessagePort();\r\n for(const [messagePort, promises] of deferredPromises) {\r\n if(messagePort !== mtprotoMessagePort) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(messagePort);\r\n }\r\n }\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const payload: ServiceRequestFilePartTaskPayload = {\r\n docId: this.id,\r\n dcId: this.info.dcId,\r\n offset: alignedOffset,\r\n limit\r\n };\r\n\r\n const taskId = JSON.stringify(payload);\r\n\r\n const mtprotoMessagePort = getMtprotoMessagePort();\r\n let promises = deferredPromises.get(mtprotoMessagePort);\r\n if(!promises) {\r\n deferredPromises.set(mtprotoMessagePort, promises = {});\r\n }\r\n\r\n let deferred = promises[taskId];\r\n if(deferred) {\r\n return deferred.then((uploadFile) => uploadFile.bytes);\r\n }\r\n\r\n this.loadedOffsets.add(alignedOffset);\r\n\r\n deferred = promises[taskId] = deferredPromise();\r\n\r\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\r\n .then(deferred.resolve, deferred.reject).finally(() => {\r\n if(promises[taskId] === deferred) {\r\n delete promises[taskId];\r\n\r\n if(!Object.keys(promises).length) {\r\n deferredPromises.delete(mtprotoMessagePort);\r\n }\r\n }\r\n });\r\n\r\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\r\n\r\n if(USE_CACHE) {\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n }\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n if(!USE_CACHE) {\r\n return Promise.resolve();\r\n }\r\n\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error: ApiError) => {\r\n if(error.type === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then((bytes) => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\r\n // log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n\r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n // setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers\r\n });\r\n // }, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n // log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4'\r\n }\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from '../../environment/ctx';\r\nimport {AnyFunction, Awaited} from '../../types';\r\nimport noop from '../noop';\r\n\r\nexport type DebounceReturnType = {\r\n (...args: Parameters): Promise>>;\r\n clearTimeout(): void;\r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n\r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n return debounce;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport Modes from '../../config/modes';\r\nimport makeError from '../../helpers/makeError';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport {logger} from '../logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string,\r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n\r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n\r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n\r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n\r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n\r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n\r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n // return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n\r\n reader.onerror = reject;\r\n });\r\n\r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n\r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n // return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode,\r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\r\n log?: string,\r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n\r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n\r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport DATABASE_STATE from '../../config/databases/state';\r\nimport {IS_FIREFOX} from '../../environment/userAgent';\r\nimport deepEqual from '../../helpers/object/deepEqual';\r\nimport IDBStorage from '../files/idb';\r\nimport {log, serviceMessagePort} from './index.service';\r\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n // user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T,\r\n storeName: typeof db['stores'][number]['name'],\r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n const cached = this.cache[key] ?? this.defaults[key];\r\n if(deepEqual(cached, value)) {\r\n return;\r\n }\r\n\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_lang: {\r\n push_message_nopreview: 'You have a new message',\r\n push_action_mute1d: 'Mute for 24H',\r\n push_action_settings: 'Settings'\r\n },\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'),\r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, clientList] = result;\r\n\r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n\r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch((reason) => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = data;\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nconst notifications: Set = new Set();\r\nlet pendingNotification: PushNotificationObject;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview;\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event?.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\r\n if(pendingNotification && source) {\r\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Database} from '.';\r\nimport type {IDBIndex} from '../../lib/files/idb';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n // indexes: [\r\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\r\n // const name = `index_${idx}`;\r\n // const index: IDBIndex = {\r\n // indexName: name,\r\n // keyPath: name,\r\n // objectParameters: {}\r\n // };\r\n\r\n // return index\r\n // })\r\n // ]\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {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\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 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 event.respondWith(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(response);\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\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';\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 sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n sendMessagePortIfNeeded(source);\n connectedWindows.add(source.id);\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: Set = new Set();\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n return;\n }\n\n log('window disconnected');\n connectedWindows.delete(source.id);\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 } 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\r\nimport ctx from '../environment/ctx';\r\n\r\nexport default function listenMessagePort(\r\n messagePort: SuperMessagePort,\r\n onConnect?: (source: MessageEventSource) => void,\r\n onDisconnect?: (source: MessageEventSource) => void\r\n) {\r\n const attachPort = (listenPort: any, sendPort: any) => {\r\n messagePort.attachListenPort(listenPort);\r\n sendPort && messagePort.attachSendPort(sendPort);\r\n onConnect?.(listenPort);\r\n };\r\n\r\n messagePort.setOnPortDisconnect(onDisconnect);\r\n\r\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\r\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\r\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\r\n attachPort(ctx, null);\r\n } else {\r\n attachPort(ctx, ctx);\r\n }\r\n}\r\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.'\r\n }));\r\n }, delay);\r\n }));\r\n}\r\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, [437], () => (__webpack_require__(1400)))\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 + \".\" + \"8cd31f38250954e80fcd\" + \".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;","// 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","oldGetScript","oldLoadScript","queryMap","countMap","next","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","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","makeError","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","saveFile","Response","headers","rejected","timeout","undefined","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","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","getter","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","clientList","nowTime","userInvisibleIsSupported","badge","reason","notificationPromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closePromise","closeAllNotifications","waitUntil","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","getNotifications","len","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","respondWith","used","stream","cancelAllDownloads","_mtprotoMessagePort","onWindowConnected","source","frameType","connectedWindows","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","addMultipleEventsListeners","notificationsClear","toggleStorages","toggleStorage","pushPing","onPing","hello","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","windowClient","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","window","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file diff --git a/public/sw.bdb55a9321cdc95dda81.chunk.js b/public/sw.bdb55a9321cdc95dda81.chunk.js deleted file mode 100644 index a1204744a..000000000 --- a/public/sw.bdb55a9321cdc95dda81.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};(()=>{if(void 0!==e){var t=e.u,n=e.e,o=new Map,r=new Map;e.u=function(e){return t(e)+(o.has(e)?"?"+o.get(e):"")},e.e=function(i){return n(i).catch((function(n){var s=r.has(i)?r.get(i):999999;if(s<1){var a=t(i);throw n.message="Loading chunk "+i+" failed after 999999 retries.\n("+a+")",n.request=a,n}return new Promise((function(t){setTimeout((function(){var n=Date.now();o.set(i,n),r.set(i,s-1),t(e.e(i))}),3e3)}))}))}}})(),e.d({},{T:()=>Q,c:()=>H});const t={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};t.http=location.search.indexOf("http=1")>0,t.http&&(t.transport="https");const n=t,o=n.debug,r=("undefined"!=typeof window?window:self,o),i="undefined"!=typeof window?window:self,s=navigator?navigator.userAgent:null,a=(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)&&i.MSStream,!!("safari"in i)||!(!s||!(/\b(iPad|iPhone|iPod)\b/.test(s)||s.match("Safari")&&!s.match("Chrome")))),c=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,l=(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),"undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope),u="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!l,h=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),d=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},f=(e,...t)=>{h().then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{d(e,...t)}))}))},g=(l&&f.bind(null,!1),l&&f.bind(null,!0),Date.now());function p(){return"["+((Date.now()-g)/1e3).toFixed(3)+"]"}var m;!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"}(m||(m={}));const v=[m.None,m.Error,m.Warn,m.Log,m.Debug],w=!(a||c),y="",b="",P=[["debug",m.Debug],["info",m.Log],["warn",m.Warn],["error",m.Error],["assert",m.Error],["trace",m.Log],["group",m.Log],["groupCollapsed",m.Log],["groupEnd",m.Log]];function S(e,t=m.Log|m.Warn|m.Error,n=!1,o=""){let i;r||n||(t=m.Error),w?o||(l?o=y:u&&(o=b)):o="";let s=o;o=o?`%s ${o}%s`:"%s";const a=function(...n){return t&m.Log&&console.log(o,p(),e,...n)};return P.forEach((([n,r])=>{a[n]=function(...i){return t&r&&console[n](o,p(),e,...i)}})),a.setPrefix=function(t){i=t,e="["+t+"]"},a.setPrefix(e),a.setLevel=function(e){t=v.slice(0,e+1).reduce(((e,t)=>e|t),0)},a.bindPrefix=function(e){return S(`${i}] [${e}`,t,n,s)},a}const A=self,O="cachedAssets";function T(e){return e.ok&&200===e.status}function E(e){return Promise.race([e,(1e4,new Promise((e=>{setTimeout(e,1e4)}))).then((()=>Promise.reject()))])}function x(){}function C(e,t=""){let n;Array.isArray(e)||(e=[e]);const o=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);try{n=new Blob(e,{type:o})}catch(t){let r=new BlobBuilder;e.forEach((e=>{r.append(e)})),n=r.getBlob(o)}return n}const _=new class{constructor(){this.blobSupported=!0;try{C([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}getFakeFileWriter(e,t,n){let o=new Uint8Array(t);const r={write:(e,t)=>{return n=this,r=void 0,s=function*(){if(!this.blobSupported)throw!1;const n=t+e.byteLength;if(n>o.byteLength){const e=new Uint8Array(n);e.set(o,0),o=e}o.set(e,t)},new((i=void 0)||(i=Promise))((function(e,t){function o(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 i?n:new i((function(e){e(n)}))).then(o,a)}c((s=s.apply(n,r||[])).next())}));var n,r,i,s},truncate:()=>{o=new Uint8Array},trim:e=>{o=o.slice(0,e)},finalize:(t=!0)=>{const r=C(o,e);return t&&n&&n(r),r},getParts:()=>o,replaceParts:e=>{o=e}};return r}};class j{constructor(e){this.dbName=e,this.useStorage=!0,n.test&&(this.dbName+="_test"),j.STORAGES.length&&(this.useStorage=j.STORAGES[0].useStorage),this.openDatabase(),j.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"NO_ENTRY_FOUND";return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=C(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,s=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((i=void 0)||(i=Promise))((function(e,t){function n(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 o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s})):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t,n){const o=_.getFakeFileWriter(n,t,(t=>this.saveFile(e,t).catch((()=>t))));return Promise.resolve(o)}static toggleStorage(e,t){return Promise.all(this.STORAGES.map((n=>{if(n.useStorage=e,t)return e?void 0:n.deleteAll()})))}}j.STORAGES=[];const k=new j("cachedStreamChunks"),N="Time-Cached";setInterval((()=>k.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,i]of n){const n=e.match(i).then((n=>{if(+n.headers.get(N)+86400<=o)return H("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})}));r.push(n)}return Promise.all(r)}))))),18e5),setInterval((()=>{h().then((e=>{for(const[t,n]of Q)if(!e.find((e=>e.id===t))){for(const e in n)n[e].reject();Q.delete(t)}}))}),12e4);const D=new Map;class I{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{D.delete(this.id)},this.id=I.getId(e),D.set(this.id,this),this.limitPart=e.size>78643200?F:L,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,s,a,c,l=!1;const u=t=>{const n=a,o=c;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),o(e)}},h=(...e)=>{s||(s=new Promise(((e,t)=>(a=e,c=t)))),r?(clearTimeout(r),l=!0,c(),s=new Promise(((e,t)=>(a=e,c=t)))):n&&(u(e),l=!1);const h=i.setTimeout((()=>{!o||n&&!l||u(e),r===h&&(r=s=a=c=void 0,l=!1)}),t);return r=h,s.catch(x),s};return h.clearTimeout=()=>{r&&(i.clearTimeout(r),c(),r=s=a=c=void 0,l=!1)},h}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return o=this,r=void 0,s=function*(){const o={type:"requestFilePart",payload:{docId:this.id,dcId:this.info.dcId,offset:e,limit:t}},r=JSON.stringify(o);o.id=r;const i=yield h().then((e=>{if(e.length)return e.find((e=>Q.has(e.id)))||e[0]}));if(!i)throw new Error("no window");let s=Q.get(i.id);s||Q.set(i.id,s={});let a=s[r];if(a)return a.then((e=>e.bytes));i.postMessage(o),this.loadedOffsets.add(e),a=s[r]=function(){let 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(x).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=x)})),Object.assign(t,e),t}();const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((i=void 0)||(i=Promise))((function(e,t){function n(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 o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return k.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=>{}))}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",[N]:""+(Date.now()/1e3|0)}});return k.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===i&&o===i+r||(e=e.slice(n-i,o-i+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=D.get(this.getId(e)))&&void 0!==t?t:new I(e)}static getId(e){return e.location.id}}const L=524288,F=1048576;function R(e,t=2048){return e-e%t}function W(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=>W(e[n],t[n]))):e===t}class q{constructor(e){!function(e,t){if(t)for(let n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),n.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=S(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),q.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({type:"IDB_CREATE_TIMEOUT"})}),3e3),this.openDbPromise=new Promise(((e,r)=>{n.onsuccess=t=>{o=!0;const i=n.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},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 q(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}q.INSTANCES=[];class M{constructor(e,t){this.storeName=t,this.log=S(["IDB",e.name,t].join("-")),this.idb=q.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((i=>new Promise(((s,a)=>{const c=i.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));s(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)}}var B=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const U=self,$=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/",G=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new M(e,t)}get(e){return B(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){var n;return B(this,void 0,void 0,(function*(){if(!W(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){}}}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",{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:{}});U.addEventListener("push",(e=>{const t=e.data.json();H("push",t);let n=!1;const o=Promise.all([G.get("push_mute_until"),U.clients.matchAll({type:"window"})]).then((e=>{const[o,r]=e;if(H("matched clients",r),n=r.length>0,n)throw"Supress notification because some instance is alive";const i=Date.now();if(Y()&&o&&i{H(e)}));const r=o.then((()=>Promise.all([G.get("push_settings"),G.get("push_lang")]))).then((e=>function(e,t,n){const o="assets/img/logo_filled_rounded.png";let r,i=e.title||"Telegram",s=e.description||"";e.custom&&(r=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||""),e.custom.peerId=""+r;let a="peer"+r;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview,a="unknown_peer"),H("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d}];return U.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then((e=>{var t;e&&e.notification&&(t=e.notification,V.has(t)||(V.add(t),t.onclose=J))})).catch((e=>{H.error("Show notification promise",e)}))}(t,e[0],e[1]))),i=r.catch((()=>(H("Closing all notifications on push",n),Y()||n?K():U.registration.showNotification("Telegram",{tag:"unknown_peer"}).then((()=>{if(n)return K();setTimeout((()=>K()),n?0:100)})).catch((e=>{H.error("Show notification error",e)})))));e.waitUntil(i)})),U.addEventListener("notificationclick",(e=>{const t=e.notification;H("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&Y())return H("[SW] mute for 1d"),void G.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=U.clients.matchAll({type:"window"}).then((e=>{o.action=n,z={type:"push_click",payload:o};for(let t=0;tU.clients.openWindow(e.baseUrl||$)))})).catch((e=>{H.error("Clients.matchAll error",e)}));e.waitUntil(r)})),U.addEventListener("notificationclose",J);let z,V=new Set;function J(e){var t;t=e.notification,V.delete(t)}function K(){for(const e of V)try{e.close()}catch(e){}let e;return e="getNotifications"in U.registration?U.registration.getNotifications({}).then((e=>{for(let t=0,n=e.length;t{H.error("Offline register SW error",e)})):Promise.resolve(),V.clear(),e}function Y(){return c}const H=S("SW",m.Error|m.Debug|m.Log|m.Warn),X=self,Q=new Map,Z={notifications_clear:()=>{K()},ping:(e,t)=>{!function(e,t){const n=t.ports&&t.ports[0]||t.source,o=e.payload;z&&n&&"postMessage"in n&&(n.postMessage(z,[]),z=void 0),o.lang&&G.set("push_lang",o.lang),o.settings&&G.set("push_settings",o.settings)}(e,t)},requestFilePart:(e,t)=>{const n=t.source,o=Q.get(n.id);if(!o)return;const r=o[e.id];r&&(e.error?r.reject(e.error):r.resolve(e.payload),delete o[e.id])},toggleStorages:e=>{const{enabled:t,clearWrite:n}=e.payload;j.toggleStorage(t,n)}};X.addEventListener("message",(e=>{const t=e.data,n=Z[t.type];n&&n(t,e)}));const ee=e=>{if(!a&&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 E(A.caches.open(O)),n=yield E(t.match(e.request,{ignoreVary:!0}));if(n&&T(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(T(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}),T(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}},new((o=void 0)||(o=Promise))((function(e,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(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(s,a)}c((r=r.apply(t,n||[])).next())}));var t,n,o,r}(e));try{const[,t,n,o]=/http[:s]+\/\/.*?(\/(.*?)(?:$|\/(.*)$))/.exec(e.request.url)||[];"stream"===n&&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=I.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,o)}catch(t){e.respondWith(new Response("",{status:500,statusText:"Internal Server Error"}))}},te=()=>{X.onfetch=ee};X.addEventListener("install",(e=>{H("installing"),e.waitUntil(X.skipWaiting())})),X.addEventListener("activate",(e=>{H("activating",X),e.waitUntil(X.caches.delete(O)),e.waitUntil(X.clients.claim())})),X.onerror=e=>{H.error("error:",e)},X.onunhandledrejection=e=>{H.error("onunhandledrejection:",e)},X.onoffline=X.ononline=te,te()})(); -//# sourceMappingURL=sw.bdb55a9321cdc95dda81.chunk.js.map \ No newline at end of file diff --git a/public/sw.bdb55a9321cdc95dda81.chunk.js.map b/public/sw.bdb55a9321cdc95dda81.chunk.js.map deleted file mode 100644 index 5cbb3d4c3..000000000 --- a/public/sw.bdb55a9321cdc95dda81.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sw.bdb55a9321cdc95dda81.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/config/modes.ts","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/dT.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/fileManager.ts","webpack://tweb/./src/lib/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/cancellablePromise.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/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/index.service.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 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 setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\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 * 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 { TransportType } from \"../lib/mtproto/dcConfigurator\";\n\nconst Modes = {\n test: location.search.indexOf('test=1') > 0/* || true */,\n debug: location.search.indexOf('debug=1') > 0,\n http: false,\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\n multipleConnections: true,\n asServiceWorker: false,\n transport: 'websocket' as TransportType\n};\n\n \nModes.http = location.search.indexOf('http=1') > 0;\n \n\n \n \n \n\nif(Modes.http) {\n Modes.transport = 'https';\n}\n\n \n \n \n\nexport default Modes;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = (process.env.NODE_ENV !== 'production' || Modes.debug)/* && false */;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\r\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({includeUncontrolled: false, type: 'window'});\r\n};\r\n\r\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\r\n try {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n } catch(err) {\r\n console.error('[worker] postMessage error:', err, args);\r\n }\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n getWindowClients().then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach((listener) => {\r\n postMessage(listener, ...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","const _logTimer = Date.now();\r\nexport default function dT() {\r\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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 let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pause from \"../../helpers/schedulers/pause\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n \r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n \r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n \r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export default function pause(ms: number) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","export default function noop() {}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \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 let blob;\n const safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, {type: safeMimeType});\n } catch(e) {\n // @ts-ignore\n let bb = new BlobBuilder;\n blobParts.forEach((blobPart: any) => {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport blobConstruct from \"../helpers/blob/blobConstruct\";\r\n\r\nexport class FileManager {\r\n private blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public getFakeFileWriter(mimeType: string, size: number, saveFileCallback?: (blob: Blob) => Promise) {\r\n let bytes: Uint8Array = new Uint8Array(size);\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array, offset: number) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n // sometimes file size can be bigger than the prov\r\n const endOffset = offset + part.byteLength;\r\n if(endOffset > bytes.byteLength) {\r\n const newBytes = new Uint8Array(endOffset);\r\n newBytes.set(bytes, 0);\r\n bytes = newBytes;\r\n }\r\n\r\n bytes.set(part, offset);\r\n },\r\n truncate: () => {\r\n bytes = new Uint8Array();\r\n },\r\n trim: (size: number) => {\r\n bytes = bytes.slice(0, size);\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(bytes, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n },\r\n getParts: () => bytes,\r\n replaceParts: (parts: typeof bytes) => {\r\n bytes = parts;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport blobConstruct from '../helpers/blob/blobConstruct';\r\nimport FileManager from './fileManager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob);\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, fileSize: number, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, fileSize, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\r\n return Promise.all(this.STORAGES.map((storage) => {\r\n storage.useStorage = enabled;\r\n\r\n if(!clearWrite) {\r\n return;\r\n }\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport readBlobAsUint8Array from \"../../helpers/blob/readBlobAsUint8Array\";\r\nimport deferredPromise, { CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { getWindowClients } from \"../../helpers/context\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { InputFileLocation, UploadFile } from \"../../layer\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport { RequestFilePartTask, deferredPromises, log } from \"./index.service\";\r\nimport timeout from \"./timeout\";\r\n\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then((requests) => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n getWindowClients().then((clients) => {\r\n for(const [clientId, promises] of deferredPromises) {\r\n if(!clients.find((client) => client.id === clientId)) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(clientId);\r\n }\r\n }\r\n });\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const task: Omit = {\r\n type: 'requestFilePart',\r\n payload: {\r\n docId: this.id,\r\n dcId: this.info.dcId,\r\n offset: alignedOffset,\r\n limit\r\n }\r\n };\r\n\r\n const taskId = JSON.stringify(task);\r\n (task as RequestFilePartTask).id = taskId;\r\n\r\n const windowClient = await getWindowClients().then((clients) => {\r\n if(!clients.length) {\r\n return;\r\n }\r\n\r\n return clients.find((client) => deferredPromises.has(client.id)) || clients[0];\r\n });\r\n\r\n if(!windowClient) {\r\n throw new Error('no window');\r\n }\r\n\r\n let promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n deferredPromises.set(windowClient.id, promises = {});\r\n }\r\n \r\n let deferred = promises[taskId] as CancellablePromise;\r\n if(deferred) {\r\n return deferred.then((uploadFile) => uploadFile.bytes);\r\n }\r\n \r\n windowClient.postMessage(task);\r\n this.loadedOffsets.add(alignedOffset);\r\n \r\n deferred = promises[taskId] = deferredPromise();\r\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\r\n\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error) => {\r\n if(error === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then((bytes) => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\r\n //log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n \r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n //setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers,\r\n });\r\n //}, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n //log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4',\r\n },\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport ctx from \"../../environment/ctx\";\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\nimport noop from \"../noop\";\r\n\r\nexport type DebounceReturnType = { \r\n (...args: Parameters): Promise>>; \r\n clearTimeout(): void; \r\n};\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n): DebounceReturnType {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n const invoke = (args: Parameters) => {\r\n const _resolve = resolve, _reject = reject;\r\n try {\r\n const result = fn.apply(null, args);\r\n _resolve(result);\r\n } catch(err) {\r\n console.error('debounce error', err);\r\n // @ts-ignore\r\n _reject(err);\r\n }\r\n };\r\n\r\n const debounce = (...args: Parameters) => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n invoke(args);\r\n hadNewCall = false;\r\n }\r\n\r\n const _waitingTimeout = ctx.setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n invoke(args);\r\n }\r\n \r\n // if debounce was called during invoking\r\n if(waitingTimeout === _waitingTimeout) {\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n }, ms);\r\n\r\n waitingTimeout = _waitingTimeout;\r\n waitingPromise.catch(noop);\r\n return waitingPromise;\r\n };\r\n\r\n debounce.clearTimeout = () => {\r\n if(waitingTimeout) {\r\n ctx.clearTimeout(waitingTimeout);\r\n reject();\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }\r\n };\r\n\r\n return debounce;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: (reason?: any) => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport default function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = noop;\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode, \r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], \r\n log?: string, \r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(let i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../../config/databases\";\r\nimport DATABASE_STATE from \"../../config/databases/state\";\r\nimport { IS_FIREFOX } from \"../../environment/userAgent\";\r\nimport deepEqual from \"../../helpers/object/deepEqual\";\r\nimport IDBStorage from \"../idb\";\r\nimport { log, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"./index.service\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n //user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T, \r\n storeName: typeof db['stores'][number]['name'], \r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n const cached = this.cache[key] ?? this.defaults[key];\r\n if(deepEqual(cached, value)) {\r\n return;\r\n }\r\n\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_lang: {\r\n push_message_nopreview: 'You have a new message',\r\n push_action_mute1d: 'Mute for 24H',\r\n push_action_settings: 'Settings'\r\n },\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'), \r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, clientList] = result;\r\n \r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n \r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch((reason) => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = {type: 'push_click', payload: data};\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n client.postMessage(pendingNotification);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nlet notifications: Set = new Set();\r\nlet pendingNotification: ServiceWorkerPushClickTask;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview;\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event && event.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(task: ServiceWorkerPingTask, event: ExtendableMessageEvent) {\r\n const client = event.ports && event.ports[0] || event.source;\r\n const payload = task.payload;\r\n\r\n if(pendingNotification &&\r\n client &&\r\n 'postMessage' in client) {\r\n client.postMessage(pendingNotification, []);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Database } from '.';\r\nimport type { IDBIndex } from '../../lib/idb';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs',\r\n // indexes: [\r\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\r\n // const name = `index_${idx}`;\r\n // const index: IDBIndex = {\r\n // indexName: name,\r\n // keyPath: name,\r\n // objectParameters: {}\r\n // };\r\n\r\n // return index\r\n // })\r\n // ]\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n \n \n \n\nimport type { Modify, WorkerTaskTemplate, WorkerTaskVoidTemplate } from '../../types';\nimport type { WebPushApiManager } from '../mtproto/webPushApiManager';\nimport type { PushNotificationObject } from './push';\nimport type { ToggleStorageTask } from '../mtproto/mtprotoworker';\nimport type { MyUploadFile } from '../mtproto/apiFileManager';\nimport { logger, LogTypes } from '../logger';\nimport { CancellablePromise } from '../../helpers/cancellablePromise';\nimport { CACHE_ASSETS_NAME, requestCache } from './cache';\nimport onStreamFetch from './stream';\nimport { closeAllNotifications, onPing } from './push';\nimport CacheStorageController from '../cacheStorage';\nimport { IS_SAFARI } from '../../environment/userAgent';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const deferredPromises: Map}> = new Map();\n\nexport interface RequestFilePartTask extends Modify {\n type: 'requestFilePart',\n payload: {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n }\n};\n\nexport interface RequestFilePartTaskResponse extends Modify {\n type: 'requestFilePart',\n payload?: MyUploadFile,\n originalPayload?: RequestFilePartTask['payload']\n};\n\nexport interface ServiceWorkerPingTask extends WorkerTaskVoidTemplate {\n type: 'ping',\n payload: {\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};\n\nexport interface ServiceWorkerNotificationsClearTask extends WorkerTaskVoidTemplate {\n type: 'notifications_clear'\n};\n\nexport interface ServiceWorkerPushClickTask extends WorkerTaskVoidTemplate {\n type: 'push_click',\n payload: PushNotificationObject\n};\n\nexport type ServiceWorkerTask = RequestFilePartTaskResponse | ServiceWorkerPingTask | ServiceWorkerNotificationsClearTask | ToggleStorageTask;\n\n \nconst taskListeners: {\n [type in ServiceWorkerTask['type']]: (task: any, event: ExtendableMessageEvent) => void\n} = {\n notifications_clear: () => {\n closeAllNotifications();\n },\n ping: (task: ServiceWorkerPingTask, event) => {\n onPing(task, event);\n },\n requestFilePart: (task: RequestFilePartTaskResponse, e: ExtendableMessageEvent) => {\n const windowClient = e.source as WindowClient;\n const promises = deferredPromises.get(windowClient.id);\n if(!promises) {\n return;\n }\n\n const promise = promises[task.id];\n if(promise) {\n if(task.error) {\n promise.reject(task.error);\n } else {\n promise.resolve(task.payload);\n }\n \n delete promises[task.id];\n }\n },\n toggleStorages: (task: ToggleStorageTask) => {\n const {enabled, clearWrite} = task.payload;\n CacheStorageController.toggleStorage(enabled, clearWrite);\n }\n};\nctx.addEventListener('message', (e) => {\n const task = e.data as ServiceWorkerTask;\n const callback = taskListeners[task.type];\n if(callback) {\n callback(task, e);\n }\n});\n \n\n//const cacheStorage = new CacheStorageController('cachedAssets');\n/* let taskId = 0;\n\nexport function getTaskId() {\n return taskId;\n}\n\nexport function incrementTaskId() {\n return taskId++;\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\n //log.debug('[fetch]:', event);\n \n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n }\n } catch(err) {\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting()); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME));\n event.waitUntil(ctx.clients.claim());\n});\n\nctx.onerror = (error) => {\n log.error('error:', error);\n};\n\nctx.onunhandledrejection = (error) => {\n log.error('onunhandledrejection:', error);\n};\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.',\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","oldGetScript","u","oldLoadScript","e","queryMap","Map","countMap","chunkId","has","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","set","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","toLowerCase","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","notifyServiceWorker","all","then","listeners","length","slice","forEach","_logTimer","bind","dT","toFixed","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","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","blobConstruct","blobParts","mimeType","blob","Array","isArray","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","constructor","blobSupported","this","isAvailable","getFakeFileWriter","size","saveFileCallback","bytes","Uint8Array","fakeFileWriter","write","part","offset","endOffset","byteLength","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","push","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","save","put","getFile","fileName","saveFile","Response","headers","callback","rejected","timeout","undefined","res","clearTimeout","getFileWriter","fileSize","fakeWriter","static","enabled","clearWrite","map","storage","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","url","promises","id","ignoreSearch","ignoreVary","clientId","deferredPromises","find","client","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","requestFilePartFromWorker","alignedOffset","limit","fromPreload","task","payload","docId","dcId","JSON","stringify","windowClient","deferred","uploadFile","add","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","value","finally","cancel","assign","deferredPromise","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","getChunkKey","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","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","getter","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","data","json","hasActiveWindows","checksPromise","muteUntil","clientList","nowTime","userInvisibleIsSupported","badge","reason","notificationPromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closePromise","closeAllNotifications","waitUntil","pendingNotification","focus","openWindow","baseUrl","getNotifications","len","taskListeners","notifications_clear","ping","ports","source","onPing","toggleStorages","toggleStorage","onFetch","origin","respondWith","file","fetch","clone","replace","random","requestCache","scope","params","exec","header","chunks","ranges","parseRange","parse","decodeURIComponent","stream","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onunhandledrejection","onoffline","ononline"],"sourceRoot":""} \ No newline at end of file diff --git a/public/version b/public/version index c0a48f587..df319cfc5 100644 --- a/public/version +++ b/public/version @@ -1 +1 @@ -1.5.0 (215) \ No newline at end of file +1.5.0 (216) \ No newline at end of file